PDA

Просмотр полной версии : ПЛК63 и МВ110-8АС



nebel
17.04.2017, 15:04
Здравствуйте! Помогите разобраться. Имеется в наличии ПЛК73 и модуль МВ110-8АС. Соединены по Modbus_RTU. Чтение параметров проходит, а вот запись нет.
Возможно ошибка в том что запись и чтение организовал через разные массивы.
В тексте программы:параметр (WORD) пытаюсь записать и читаю два параметра(Real и WORD( который пытаюсь записать)). Чтение происходит, а вот изменения нет.

PROGRAM modbus_read_and_write

VAR_INPUT

END_VAR

VAR_OUTPUT

END_VAR

VAR
RD_REGS:MB_RD_INP_REGS;
send_modbus: MB_WR_REGS;
RD_REGS1:MB_RD_INP_REGS;

Buffer: ARRAY[0..255] OF BYTE;
RD_Buffer: ARRAY[0..255] OF BYTE;

COM_SERVICE1: COM_SERVICE;
cmpl : BOOL;
port_opened: BYTE := 0;
Settings:COMSETTINGS;
enabl : BOOL;
err : INT;
TimeOut: TIME:=T#50ms;
ptr_D :POINTER TO BYTE;
ptr_f2 :POINTER TO BYTE;
DataSize :WORD;
WORK_IDENT :BYTE;
INP_WORD :WORD;
f1:WORD:=2;
TEMP:REAL;
out1 :REAL;
com_num :BYTE;


END_VAR


IF port_opened=0 THEN
Settings.Port:=com_num;
Settings.dwBaudRate:=9600;
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );


IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
IF port_opened=2 THEN

CASE WORK_IDENT OF
0:

RD_REGS(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=32 ,
FirstAddr:=288 ,
Quantity:=1,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=RD_Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );


IF cmpl AND err=0 THEN
ptr_D:=ADR(TEMP);
ptr_D^:=RD_Buffer[3];
ptr_D:=ptr_D+1;
ptr_D^:=RD_Buffer[2];
ptr_D:=ptr_D+1;
ptr_D^:=RD_Buffer[1];
ptr_D:=ptr_D+1;
ptr_D^:=RD_Buffer[0];
END_IF
IF cmpl THEN WORK_IDENT:=1;END_IF

1:

RD_REGS1(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=32 ,
FirstAddr:=0 ,
Quantity:=1,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=RD_Buffer ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );


IF cmpl AND err=0 THEN
out1:=BYTE_TO_WORD(RD_Buffer[1]) OR SHL(BYTE_TO_WORD(RD_Buffer[0]),8);
END_IF
IF cmpl THEN WORK_IDENT:=2;END_IF

2:

IF cmpl AND err=0 THEN

Buffer[3] := DWORD_TO_BYTE(f1);
Buffer[2] := DWORD_TO_BYTE( SHR(f1,8));
Buffer[1] := DWORD_TO_BYTE( SHR(f1,16));
Buffer[0] := DWORD_TO_BYTE( SHR(f1,24));

END_IF

send_modbus(
Enable:=enabl ,
Mode:=MB_RTU ,
DevAddr:=32 ,
FirstAddr:=0 ,
Quantity:=1,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer ,
Complete=>cmpl ,
Exception=>err,
RegCnt=>DataSize);

WORK_IDENT:=0;

END_CASE
END_IF


IF enabl = FALSE THEN
enabl := TRUE;
END_IF

IF err <> 0 THEN
enabl := FALSE;
END_IF