Тоже пробую разобраться с 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




Ответить с цитированием