Тоже пробую разобраться с modbus.lib.
На столе ПЛК-100 + МК110-8ДН-4Р
Пробую записать 48 регистр, а потом его прочитать. Не получается записать, ошибка сразу же (Err = 255). Конфигуратором пишет, читает. Не вижу затыка, хелп!
Код:
PROGRAM PLC_PRG
VAR
get1_modbus: MB_RD_HOLD_REGS; (*ôóíêöèÿ 03 - ÷òåíèå ïàðàìåòðà òèïà INT*)
get2_modbus: MB_RD_INP_REGS; (*ôóíêöèÿ 04 - ÷òåíèå òðåõ ïàðàìåòðîâ òèïà INT*)
get3_modbus: MB_RD_HOLD_REGS; (*ôóíêöèÿ 03 - ÷òåíèå ïàðàìåòðà òèïà Float*)
send2_modbus: MB_WR_REGS; (*ôóíêöèÿ 6 - çàïèñü ïàðàìåòðîâ*)
Buffer_out: ARRAY[0..255] OF BYTE; (* áàéòîâûé áóôåð äàííûõ *)
cmpl: BOOL;
port_opened: BYTE := 0;
Init: BOOL; (* ïðèçíàê èíèöèàëèçàöèè ïîëüçîâàòåëüñêîé ïðîãðàììû *)
Settings:COMSETTINGS; (* íàñòðîéêè ïîñëåäîâàòåëüíîãî ïîðòà *)
com_num: PORTS:=0; (*0 - RS-485, 1 - RS-232*)
enabl: BOOL:=TRUE; (*ñîñòîÿíèå ðàáîòû áëîêà*)
err: INT; (*íîìåð îøèáêè*)
TimeOut: TIME:=T#50ms; (*òàéìàóò*)
Exception: BYTE;
DataSize: WORD;
master1: BYTE:= 1;
TimeOut2 : TON;
t: DWORD; (*ïåðåìåííàÿ äëÿ îðãàíèçàöèè ñ÷åò÷èêà*)
A: WORD := 4; (*ñ÷åò÷èê*)
x:WORD; (*ñ÷èòàííîå çíà÷åíèå*)
x1: WORD; (*ïåðåìåííàÿ äëÿ çàïèñè ïî ñåòè*)
x2: WORD; (*ïåðåìåííàÿ äëÿ çàïèñè ïî ñåòè*)
x3: WORD; (*ïåðåìåííàÿ äëÿ çàïèñè ïî ñåòè*)
d: REAL; (*ñ÷èòàííîå çíà÷åíèå*)
f1:DINT:= 2;
ptr_f2:POINTER TO BYTE;
ptr_D:POINTER TO BYTE;
COM_SERVICE1: COM_SERVICE;
END_VAR
(*Óñòàíàâëèâàåì íàñòðîéêè COM-ïîðòà*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*íîìåð COM-ïîðòà*)
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 );
(*Åñëè COM-ïîðò îòêðûò, òî ïåðåõîäèì ê ïðèåìó è ïåðåäà÷è äàííûõ *)
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
IF port_opened=2 THEN (*Óäà÷íî ïðîèíèöèàëèçèðîâàëè*)
CASE master1 OF
0: (* ôóíêöèÿ 03 èíò - ÔÁ ñ÷èòûâàåò çíà÷åíèå ïàðàìåòðà òèïà int èç ïðèáîðà ñ àäðåñîì162 â ðåãèñòð ñ íîìåðîì 48 ïî ïðîòîêîëó Modbus-RTU*)
get1_modbus(
Enable:=enabl , (* ðàçðåøåíèå ðàáîòû áëîêà *)
Mode:=MB_RTU, (*ðåæèì ïåðåäà÷è*)
DevAddr:=16 , (*àäðåñ*)
FirstAddr:=48 , (*íîìåð ðåãèñòðà*)
Quantity:=1, (*êîëè÷åñòâî ðåãèñòðîâ*)
ComHandle:=Settings.Port , (*íîìåð COM-ïîðòà*)
TimeOut:=TimeOut , (*Òàéìàóò T#50ms*)
Buffer:=Buffer_out, (* áóôåð äàííûõ *)
Complete=>cmpl , (* ñêîïèðîâàòü ïðèçíàê çàâåðøåíèÿ îïåðàöèè *)
Exception=>err , (* ñêîïèðîâàòü ðåãèñòð îøèáîê *)
ByteCnt=>DataSize ); (*êîë-âî ñ÷èòàííûõ áàéòîâ *)
(*åñëè óñòàíîâëåí ïðèçíàê çàâåðøåíèÿ îïåðàöèè, òî *)
IF cmpl THEN
IF err=0 THEN (*Åñëè íåò îøèáîê, òî ïîëó÷àåì äàííûå èç áóôåðà òèïà INT*)
x:=BYTE_TO_WORD(BUFFER_out[1]) OR SHL(BYTE_TO_WORD(BUFFER_out[0]),8);
enabl := FALSE;
END_IF
END_IF
1: (* ôóíêöèÿ 16 - çàïèñü ïàðàìåòðîâ òèïà Int (ðåãèñòð 48) ïðèáîð ñ àäðåñîì 16 *)
(*çàïèñü â áóôôåð ïàðàìåòðà òèïà INT*)
ptr_f2:=ADR(A);
Buffer_out[1]:=ptr_f2^;
ptr_f2:=ptr_f2+1;
Buffer_out[0]:=ptr_f2^;
send2_modbus(
Enable:= enabl, (* ðàçðåøåíèå ðàáîòû áëîêà *)
Mode:=MB_RTU , (*ðåæèì ïåðåäà÷è*)
DevAddr:=16 , (*àäðåñ*)
FirstAddr:= 48, (*íîìåð ðåãèñòðà*)
Quantity:= 1, (*êîëè÷åñòâî çàïèñûâàåìûõ ðåãèñòðîâ*)
ComHandle:=Settings.Port ,(*íîìåð ñîì-ïîðòà*)
TimeOut:=TimeOut , (*òàéìàóò T#50ms*)
Buffer:=Buffer_out , (* áóôåð äàííûõ *)
Complete=>cmpl , (* ñêîïèðîâàòü ïðèçíàê çàâåðøåíèÿ îïåðàöèè *)
Exception=>err , (* ñêîïèðîâàòü ðåãèñòð îøèáîê *)
RegCnt=> DataSize); (*êîë-âî ñ÷èòàííûõ áàéòîâ *)
(*åñëè óñòàíîâëåí ïðèçíàê çàâåðøåíèÿ îïåðàöèè, òî *)
IF cmpl THEN
IF err =0 THEN
master1:=2;(*ïåðåõîäèì ê âûïîëíåíèþ ñëåäóþùåãî áëîêà*)
END_IF
END_IF
2:
TimeOut2(IN :=TRUE,PT:=T#5ms);
TimeOut2;
IF TimeOut2.Q THEN
master1 := 0;
END_IF
END_CASE
END_IF