PDA

Просмотр полной версии : ПЛК63 и RS485



Nick_V1
05.10.2011, 20:25
Не могу связать ПЛК63 и измеритель мощности Ц301 по интерфейсу rs485
Для написании программы использовал пример из документации которая шла с диском.
Помогите примером работы с rs485 для ПЛК63

ASo
05.10.2011, 20:29
Пожалуйста
Вот пример (не полный) работы с ЧРП

PROGRAM InitComPort
VAR
COM_SERVICE1: COM_SERVICE;
END_VAR
IF ComPortState = 0 THEN
Settings.Port:= 0; (*номер COM-порта*)
Settings.dwBaudRate:=9600; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

IF ComPortState <> 2 THEN
(*Открываем COM-порт*)
COM_SERVICE1(Enable:=(ComPortState=0) , Settings:=Settings , Task:=OPEN_TSK );

(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready THEN
ComPortState:= 2;
END_IF
END_IF


PROGRAM ExModbus
VAR
SendModbus1: MB_RD_COILS;
SendModbus2: MB_WR_SNG_REG;
SendModbus3: MB_WR_SNG_COIL;
SendModbus4: MB_RD_HOLD_REGS;
SendModbus5: MB_WR_REGS;
ES: BOOL:= TRUE;
TimeOut: TIME:= T#150ms;
Buffer: ARRAY[0..255] OF BYTE;
ErrorSend1: ARRAY[1..4] OF BYTE;
ErrorSend2: ARRAY[1..4] OF BYTE;
ErrorSend3: ARRAY[1..4] OF BYTE;
ErrorSend4: BYTE;
ErrorSend5: BYTE;
Stage: BYTE:= 1;
EndSendStored: BOOL;
EndSendError: BOOL:= FALSE;
HavePause:TON;
SpeedTmp: DWORD;
Speed: WORD;
END_VAR

IF ComPortState = 2 THEN
IF NOT EndSendStored THEN
CASE Stage OF
1: SendModbus1(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
FirstAddr:= 40,
Quantity:= 8,
ComHandle:= Settings.Port,
TimeOut:= Timeout,
Buffer:= Buffer);
IF SendModbus1.Complete THEN
EndSendStored:=TRUE;
ErrorSend1[1]:= SendModbus1.Exception;
IF ErrorSend1[1] = 0 THEN
AHU_CONT:= BYTE_TO_BOOL(Buffer[0] AND 8);
ELSE
AHU_CONT:= FALSE;
EndSendError:= TRUE;
Stage:= 4;
END_IF;
END_IF;
2: CASE FanSpeed OF
0: SpeedTmp:= (AHU_Speed1 - 25)*16#4000;
1: SpeedTmp:= (AHU_Speed2 - 25)*16#4000;
2: SpeedTmp:= (AHU_Speed3 - 25)*16#4000;
END_CASE;
Speed:= DWORD_TO_WORD(SpeedTmp / 75);
SendModbus2(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
RegAddr:= 50009,
Value:= Speed,
ComHandle:= Settings.Port,
TimeOut:= Timeout);
IF SendModbus2.Complete THEN
EndSendStored:=TRUE;
ErrorSend2[1]:= SendModbus2.Exception;
END_IF;
3: SendModbus3(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 1,
CoilAddr:= 6,
Value:= AHU_START,
ComHandle:= Settings.Port,
TimeOut:= Timeout);
IF SendModbus3.Complete THEN
EndSendStored:=TRUE;
ErrorSend3[1]:= SendModbus3.Exception;
END_IF;
4: SendModbus1(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 2,

END_CASE;
ES:= FALSE;
ELSE
IF EndSendError THEN
EndSendError:= FALSE;
ES:= TRUE;
EndSendStored:= FALSE;
ELSE
HavePause(IN:= EndSendStored,PT:=T#100ms);
IF HavePause.Q THEN
ES:= TRUE;
EndSendStored:= FALSE;
IF Stage >= 14 THEN
Stage:= 1;
ELSE
Stage:= Stage+1;
END_IF;
END_IF;
END_IF;
END_IF;
HavePause(IN:= EndSendStored,PT:=T#100ms);
END_IF;

Nick_V1
05.10.2011, 21:08
Спасибо, попробую

Nick_V1
05.10.2011, 21:11
Подскажите пожалуйста, где можно найти описание библиотеки ComService.lib

ASo
05.10.2011, 21:18
Эта библиотека состоит из одной функции.
Посмотрите ее содержимое и параметр в library manager

Филоненко Владислав
08.10.2011, 08:29
Ошибки:
1. Если порт не откроется, то надо его закрыть и снова открыть. Иначе после первого же обновления в ходе отладки все перестанет работать.
2.
Два некогерентных условия:
IF ComPortState = 0 THEN
и
IF ComPortState <> 2 THEN
порт может открыться с непроинициализированными параметрами
3.

4: SendModbus1(
Enable:= ES,
Mode:= MB_RTU,
DevAddr:= 2,- Мыши погрызли?

END_CASE;

ASo
08.10.2011, 11:34
1, 2, 3. Ну почему. Этот POU выполняется по сути 1 или 2 раза при запуске ПЛК. А ПЛК63 по сути всегда выполняет холодный старт при обновлении программы (?)
4. Угу. Компьютерные 3-хмерные.
Идея понятна. Концовка показывает, что в цикле 14 обращений к MODBUS. Есть смысл указывать все?

Филоненко Владислав
10.10.2011, 09:22
Один, не один - должно быть правильно. Даже если в конкретный момент код и работает из-за side-эффектов, то завтра его перенесут на другой ПЛК и возникнут никому не нужные проблемы в "работающем" коде.

Nick_V1
11.10.2011, 21:42
Всем большое спасибо,хорошо что есть такой форум

AndreyS
14.11.2011, 18:23
Ошибки:
1. Если порт не откроется, то надо его закрыть и снова открыть. Иначе после первого же обновления в ходе отладки все перестанет работать.


А как именно надо определять условие того, что порт не открылся или после обновления в ходе отладки всё перестало работать?
Что необходимо мониторить?