PDA

Просмотр полной версии : Библиотека ModBus



CSharp
17.03.2014, 10:42
PROGRAM PLC_PRG
VAR
get1_modbus: MB_RD_HOLD_REGS;
t: DWORD;
a: WORD:=0;
port_opened: BYTE:=0;
Settings: COMSERICE.SysCom.COM_Settings;
SettingsEx: COMSERICE.SysCom.COM_SettingsEx;
Com_service1:Com_service;
master1: BYTE:=1;
enabl: BOOL;
TimeOut: TIME:=T#50ms;
Buffer: ARRAY [0..255] of byte;
Complete: BOOL;
err: INT;
Exception: INT;
ByteCnt: WORD;
cmpl: BOOL;
x: WORD;
DataSize: BYTE;
TempWateOutMB: REAL;
ptr_D: POINTER TO BYTE;
END_VAR


IF port_opened=0 THEN
Settings.sPort:=1;
Settings.ulBaudRate:=115200;
Settings.byParity:=0;
Settings.ulTimeOut:=0;
Settings.byStopBits:=0;
Settings.ulBufferSize:=0;
SettingsEx.byByteSize:=8;
SettingsEx.bBinary:=TRUE;
COM_SERVICE1(Enable:=(port_opened=0), Settings:=Settings, (*sets_ex:=Setting*****) Task:=OPEN_TSK);
END_IF
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
IF port_opened=2 THEN
get1_modbus(
Enable:=enabl,
Mode:=MB_RTU,
DevAddr:=1,
FirstAddr:=4,
Quantity:=2,
ComHandle:=Settings.sPort,
TimeOut:=TimeOut,
Buffer:=Buffer,
Complete=>cmpl,
Exception=>err,
ByteCnt=>DataSize);
IF cmpl THEN
IF err=0 THEN
ptr_D:=ADR(TempWateOutMB);
ptr_D^:=buffer[3];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[2];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[1];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[0];
END_IF
END_IF
IF enabl=FALSE THEN
enabl:=TRUE;
END_IF
IF err<>0 THEN
enabl:=FALSE;
END_IF
END_IF

ПЛК 304, всегда ошибка 255 и светодиод не мигает на обмене.

DeMax
17.03.2014, 15:04
Порт СОМ1 - это Settings.sPort:=2, а у тебя Settings.sPort:=1. Попробуй поправить, должно помочь

rescom
17.03.2014, 23:01
У меня тоже похожая проблема. ПЛК 323 + ТРМ 202.
При попытке запустить данную программу на ПЛК 323 и сменив порт на Settings.sPort:=2, она вообще зависает и снимается только по WatchDog. :(

PS: ТРМ точно рабочий. Родная софтина его читает через конвертер COM=>RS-485.

DeMax
19.03.2014, 10:10
А без использования ComService работает?
Вот небольшой фрагмент:
12292
Реализация алгоблока для опроса ИВК-101
FUNCTION_BLOCK IVK
VAR_INPUT
Handle:DWORD;
EN:BOOL;
END_VAR
VAR_OUTPUT
LINK_FLT:BOOL;
FLOW:REAL;
VOLUME:REAL;
END_VAR
VAR
Get_Vol: MB_RD_INP_REGS;
Get_Flow: MB_RD_INP_REGS;
Buffer: ARRAY [0..255] OF BYTE;
cmpl: BOOL;
STAGE: BYTE:=0;
err:INT;
DataSize, X1,X2:INT;
ptr_D, ptr_D1: POINTER TO BYTE;
v:DINT;
d,d1:REAL;
enabl: BOOL;
END_VAR


IF EN = TRUE THEN
CASE STAGE OF
0:
Get_Flow(
Enable:=enabl,
Mode:=0,
DevAddr:=1,
FirstAddr:=49424,
Quantity:=2,
ComHandle:=Handle,
TimeOut:=T#500MS,
Buffer:=Buffer,
Complete=>cmpl,
Exception=>err,
ByteCnt=>DataSize);
IF cmpl THEN
IF err=0 THEN
LINK_FLT:=FALSE;
ptr_D:=ADR(d);
ptr_D^:=Buffer[3];
ptr_D:=ptr_D+1;
ptr_D^:=Buffer[2];
ptr_D:=ptr_D+1;
ptr_D^:=Buffer[1];
ptr_D:=ptr_D+1;
ptr_D^:=Buffer[0];
FLOW:=d*1.44;
ELSE LINK_FLT:=TRUE;
END_IF
STAGE := 1;
END_IF
1:
Get_Vol(
Enable:=enabl,
Mode:=0,
DevAddr:=1,
FirstAddr:=33040,
Quantity:=4,
ComHandle:=Handle,
TimeOut:=T#500MS,
Buffer:=Buffer,
Complete=>cmpl,
Exception=>err,
ByteCnt=>DataSize);
IF cmpl THEN
IF err=0 THEN
LINK_FLT := FALSE;
X1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
X2:=BYTE_TO_WORD(BUFFER[3]) OR SHL(BYTE_TO_WORD(BUFFER[2]),8);
v:=WORD_TO_DINT(X2) OR SHL(WORD_TO_DINT(X1),16);
ptr_D1:=ADR(d1);
ptr_D1^:=Buffer[7];
ptr_D1:=ptr_D1+1;
ptr_D1^:=Buffer[6];
ptr_D1:=ptr_D1+1;
ptr_D1^:=Buffer[5];
ptr_D1:=ptr_D1+1;
ptr_D1^:=Buffer[4];
VOLUME:=DINT_TO_REAL(v)+d1;
ELSE LINK_FLT := TRUE;
END_IF
STAGE := 0;
END_IF
END_CASE
IF enabl = FALSE THEN
enabl := TRUE;
END_IF
IF err <> 0 THEN
enabl := FALSE;
LINK_FLT := TRUE;
END_IF
END_IF