Вход

Просмотр полной версии : ПЛК 154 + ModBus проблема



Леонид
02.11.2010, 11:33
При добавления в конфигурацию модуля ModBus проект компилируется, но после зашивки контроллера и подключении онлайн выдает ошибку.Контроллер в режиме слейв не отвечает, в режиме мастер не спрашивает !!??
Результат. Не могу связать плк с ип 320.

PLCInfo
PLC model MODEL PLC 154
Binary VERSION 2.10.4
Need Target version 2.10
Compiled: 10:57:13 Apr 14 2009
MAC 6A:77:00:20:C0:8A
IP 192.168.1.1
GATE 10.0.6.1
MASK 255.255.255.0
PIC upper version is 07
Licence unlimited
Current DAC
PIC lower version is 0a

Николаев Андрей
02.11.2010, 11:52
а форум почитать???:mad: :mad: :mad:
вставьте кабель для панели. перезагрузите плк.

Леонид
02.11.2010, 12:13
Форум читал. Если не увидел чего, прошу прощения!
Контроллер перезагружал неоднократно!
Не понятен коментарий!!!
"вставьте кабель для панели. перезагрузите плк."
вместо панели начал исспользовать программу для мониторига Modbus с компьютера.
Что означает эта ошибка?

После серии эксперементов и перепрошивки плк на версию 2.10.5, определил, что проблема с портом debug rs 232 и не только по modbus, а и по овен !!!!

Николаев Андрей
03.11.2010, 17:09
Эээх...
Порт Debug 232 работает в двух режимах:
1. Для программирования ПЛК.
2. Как порт для обмена ПЛК с кем то.

Режим работы порта определяется при включении питания ПЛК - типом кабеля, который вставлен в вышеуказанны разъем.
Это даже в документации написано...

Леонид
04.11.2010, 00:58
Разобрался с портом Debug-RS232 !!!
Спасибо за подсказку !!!
Документацию прочитал, но про то что выбор протокола происходи при включении ПЛК не нашел!
Так что теперь для эксперементов подключил ИП 320 обычным кабелем "с перемычкой" для зашивки и все "ОК" :) .
Только при одинаковых настройках скорости обмена, по rs232 как то чуть-чуть медленнее обновляются данные, чем по rs485, но это лирика

Пьер
04.10.2022, 23:39
С помощью б. Modbus.lib пытаюсь соединить
ПЛК 100 с платой управления от стороннего прибора.
Сразу скажу, Эта плата очень хорошо работает ОРС сервером мастер скада.
У меня получилось вкл/выкл. Но считать состояния битов не могу

PROGRAM PLC_PRG
VAR
RHR: MB_RD_HOLD_REGS; (*функция 03 - чтение параметра типа INT*)
RIR:MB_RD_INPUTS; (*функция 02 - чтение статуса дискр вх.*)
WrR: MB_WR_SNG_REG; (*функция 6 - запись еденичного регистра*)
WrCoil: MB_WR_SNG_COIL; (*функция 5 - запись еденичного дискр вх. бита*)

Buffer1: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
Buffer2: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
Buffer3: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
Buffer4: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)



cmpl: BOOL; (*признак завершенности работы функции*)
port_opened: BYTE := 0; (*результат открытия порта*)
Settings:COMSETTINGS; (* настройки последовательного порта *)
com_num: PORTS:=0; (*0 - 485-1
1 - 232 - COM1
2 - 485-2 - COM2
4 - DBGU - COM4 *)


enable: BOOL; (*состояние работы блока*)
err: INT; (*номер ошибки*)
TimeOut: TIME:=T#500ms; (*таймаут*)
DataSize: WORD; (*кол-во считанных байтов *)
ptr_byte:POINTER TO BYTE; (*указатель на тип byte*)
COM_SERVICE1: COM_SERVICE;
state: WORD := 0; (*состояние*)

END_VAR

-----------------------------------------------------------------------------------------------------------------
(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта RS485*)
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


RIR(
Enable:=enable , (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=1 , (*адрес №1 *)
FirstAddr:=0 , (*номер регистра*)
Quantity:=31 , (*количество регистров*)
ComHandle:=Settings.Port , (*номер COM-порта*)
TimeOut:=TimeOut , (*Таймаут *)
Buffer:=Buffer1 , (* буфер данных *)
Complete=>cmpl , (* признак завершения операции *)
Exception=>err , (* регистр ошибок Исключения протокола MODBUS или ошибки:0x00 – ошибок или исключений не обнаружено, 0xFE – аппаратная ошибка ПЛК,0xFF – ошибка таймаута *)
ByteCnt=>DataSize ); (*кол-во считанных байтов *)

ссылка к документу на плату док (https://dropmefiles.com/uVZaj)
Пробовал считывать разными функциями.
По документу на плату мне надо считать POWER 0x00 Вентилятор вкл выкл R/W - записать функцией 05 получилось, но считать не могу. Буффер считывания в одном состоянии всегда, чтобы я там не записывал.
Мне надо считать состояние битов POWER(вентилятор), COOL(насос), впускной клапан, сливной клапан.

Адрес Описание 1 0 Чтение / запись Примечание
0x00 Вентилятор вкл выкл R/W
0x01 Насос вкл выкл R/W
0x02 Свободно
0x03 Свободно
0x04 Свободно
0x05 Свободно
0x06 Свободно
0x07 Свободно
0x08 Свободно
0x09 Сливной клапан откр закр R/W
0x0a Свободно
0x0b Свободно
0x0c Свободно
0x0d Свободно
0x0e SWING вкл закр R/W
0x0f Свободно
0x10 Медленное заполнение наличие отсутствие R
0x11 Переполнение наличие отсутствие R
0x12 Свободно
0x13 Свободно
0x14 Медленный слив наличие отсутствие R
0x15 Свободно
0x16 Свободно
0x17 Свободно
0x18 Свободно
0x19 Впускной клапан Откр Закр R
0x1a Сливной клапан открыт Откр закр R
0x1b Свободно
0x1c Ошибка вентилятора R
0x1d Низкий уровень наличие отсутствие R
0x1e Средний уровень наличие отсутствие R
0x1f Верхний уровень наличие отсутствие R


Скидываю фотки мастер скады ОРС. Там все считывается и записывается без проблем.

kondor3000
05.10.2022, 00:56
В биб-ке вы используете WrCoil: MB_WR_SNG_COIL; (*функция 5 - запись еденичного дискр вх. бита*)
то есть бит записываете, а где чтение бита функцией 0х01 ?
На вашем месте я бы начал с конфигурации и разобрался чем чтение, запись битов отличается от чтения, записи регистров.
И сколько надо прочитать регистров, в которых 32 бита ( и зачем вы читаете 31 регистр?)
Как разложить регистр на биты и из битов собрать регистр.

Пьер
05.10.2022, 10:35
В биб-ке вы используете WrCoil: MB_WR_SNG_COIL; (*функция 5 - запись еденичного дискр вх. бита*)
то есть бит записываете, а где чтение бита функцией 0х01 ?
На вашем месте я бы начал с конфигурации и разобрался чем чтение, запись битов отличается от чтения, записи регистров.
И сколько надо прочитать регистров, в которых 32 бита ( и зачем вы читаете 31 регистр?)
Как разложить регистр на биты и из битов собрать регистр.
Бит я читаю фун-ей 01, но суть в том что что значения в буфере не изменяются вообще . Записываю бит ф-ей 05 . Т.е. как записал, потом считываю 01. При записи меняю ноль на единицу и наоборот. А когда считываю буфер, то он в одном положении, значения не изменяются.

Пьер
05.10.2022, 23:49
Блок из программы


Это чтение не работает. Т.е. я считываю наличие воды, есть вода или нет, в буфере всегда одно и тоже при чтении.

RIRs( (*Чтение содержания входных регистров (0x04) Read Input Registers*)
Enable:=enable3 , (*вручную включаю на 1 сек., чтобы отправить данные rr1 и rr2*)
Mode:=MB_RTU ,
DevAddr:=1 ,
FirstAddr:=rr1 , (*Задаю 29 адрес*)
Quantity:=rr2 , (*Всего 1 регистр*)
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer1 , (*в буфере , в массиве, [1, 4, 0, ,29, 0, 1, 161, 204], значение массива [5] меняется и равно значению rr2, а значение [4] всегда 0*)
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );
Прилагаю фото, что через орс сервер мастер скады у меня читает этот регистр. В нем информация 1 или 0.





По другим блокам:


Здесь включаю вентилятор. Этой командой вентилятор включается. АДрес 0. Выкладываю картинку из мастер скады. в ней все работает.
WrCoil(
Enable:=enable2 ,
Mode:=MB_RTU ,
DevAddr:=1 ,
CoilAddr:=V2 , (*адрес 0*)
Value:=Sh_1 ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err );

но считать этот coil я не могу
RCoils( (*Чтение статуса дискретных выходов (0x01) Read Coils*)
Enable:=enable ,
Mode:=MB_RTU ,
DevAddr:=1 ,
FirstAddr:=rc1 , (*Задаю адрес 0*)
Quantity:=rc2 , (*количество 1*)
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer1 ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );


Такая же с регистром данных, где частота.


Задать могу.
WrR(
Enable:=enable4 ,
Mode:=MB_RTU ,
DevAddr:=1 ,
RegAddr:=reg1 ,(*Здесь задаю регистр 3 *)
Value:=ch1 ,(*значение частоты*)
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err );

Считать никак не получается
В массиве значение не меняется в зависимости от заданной и записанной частоты
RHR( (*Чтение содержания регистров (0x03) Read Holding Registers *)
Enable:=enable5 ,
Mode:=MB_RTU ,
DevAddr:=1 ,
FirstAddr:=3 ,
Quantity:=1 ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer2 ,
Complete=>cmpl ,
Exception=>err ,
ByteCnt=>DataSize );


И программа сама, все enable задаю вручную.

PROGRAM PLC_PRG
VAR
RHR: MB_RD_HOLD_REGS; (*ôóíêöèÿ 03 - ÷òåíèå ïàðàìåòðà òèïà INT*)
RIR:MB_RD_INPUTS; (*ôóíêöèÿ 02 - ÷òåíèå ñòàòóñà äèñêð âõ.*)
RCoils:MB_RD_COILS;
WrR: MB_WR_SNG_REG; (*ôóíêöèÿ 6 - çàïèñü åäåíè÷íîãî ðåãèñòðà*)
WrCoil: MB_WR_SNG_COIL; (*ôóíêöèÿ 5 - çàïèñü åäåíè÷íîãî äèñêð âõ. áèòà*)
RIRs:MB_RD_INP_REGS;

Buffer1: ARRAY[0..255] OF BYTE; (* áàéòîâûé áóôåð äàííûõ *)
Buffer2: ARRAY[0..255] OF BYTE; (* áàéòîâûé áóôåð äàííûõ *)
Buffer3: ARRAY[0..255] OF BYTE; (* áàéòîâûé áóôåð äàííûõ *)
Buffer4: ARRAY[0..255] OF BYTE; (* áàéòîâûé áóôåð äàííûõ *)



cmpl: BOOL; (*ïðèçíàê çàâåðøåííîñòè ðàáîòû ôóíêöèè*)
port_opened: BYTE := 0; (*ðåçóëüòàò îòêðûòèÿ ïîðòà*)
Settings:COMSETTINGS; (* íàñòðîéêè ïîñëåäîâàòåëüíîãî ïîðòà *)
com_num: PORTS:=0; (*0 - 485-1
1 - 232 - COM1
2 - 485-2 - COM2
4 - DBGU - COM4 *)


enable: BOOL; (*ñîñòîÿíèå ðàáîòû áëîêà*)
err: INT; (*íîìåð îøèáêè*)
TimeOut: TIME:=T#500ms; (*òàéìàóò*)
DataSize: WORD; (*êîë-âî ñ÷èòàííûõ áàéòîâ *)
ptr_byte:POINTER TO BYTE; (*óêàçàòåëü íà òèï byte*)
COM_SERVICE1: COM_SERVICE;
state: WORD := 0; (*ñîñòîÿíèå*)


(*ñ÷èòàííîå çíà÷åíèå*)
status2:WORD;
real2: REAL;
real3: REAL;
status3: WORD;
real4: REAL;
status4: WORD;
real5: REAL;
status5: WORD;
real6: REAL;
status6: WORD;
real7: REAL;
status7: WORD;
real8: REAL;
status8: WORD;
wrd1: WORD:=1;
wrd_rele_0:WORD:=0;
t21: WORD := 0; (* *)
t12: WORD; (* *)
t14: WORD; (* *)
t15: WORD; (* *)
t17: WORD; (* *)
t16: WORD; (* *)
t18: WORD; (* *)
t19: WORD; (* *)
t20: WORD; (* *)
t25: WORD; (* *)
t13: WORD := 0;(* *)
t22: WORD; (* *)
t22_2: WORD := 0; (* *)
t24: WORD := 0; (* *)
t24_2: WORD := 0; (* *)
wrd_out_tok: WORD := 0;
t30: WORD;
count_err_30: WORD;
RT_t1:R_TRIG;
In_1: WORD;
Sh_1:BOOL;
Sh_2:BOOL;
Sh_3:BOOL;
Sh_4:BOOL;
V1:WORD;
V2:WORD;
V3:WORD;

enable2: BOOL;
enable3: BOOL;
enable4: BOOL;
enable5: BOOL;
ch1: WORD;
reg1: WORD;
rc1: WORD;
rc2: WORD;
rr1: WORD;
rr2: BYTE;
END_VAR
+++++++++++++++++++++++++++++++++++++++++++++++++
IF port_opened=0 THEN
Settings.Port:=com_num; (*????? COM-????? RS485*)
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



RCoils(
Enable:=enable , (* ?????????? ?????? ????? *)
Mode:=MB_RTU , (*????? ????????*)
DevAddr:=1 , (*????? ?1 *)
FirstAddr:=rc1 , (*????? ????????*)
Quantity:=rc2 , (*?????????? ?????????*)
ComHandle:=Settings.Port , (*????? COM-?????*)
TimeOut:=TimeOut , (*??????? *)
Buffer:=Buffer1 , (* ????? ?????? *)
Complete=>cmpl , (* ??????? ?????????? ???????? *)
Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
ByteCnt=>DataSize ); (*???-?? ????????? ?????? *)
RIRs(
Enable:=enable3 , (* ?????????? ?????? ????? *)
Mode:=MB_RTU , (*????? ????????*)
DevAddr:=1 , (*????? ?1 *)
FirstAddr:=rr1 , (*????? ????????*)
Quantity:=rr2 , (*?????????? ?????????*)
ComHandle:=Settings.Port , (*????? COM-?????*)
TimeOut:=TimeOut , (*??????? *)
Buffer:=Buffer1 , (* ????? ?????? *)
Complete=>cmpl , (* ??????? ?????????? ???????? *)
Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
ByteCnt=>DataSize ); ;
RT_t1(CLK:=RIRs.Complete , Q=> );
IF RT_t1.Q THEN
t24:=Buffer1[4]+Buffer1[5];
END_IF

IF RCoils.Complete THEN
v1:=1;
END_IF

WrCoil(
Enable:=enable2 ,
Mode:=MB_RTU ,
DevAddr:=1 ,
CoilAddr:=V2 ,
Value:=Sh_1 ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err );
WrR(
Enable:=enable4 ,
Mode:=MB_RTU ,
DevAddr:=1 ,
RegAddr:=reg1 ,
Value:=ch1 ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err );

RHR(
Enable:=enable5 , (* ?????????? ?????? ????? *)
Mode:=MB_RTU , (*????? ????????*)
DevAddr:=1 , (*?????*)
FirstAddr:=3 , (*????? ????????*)
Quantity:=1 , (*?????????? ?????????*)
ComHandle:=Settings.Port , (*????? COM-?????*)
TimeOut:=TimeOut , (*??????? *)
Buffer:=Buffer2 , (* ????? ?????? *)
Complete=>cmpl , (*??????? ?????????? ???????? *)
Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
ByteCnt=>DataSize );

kondor3000
06.10.2022, 08:49
У вас есть 32 БИТа (с 0 по 31), они занимают всего 2 регистра, адреса 0 и 1 (4 байта). Пишу уже второй раз сделайте в конфигурции, добавив 4 шт 8Bit Input для чтения
и 4 шт 8Bit Output для записи. В разных UMD (Универсал модбас девайс). В UMD для записи поставьте настройку By Value Change. Функция чтения 0x01 выставляется в настройках блока 8 bit input.
63005
29 бит (Coil ) это регистр с адресом 1, бит 13.
Если вы читаете биты используйте 01 функцию, если читаете регистры, то функция 03 - холдинг регистры, 04 - инпут регистры
Биты это не регистры, функции 03, 04, 06 выкиньте вообще из программы. Проект выкладывайте полностью, а не кусками как вы.
И скрины нужны работы программы, а не сервера.

Пьер
06.10.2022, 22:56
У вас есть 32 БИТа (с 0 по 31), они занимают всего 2 регистра, адреса 0 и 1 (4 байта). Пишу уже второй раз сделайте в конфигурции, добавив 4 шт 8Bit Input для чтения
и 4 шт 8Bit Output для записи. В разных UMD (Универсал модбас девайс). В UMD для записи поставьте настройку By Value Change. Функция чтения 0x01 выставляется в настройках блока 8 bit input.
63005
29 бит (Coil ) это регистр с адресом 1, бит 13.
Если вы читаете биты используйте 01 функцию, если читаете регистры, то функция 03 - холдинг регистры, 04 - инпут регистры
Биты это не регистры, функции 03, 04, 06 выкиньте вообще из программы. Проект выкладывайте полностью, а не кусками как вы.
И скрины нужны работы программы, а не сервера.
Вот ссылка (https://disk.yandex.ru/i/SJJnDPkyZXfFdA) на программу, всегда ошибка связи 81. Это если собирать по конфигуратору.

Через библиотеку Modbus вот программа текст. При чтении coils по 01 ошибка тймаута 255. Изменял таймаут от 10 мс до 2 сек , все равно ошибка, и данные в буфер не падают. Но отправить данные могу.


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 );
port_opened:=2;
END_IF

IF port_opened=2 THEN
RCoils(
Enable:=enable6 ,
Mode:=MB_RTU ,
DevAddr:=1 ,
FirstAddr:=rc1 ,
Quantity:=rc2 ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Buffer:=Buffer10 ,
Complete=>cmpl1 ,
Exception=>err1 ,
ByteCnt=>DataSize );

IF cmpl1 THEN
t30:=RCoils.Exception;
IF RCoils.Exception=0 THEN



ptr_byte:=ADR(In_1);
ptr_byte^:=buffer10[4];
ptr_byte:=ptr_byte+1;
ptr_byte^:=buffer10[5];
(*ptr_byte:=ptr_byte+1;
ptr_byte^:=buffer10[3];
ptr_byte:=ptr_byte+1;
ptr_byte^:=buffer10[2];*)

enable6 := FALSE;

ss:=FALSE;

ELSE t14:=t14+1;
;
END_IF
END_IF

END_IF

kondor3000
06.10.2022, 23:52
Вот ссылка (https://disk.yandex.ru/i/SJJnDPkyZXfFdA) на программу, всегда ошибка связи 81. Это если собирать по конфигуратору.

Через библиотеку Modbus вот программа текст. При чтении coils по 01 ошибка тймаута 255. Изменял таймаут от 10 мс до 2 сек , все равно ошибка, и данные в буфер не падают. Но отправить данные могу.


Вы даже по написанному не можете сделать или очень невнимательны.
Написано поставить By Value Change для записи, вы её воткнули для чтения. На вашем скрине сервера 2 стоп бит, а в программе 1 стоп бит. Поэтому и ошибка.
Написано для чтения в параметрах каждого модуля поставить функцию 01, у вас на первом модуле осталось 02.
На 3 модуле вместо 1 регистра осталось 0.
На скрине всё для вас подписал, где чтение, где запись и номера битов и регистров.

В программе с библиотекой одни ошибки, не трогайте пока её. Вы вообще не понимаете, что делаете. (Вкратце нужно читать биты, а вы из байт пытаетесь собрать FLOAT, мало того из разных байт относящихся к разным FLOAT).

Пьер
07.10.2022, 00:38
Вы даже по написанному не можете сделать или очень невнимательны.
Написано поставить By Value Change для записи, вы её воткнули для чтения. Поэтому и ошибка.
Написано для чтения в параметрах каждого модуля поставить функцию 01, у вас на первом модуле осталось 02.
На 3 модуле вместо 1 регистра осталось 0.
На скрине всё для вас подписал, где чтение, где запись и номера битов и регистров.

В программе с библиотекой одни ошибки, не трогайте пока её. Вы вообще не понимаете, что делаете. (Вкратце нужно читать биты, а вы из байт пытаетесь собрать FLOAT, мало того из разных байт относящихся к разным FLOAT).

Программу переделал
вот ссылка (https://disk.yandex.ru/i/ZN63Hdpof_LOOw) на орс сервер, там считывают 02 команда DisInputs
вот на программу (https://disk.yandex.ru/i/QUtvSk2NRHgiIQ), вроде все правильно

kondor3000
07.10.2022, 00:48
Почти правильно, осталось поменять в RS485, 1 стоп бит на 2 стоп бит. Выше дописал уже.

Ещё увидел в верхнем UMD, зачем Polling 1000 поставили, верните на 100.

Сначала надо исправлять серьёзные ошибки вроде стоп битов (адрес слейва, скорость, чётность, стоп биты), а функцию вы всегда изменить сможете на 02, если 01 не работает.

Валенок
07.10.2022, 08:06
А какой тайный смысл во вставлянии одного и того же по 2 раза в umd ?

Пьер
07.10.2022, 17:35
Почти правильно, осталось поменять в RS485, 1 стоп бит на 2 стоп бит. Выше дописал уже.

Ещё увидел в верхнем UMD, зачем Polling 1000 поставили, верните на 100.

Сначала надо исправлять серьёзные ошибки вроде стоп битов (адрес слейва, скорость, чётность, стоп биты), а функцию вы всегда изменить сможете на 02, если 01 не работает.

Не знаю, функцию на 8 bit input module менял на 01 и на 02, poling time на 100 поменял. И 2 стоп бита поставил. Посылки от меня принимает, Но не считывает ничего.

Пьер
07.10.2022, 20:39
Не знаю, функцию на 8 bit input module менял на 01 и на 02, poling time на 100 поменял. И 2 стоп бита поставил. Посылки от меня принимает, Но не считывает ничего.
На картинках адрес х03 или х300 , dec 3 и 768. Мне надо считать биты статуса, и информационные,
не могу понять, запись идет, а считать никак не получается.

kondor3000
07.10.2022, 20:40
Не знаю, функцию на 8 bit input module менял на 01 и на 02, poling time на 100 поменял. И 2 стоп бита поставил. Посылки от меня принимает, Но не считывает ничего.

Ошибки есть? Скрин конфигурации при работе выложите.

Пьер
07.10.2022, 20:58
Ошибки есть? Скрин конфигурации при работе выложите.

Считывать пробовал и 01 и 02 функциями и регистры подставлял после битов и пробовал одни регистры считывать, как только не пробовал.

kondor3000
07.10.2022, 21:06
На картинках адрес х03 или х300 , dec 3 и 768. Мне надо считать биты статуса, и информационные,
не могу понять, запись идет, а считать никак не получается.

03 это 3 адрес бита. Никак не пойму как этой китайской хренью управлять, опыта не было.
Запрос на чтение функция 01, биты 0 и 3. Ответ функция 01, бит 13.

Зачем вы мне не работающую программу выкладываете по 5 штук? Мне в работе надо и ошибку посмотреть.
Опять чтение с записью местами поменяли, зачем вы программу крутите всё время?
Выкладываете одну, скрины присылаете другие, и всё не то что надо.

Пьер
07.10.2022, 21:20
03 это 3 адрес бита. Никак не пойму как этой китайской хренью управлять, опыта не было.
Запрос на чтение функция 01, биты 0 и 3. Ответ функция 01, бит 13.

Зачем вы мне не работающую программу выкладываете по 5 штук? Мне в работе надо и ошибку посмотреть.
Опять чтение с записью местами поменяли, зачем вы программу крутите всё время?
Выкладываете одну, скрины присылаете другие, и всё не то что надо.
В работе. Ошибка 81 всегда

Пьер
07.10.2022, 21:24
03 это 3 адрес бита. Никак не пойму как этой китайской хренью управлять, опыта не было.
Запрос на чтение функция 01, биты 0 и 3. Ответ функция 01, бит 13.

Зачем вы мне не работающую программу выкладываете по 5 штук? Мне в работе надо и ошибку посмотреть.
Опять чтение с записью местами поменяли, зачем вы программу крутите всё время?
Выкладываете одну, скрины присылаете другие, и всё не то что надо.

В Мастер скаде 1 бит считывается адрес 1D =29

kondor3000
07.10.2022, 21:39
Ну так, если 1 бит с адресом 29, то и поставьте тогда на 8 Bit Inut адрес 29,
тогда 0 бит будет 29, 1 бит-30, 2 бит - 31
И выложите программу которую вы используете.

Пьер
07.10.2022, 21:46
Ну так, если 1 бит с адресом 29, то и поставьте тогда на 8 Bit Inut адрес 29,
тогда 0 бит будет 29, 1 бит-30, 2 бит - 31
И выложите программу которую вы используете.

как так поставить? у нас же 8 bit input register (это же 1 байт - пол регистра)

kondor3000
07.10.2022, 21:54
как так поставить? у нас же 8 bit input register (это же 1 байт - пол регистра)

Я с битами давно не работал, забыл уже. Биты передаю масками упакованные в регистры.
А вам надо:
Первые 8 bit адрес 0, вторые 8 bit адрес 8, короче битовый счёт адресов. Поставите 29 адрес читать будете в бите 0 - 29 бит.

Пьер
07.10.2022, 22:05
Я с битами давно не работал, забыл уже. Биты передаю масками упакованные в регистры.
А вам надо:
Первые 8 bit адрес 0, вторые 8 bit адрес 8, короче битовый счёт адресов. Поставите 29 адрес читать будете в бите 0 - 29 бит.

так чтоли? но так тоже не считывает

kondor3000
07.10.2022, 22:54
так чтоли? но так тоже не считывает
Пробовали сделать Очистить всё, Компилировать всё? после залить проект и Старт
Вы постоянно меняете программу, надо чистить.

Возможно есть ещё какая то проблема, а протокол точно Модбас RTU ? У вас в сервере какой протокол стоит?
Скрин опять не в работе сделали.

Пьер
07.10.2022, 23:16
Значит есть ещё какая то проблема, а протокол точно Модбас RTU ? У вас в сервере какой протокол стоит?

В сервере Modbus RTU стоит.

kondor3000
07.10.2022, 23:30
В сервере Modbus RTU стоит.

Вот смотрите, у вас есть все настройки в сервере. Просто аккуратно перенесите их в конфигурацию. Не всё сразу, а по частям, пока всё не заработает. И чтобы ошибок не было.

Пьер
07.10.2022, 23:34
Вот смотрите, у вас есть все настройки в сервере. Просто аккуратно перенесите их в конфигурацию. Не всё сразу, а по частям, пока всё не заработает. И чтобы ошибок не было.

как это возможно?

kondor3000
07.10.2022, 23:40
как это возможно?

Всмысле как? Не все настройки конечно, а те что есть.
Со скоростью, чётностью, адресом слейва, стоп битами вроде разобрались.
Осталось разобраться с функциями, адресами регистров и бит. Добавляете только запись, запускаете, смотрите, что ошибок нет.
Добавляете только чтение регистров, проверяете.
Добавляете чтение бит, проверяете.
Выкладываете проект, и скрин В РАБОТЕ, и пишите только что добавили, после чего появилась ошибка.

Пьер
07.10.2022, 23:48
Всмысле как? Не все настройки конечно, а те что есть.
Со скоростью, чётностью, адресом слейва, стоп битами вроде разобрались.
Осталось разобраться с функциями, адресами регистров и бит. Добавляете только запись, запускаете, смотрите, что ошибок нет.
Добавляете только чтение регистров, проверяете.
Добавляете чтение бит, проверяете.
Выкладываете проект, и скрин В РАБОТЕ, и пишите только что добавили, после чего появилась ошибка.

На самом деле я уже все это пробовал. И пробовал один единственный регистр на запись, с настройками сом порта как в Мастер скаде. Но уже при этом выдает ошибку. Завтра уже наделаю скринов. И фреймы и тайм ауты и биты менял местами.

kondor3000
08.10.2022, 00:52
Вот что нашёл ещё, в вашем описании блока 63053
Думаю в конфигурации надо использовать не 8 Bit Input и Register Input, а 8 Bit Input State и Register Input State.
63054

Валенок
08.10.2022, 08:53
"state" в конфигурации овена и "state" где то в описании другого оборудования никаким боком не связаны до момента пока в конкретном протоколе не появится понятие "state". В модбас оно когда появилось?

Видя эту белку в курятнике я бы предложил начать с чистого проекта, но это уже было предложено, а ТС предлагает еще какие то скрины, какие то биты и таймауты местами менять. Рандом тоже иногда имеет право на жизнь))

kondor3000
08.10.2022, 11:37
Валенок, вот смотрите, на скрине с записью битов управления всё понятно. Записали POWER ON в 0 бит, получили ответ в 0 бите.

С чтением битов не понятно, делаете запрос в 3 бите, получаете ответ в 13 бите (19 DEC) ? Что такое в запросе total high bit - 00 и total low bit - 08 ?63058

melky
08.10.2022, 11:52
Пьер вас ничего не смущает в вашем сервере ? где там запрос Coils ?

Пьер
08.10.2022, 12:05
Пьер вас ничего не смущает в вашем сервере ? где там запрос Coils ?

Там запрос на 29 бит DISCRET INPUTS. А это получается функция 02.

Пьер
08.10.2022, 12:11
Пьер вас ничего не смущает в вашем сервере ? где там запрос Coils ?
ПО этой таблице. 29 бит функцией 02.

Валенок
08.10.2022, 15:03
.. С чтением битов не понятно, делаете запрос в 3 бите, получаете ответ в 13 бите (19 DEC) ? Что такое в запросе total high bit - 00 и total low bit - 08 ?
Тут издеваются?
С 3-его бита попросили 8штук битов.
8 штук битов и приехало: 13h = 00010011b

kondor3000
08.10.2022, 17:27
Тут издеваются?
С 3-его бита попросили 8штук битов.
8 штук битов и приехало: 13h = 00010011b

Откуда там могут быть три включенных бита, если с 3 бита по 10, задействован только 9 бит? 63060
С 0 по 7 задействовано только 2 бита.
Не ругайтесь, просто хочу понять как работает это китайское изделие. А опыта нет.

Пьер
08.10.2022, 19:04
Откуда там могут быть три включенных бита, если с 3 бита по 10, задействован только 9 бит? 63060
С 0 по 7 задействовано только 2 бита.
Не ругайтесь, просто хочу понять как работает это китайское изделие. А опыта нет.

А если вручную подать запрос? Как правильно написать. Потому что, что я написал у меня err255 в блоке чтения 02 функцией.

Пьер
08.10.2022, 19:52
Сниффером просмотрел что отправляет сервер мастер скады и ПЛК
Мастер скада
01 02 00 1d 00 01 29 cc

ПЛК
01 02 00 1d 00 08 e9 ca

в принципе понятно там 1 бит, а тут 8 бит.

Но Плк в конфигураторе не может конкретно с одного бита считать.

melky
08.10.2022, 20:40
Сдвиньте в ПЛК запрос по адресу раньше, чтобы до конца таблицы было 8 бит, ошибка уйдет ?
например с адреса 0x18

Пьер
08.10.2022, 20:44
Сдвиньте в ПЛК запрос по адресу раньше, чтобы до конца таблицы было 8 бит, ошибка уйдет ?
например с адреса 0x18

Я так делал. 24 адрес у восьми битного запроса.
Делал с 0адр 8бит 8 адр 8бит 16 адр 8бит 24 адр. То есть запрос на 4 байта. Так тоже не работает.
Делал с 8бит State, с запросами вручную, тоже не считывает.
Делал 32 битный input с нулевого адреса, тоже не считывает.
Может во временных запросах проблема.

melky
08.10.2022, 20:47
Может устройство не отдает группой. Если в MS есть вариант настроить Discret Input скажем те же 8 бит, чтобы повторить запрос как с ПЛК то попробуйте настроить. Если получите ошибку, ну значит отключайте Конфигурацию и пробуйте библиотеки.

Пьер
08.10.2022, 20:49
Я так делал. 24 адрес у восьми битного запроса.
Делал с 0адр 8бит 8 адр 8бит 16 адр 8бит 24 адр. То есть запрос на 4 байта. Так тоже не работает.
Делал с 8бит State, с запросами вручную, тоже не считывает.
Делал 32 битный input с нулевого адреса, тоже не считывает.
Может во временных запросах проблема.

Отправка работает. Ставлю в конфигураторе 1 Registr output c адресом 0 и при этом уже ошибка связи 81. Хотя отправка работает. Странно. Это при настройках 9600/NoP/8/2 и 9600/NoP/8/1 - ошибка 81, но отпрвка работает. Проверял подключать к плк модуль ОВЕН , ошибки 81 нет (может аппаратная ошибка думал)

Пьер
08.10.2022, 20:51
Может устройство не отдает группой. Если в MS есть вариант настроить Discret Input скажем те же 8 бит, чтобы повторить запрос как с ПЛК то попробуйте настроить. Если получите ошибку, ну значит отключайте Конфигурацию и пробуйте библиотеки.

Пример для функции 02 не могу найти, чтобы переставил байты и биты, чтобы результат получить правильный.

Пьер
08.10.2022, 21:01
Пример для функции 02 не могу найти, чтобы переставил байты и биты, чтобы результат получить правильный.

ТУТ дискретные инпутсы только по битно считываются.

kondor3000
08.10.2022, 21:10
Лучший способ выяснить правду, как и что надо считывать, программа Owen OPC Server, ставиться за 2 мин. на комп. Любой бит и регистр можно настроить и проверить. Чтение и запись, любая функция, RS485 через переходник типа АС-4, есть и TCP https://owen.ru/product/new_opc_server 63063

Пьер
08.10.2022, 22:47
Лучший способ выяснить правду, как и что надо считывать, программа Owen OPC Server, ставиться за 2 мин. на комп. Любой бит и регистр можно настроить и проверить. Чтение и запись, любая функция, RS485 через переходник типа АС-4, есть и TCP https://owen.ru/product/new_opc_server 63063
Считывает по порядку. Но это не байтом целиком. 29 бит отдельно отлично считал.

Пьер
08.10.2022, 22:55
Лучший способ выяснить правду, как и что надо считывать, программа Owen OPC Server, ставиться за 2 мин. на комп. Любой бит и регистр можно настроить и проверить. Чтение и запись, любая функция, RS485 через переходник типа АС-4, есть и TCP https://owen.ru/product/new_opc_server 63063

Можете проверить программу? Копирую сразу как есть.
Переменные:
PROGRAM PLC_PRG
VAR
RHR: MB_RD_HOLD_REGS; (*ôóíêöèÿ 03 - ÷òåíèå ïàðàìåòðà òèïà INT*)
RIR:MB_RD_INPUTS; (*ôóíêöèÿ 02 - ÷òåíèå ñòàòóñà äèñêð âõ.*)
RCoils:MB_RD_COILS;
WrR: MB_WR_SNG_REG; (*ôóíêöèÿ 6 - çàïèñü åäåíè÷íîãî ðåãèñòðà*)
WrCoil: MB_WR_SNG_COIL; (*ôóíêöèÿ 5 - çàïèñü åäåíè÷íîãî äèñêð âõ. áèòà*)
RIRs:MB_RD_INP_REGS;

Buffer1: ARRAY[0..255] OF BYTE; (* áàéòîâûé áóôåð äàííûõ *)
Buffer2: ARRAY[0..255] OF BYTE; (* áàéòîâûé áóôåð äàííûõ *)
Buffer3: ARRAY[0..255] OF BYTE; (* áàéòîâûé áóôåð äàííûõ *)
Buffer4: ARRAY[0..255] OF BYTE; (* áàéòîâûé áóôåð äàííûõ *)
Buffer10: ARRAY[0..255] OF BYTE; (* áàéòîâûé áóôåð äàííûõ *)


cmpl: BOOL; (*ïðèçíàê çàâåðøåííîñòè ðàáîòû ôóíêöèè*)
port_opened: BYTE := 0; (*ðåçóëüòàò îòêðûòèÿ ïîðòà*)
Settings:COMSETTINGS; (* íàñòðîéêè ïîñëåäîâàòåëüíîãî ïîðòà *)
com_num: PORTS:=0; (*0 - 485-1
1 - 232 - COM1
2 - 485-2 - COM2
4 - DBGU - COM4 *)


enable: BOOL; (*ñîñòîÿíèå ðàáîòû áëîêà*)
err: INT; (*íîìåð îøèáêè*)
TimeOut: TIME:=T#500ms; (*òàéìàóò*)
DataSize: WORD; (*êîë-âî ñ÷èòàííûõ áàéòîâ *)
ptr_byte:POINTER TO BYTE; (*óêàçàòåëü íà òèï byte*)
COM_SERVICE1: COM_SERVICE;
state: WORD := 0; (*ñîñòîÿíèå*)


(*ñ÷èòàííîå çíà÷åíèå*)
status2:WORD;
real2: REAL;
real3: REAL;
status3: WORD;
real4: REAL;
status4: WORD;
real5: REAL;
status5: WORD;
real6: REAL;
status6: WORD;
real7: REAL;
status7: WORD;
real8: REAL;
status8: WORD;
wrd1: WORD:=1;
wrd_rele_0:WORD:=0;
t21: WORD := 0; (* *)
t12: WORD; (* *)
t14: WORD; (* *)
t15: WORD; (* *)
t17: WORD; (* *)
t16: WORD; (* *)
t18: WORD; (* *)
t19: WORD; (* *)
t20: WORD; (* *)
t25: WORD; (* *)
t13: WORD := 0;(* *)
t22: WORD; (* *)
t22_2: WORD := 0; (* *)
t24: WORD := 0; (* *)
t24_2: WORD := 0; (* *)
wrd_out_tok: WORD := 0;
t30: WORD;
count_err_30: WORD;
RT_t1:R_TRIG;
In_1: DWORD;
Sh_1:BOOL;
Sh_2:BOOL;
Sh_3:BOOL;
Sh_4:BOOL;
V1:WORD;
V2:WORD;
V3:WORD;

enable2: BOOL;
enable3: BOOL;
enable4: BOOL;
enable5: BOOL;
ch1: WORD;
reg1: WORD;
rc1: WORD;
rc2: WORD;
rr1: WORD;
rr2: BYTE;
rir1: WORD;
rir2: WORD;
enable6: BOOL;
cmpl1: BOOL;
err1: BYTE;
ss:BOOL;
x1: WORD;
x2: WORD;
x3: WORD;
END_VAR


Программа:


IF port_opened=0 THEN
Settings.Port:=com_num; (*????? COM-????? RS485*)
Settings.dwBaudRate:=9600; (*????????*)
Settings.byParity:=0;
Settings.dwTimeout:=0;
Settings.byStopBits:=2;
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

(*

(*RCoils(
Enable:=enable , (* ?????????? ?????? ????? *)
Mode:=MB_RTU , (*????? ????????*)
DevAddr:=1 , (*????? ?1 *)
FirstAddr:=rc1 , (*????? ????????*)
Quantity:=rc2 , (*?????????? ?????????*)
ComHandle:=Settings.Port , (*????? COM-?????*)
TimeOut:=TimeOut , (*??????? *)
Buffer:=Buffer1 , (* ????? ?????? *)
Complete=>cmpl , (* ??????? ?????????? ???????? *)
Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
ByteCnt=>DataSize ); *) (*???-?? ????????? ?????? *)
RIRs(
Enable:=enable3 , (* ?????????? ?????? ????? *)
Mode:=MB_RTU , (*????? ????????*)
DevAddr:=1 , (*????? ?1 *)
FirstAddr:=rr1 , (*????? ????????*)
Quantity:=rr2 , (*?????????? ?????????*)
ComHandle:=Settings.Port , (*????? COM-?????*)
TimeOut:=TimeOut , (*??????? *)
Buffer:=Buffer1 , (* ????? ?????? *)
Complete=>cmpl , (* ??????? ?????????? ???????? *)
Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
ByteCnt=>DataSize ); ;
RT_t1(CLK:=RIRs.Complete , Q=> );
IF RT_t1.Q THEN
t24:=Buffer1[4]+Buffer1[5];
END_IF

IF RCoils.Complete THEN
v1:=1;
END_IF

WrCoil(
Enable:=enable2 ,
Mode:=MB_RTU ,
DevAddr:=1 ,
CoilAddr:=V2 ,
Value:=Sh_1 ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err );
WrR(
Enable:=enable4 ,
Mode:=MB_RTU ,
DevAddr:=1 ,
RegAddr:=reg1 ,
Value:=ch1 ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err );

(*RhR(
Enable:=enable5 , (* ?????????? ?????? ????? *)
Mode:=MB_RTU , (*????? ????????*)
DevAddr:=1 , (*?????*)
FirstAddr:=3 , (*????? ????????*)
Quantity:=1 , (*?????????? ?????????*)
ComHandle:=Settings.Port , (*????? COM-?????*)
TimeOut:=TimeOut , (*??????? *)
Buffer:=Buffer2 , (* ????? ?????? *)
Complete=>cmpl , (*??????? ?????????? ???????? *)
Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
ByteCnt=>DataSize );*)
*)
IF port_opened=2 THEN
RiR(
Enable:=enable6 , (* ?????????? ?????? ????? *)
Mode:=MB_RTU , (*????? ????????*)
DevAddr:=1 , (*????? ?1 *)
FirstAddr:=rc1 , (*????? ????????*)
Quantity:=rc2 , (*?????????? ?????????*)
ComHandle:=Settings.Port , (*????? COM-?????*)
TimeOut:=TimeOut , (*??????? *)
Buffer:=Buffer10 , (* ????? ?????? *)
Complete=>cmpl1 , (* ??????? ?????????? ???????? *)
Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
ByteCnt=>DataSize );
(*RhR(
Enable:=enable6 , (* ?????????? ?????? ????? *)
Mode:=MB_RTU , (*????? ????????*)
DevAddr:=1 , (*????? ?1 *)
FirstAddr:=rir1 , (*????? ????????*)
Quantity:=rir2 , (*?????????? ?????????*)
ComHandle:=Settings.Port , (*????? COM-?????*)
TimeOut:=TimeOut , (*??????? *)
Buffer:=Buffer10 , (* ????? ?????? *)
Complete=>cmpl , (* ??????? ?????????? ???????? *)
Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
ByteCnt=>DataSize );*)
IF cmpl1 THEN
(*t30:=RiR.Exception;*)
IF RiR.Exception=0 THEN (*???? ??? ??????, ?? ???????? ?????? ?? ?????? *)


(*????1*)
ptr_byte:=ADR(In_1);(**)
ptr_byte^:=buffer10[4];
ptr_byte:=ptr_byte+1;
ptr_byte^:=buffer10[5];
(*ptr_byte:=ptr_byte+1;
ptr_byte^:=buffer10[3];
ptr_byte:=ptr_byte+1;
ptr_byte^:=buffer10[2];*)
(*
x1:=BYTE_TO_WORD(BUFFER10[3]) OR SHL(BYTE_TO_WORD(BUFFER10[2]),8);
x2:=BYTE_TO_WORD(BUFFER10[5]) OR SHL(BYTE_TO_WORD(BUFFER10[4]),8);
x3:=BYTE_TO_WORD(BUFFER10[8]) OR SHL(BYTE_TO_WORD(BUFFER10[9]),8);*)
enable6 := FALSE;

ss:=FALSE;

ELSE t14:=t14+1;
;
END_IF
END_IF

END_IF
(*
CASE state OF
0: (* ?1 *)
enable:=1;
IF port_opened=2 THEN (*?????? ???????????????????*)
(* ??????? 02 - ?? ????????? ???????? ????????? ???? bool ?? ??????? ?? ????????? Modbus-RTU*)
RIR(
Enable:=enable , (* ?????????? ?????? ????? *)
Mode:=MB_RTU , (*????? ????????*)
DevAddr:=1 , (*????? ?1 *)
FirstAddr:=16 , (*????? ????????*)
Quantity:=31 , (*?????????? ?????????*)
ComHandle:=Settings.Port , (*????? COM-?????*)
TimeOut:=TimeOut , (*??????? *)
Buffer:=Buffer1 , (* ????? ?????? *)
Complete=>cmpl , (* ??????? ?????????? ???????? *)
Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
ByteCnt=>DataSize ); (*???-?? ????????? ?????? *)


(*???? ?????????? ??????? ?????????? ????????, ?? *)
IF cmpl THEN
IF err=0 THEN (*???? ??? ??????, ?? ???????? ?????? ?? ??????, ????????? ??????????*)
(*?????? ???????? ???????? ??????? ?????? ?????? ??? Float32 ? ??????? ?????? ?????? ??? Int16*)
(*??????? ?????????? ???????? "??????-??????" *)
state:=1;
enable:=0;
ELSE t12:=t12+1;
state:=1;
END_IF
END_IF
END_IF

1:(*?????????? ????????? ?? ????? ?? ?????????? ? ??????? ?1*)
enable:=1;
IF port_opened=2 THEN (*?????? ???????????????????*)
(* ??????? 03 ????? - ?? ????????? ???????? ????????? ???? int16 ?? ??????? ? ??????? 1 *)
RHR(
Enable:=enable , (* ?????????? ?????? ????? *)
Mode:=MB_RTU , (*????? ????????*)
DevAddr:=1 , (*?????*)
FirstAddr:=25 , (*????? ????????*)
Quantity:=1 , (*?????????? ?????????*)
ComHandle:=Settings.Port , (*????? COM-?????*)
TimeOut:=TimeOut , (*??????? *)
Buffer:=Buffer2 , (* ????? ?????? *)
Complete=>cmpl , (*??????? ?????????? ???????? *)
Exception=>err , (* ??????? ?????? ?????????? ????????? MODBUS ??? ??????:0x00 – ?????? ??? ?????????? ?? ??????????, 0xFE – ?????????? ?????? ???,0xFF – ?????? ???????? *)
ByteCnt=>DataSize ); (*???-?? ????????? ?????? *)
(*???? ?????????? ??????? ?????????? ????????, ?? *)

IF cmpl THEN
IF err=0 THEN (*???? ??? ??????, ?? ???????? ?????? ?? ?????? *)


(*????1*)
ptr_byte:=ADR(In_1);(**)
ptr_byte^:=buffer1[5];
ptr_byte:=ptr_byte+1;
ptr_byte^:=buffer1[4];


state:=2;
enable:=0;
ELSE t14:=t14+1;
state:=2;
END_IF
END_IF
END_IF

2:(*COIL*)
enable:=1;
IF port_opened=2 THEN (*?????? ???????????????????*)
(* ??????? 05 *)
WrCoil(
Enable:=enable ,
Mode:=MB_RTU ,
DevAddr:=1 ,
CoilAddr:=V1 ,
Value:=Sh_1 ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err );

(*???? ?????????? ??????? ?????????? ????????, ?? *)

IF cmpl THEN
IF err=0 THEN

state:=3;
enable:=0;
ELSE t15:=t15+1;
state:=3;
END_IF
END_IF
END_IF

3:(*COIL*)
(*enable:=1;
IF port_opened=2 THEN (*?????? ???????????????????*)
(* ??????? 05 *)
WrCoil(
Enable:=enable ,
Mode:=MB_RTU ,
DevAddr:=1 ,
CoilAddr:=0 ,
Value:=Sh_2 ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err );

(*???? ?????????? ??????? ?????????? ????????, ?? *)

IF cmpl THEN
IF err=0 THEN

state:=3;
enable:=0;
ELSE t16:=t16+1;
state:=4;
END_IF
END_IF
END_IF*)

state:=4;
4:
enable:=1;
IF port_opened=2 THEN (*?????? ???????????????????*)
(* ??????? 06*)
WrR(
Enable:=enable ,
Mode:=MB_RTU ,
DevAddr:=1 ,
RegAddr:=V2 ,
Value:=v3 ,
ComHandle:=Settings.Port ,
TimeOut:=TimeOut ,
Complete=>cmpl ,
Exception=>err );
(*???? ?????????? ??????? ?????????? ????????, ?? *)


IF cmpl THEN
IF err=0 THEN (*???? ??? ??????, ?? ???????? ?????? ?? ??????, ????????? ??????????*)
state:=5;
enable:=0;
ELSE t17:=t17+1;
state:=0;
END_IF
END_IF
END_IF


END_CASE*)

В программе работает только блок RiR со строки 87
Начальный адрес задаю 29, количество 1.
Тайм аут менял с 5мс до 2000 мс. Но выдает ошибку тайм аута RiR.Exception= 255

Валенок
08.10.2022, 23:36
Под словом проект подразумевают проект а не выжимки.
Для битов ставьте стартовый адрес кратный 8-ми. Спасибо - овену. Но всегда есть syslibcom


Я так делал. 24 адрес у восьми битного запроса.
Делал с 0адр 8бит 8 адр 8бит 16 адр 8бит 24 адр. То есть запрос на 4 байта. Так тоже не работает.

Но это у Овена работает.
63065

Работает ли у того девайса ?

Валенок
08.10.2022, 23:47
Откуда там могут быть три включенных бита, если с 3 бита по 10, задействован только 9 бит? .
Для Вас - только 9й бит



С 0 по 7 задействовано только 2 бита..
Свободно это необязательно 0. Обратите внимание - там нет R или W. Т.е. если и читается - не обращайте внимание на содержимое.


.. просто хочу понять как работает это китайское изделие..
Я тоже не знаю как работает это изделие.

kondor3000
09.10.2022, 11:55
Пьер, неужели трудно запомнить, выкладывайте проект, а не куски.
Блок есть только у вас и разбираться вам надо, мы только подсказывать можем. Программой Owen OPC Server подключитесь к блоку и проверьте как считываются биты.
Когда вы точно узнаете как правильно читать (записывать), по одному биту или байтом по 8 бит или регистром по 16 бит, выкладывайте сюда и только после этого можно программу писать. Частота опроса и тайм аут должны быть 500 ms.
Добавляйте по одному параметру (тегу), сначала бит чтение, потом бит запись и т.д., если GOOD, значит читаете правильно.
Вот пример опроса ПЛК по ТСР 63072

Пьер
09.10.2022, 12:36
Под словом проект подразумевают проект а не выжимки.
Для битов ставьте стартовый адрес кратный 8-ми. Спасибо - овену. Но всегда есть syslibcom


Но это у Овена работает.
63065

Работает ли у того девайса ?

У этого девайса это не работает.

Пьер
09.10.2022, 12:39
Пьер, неужели трудно запомнить, выкладывайте проект, а не куски.
Блок есть только у вас и разбираться вам надо, мы только подсказывать можем. Программой Owen OPC Server подключитесь к блоку и проверьте как считываются биты.
Когда вы точно узнаете как правильно читать (записывать), по одному биту или байтом по 8 бит или регистром по 16 бит, выкладывайте сюда и только после этого можно программу писать. Частота опроса и тайм аут должны быть 500 ms.
Добавляйте по одному параметру (тегу), сначала бит чтение, потом бит запись и т.д., если GOOD, значит читаете правильно.
А если некоторые биты из этого списка 0..31 не записываются, это что значит?

melky
09.10.2022, 12:44
Пьер - вам уже сказали, проверьте другой программой опрос группой нескольких битов, если в Мастер Скада нет такой возможности. Вплоть до ручной посылки при помощи Com port ToolKit например. Как выглядит посылка группой прекрасно вам показал снифер при отправке со стороны ПЛК. Посчитать CRC онлайн калькулятор с Modbus поможет.

Что вы ходите вокруг да около вместо банальной проверки. Может ваше устройство не умеет отдавать данные группой и только зря мучаете Конфигурацию ПЛК

kondor3000
09.10.2022, 13:02
А если некоторые биты из этого списка 0..31 не записываются, это что значит?

Вам все и не нужны, вам нужны из 32 бит только 12 шт. (0,1,9,14,16,17 и т.д.) Потом дадите им имена и работать будете только с ними.
Но сначала надо точно выяснить как писать читать биты.

Провёл эксперимент с 0 битом, отдельно чтение, отдельно запись, отдельно чтение и запись. При запуске сервера отдельная запись выдаёт ошибку, пока не запишешь любое состояние. 63073
После записи любого состояния отдельная запись показывает GOOD 63074

Пьер
09.10.2022, 23:13
Вам все и не нужны, вам нужны из 32 бит только 12 шт. (0,1,9,14,16,17 и т.д.) Потом дадите им имена и работать будете только с ними.
Но сначала надо точно выяснить как писать читать биты.

Провёл эксперимент с 0 битом, отдельно чтение, отдельно запись, отдельно чтение и запись. При запуске сервера отдельная запись выдаёт ошибку, пока не запишешь любое состояние. 63073
После записи любого состояния отдельная запись показывает GOOD 63074

Выявил то, что из списка с 0 по 31 бит. Первые 2 байта с 0 по 15 работают только по функции 01 coil и чтение 05, их можно выставлять все вместе теги (это биты 00 01 09 ). Они НЕ работают по функции 02.

А остальные 2 байта с 24 по 31 байта работают только по фунции 02 (это биты по адресам 0x19 0x1a 0x1d). Если их настроить на 01 coil, тогда ошибка. Регистры с 0 по 03 работают на чтение/запись 03/06.

При чем включение устройсва регистрами с 0 по 01 соответствует битам с 00 по 01.

kondor3000
10.10.2022, 08:15
Это всё хорошо, а где проверка в программе через конфигурацию, со всеми полученными данными?

Пьер
10.10.2022, 08:31
Это всё хорошо, а где проверка в программе через конфигурацию, со всеми полученными данными?

Забыл выложить скрины (уже вечером). Пробовал в кофигурации 8 бит инпут с 24 адреса 02 функция - не считывает. Ошибка таймаута 81. При стоп битах 1, 2 и 1.5.
Регистры ф06 отправляет в 0й регистр. А ф03 этот же ренистр не считывает в разных umd и в одном umd.

kondor3000
10.10.2022, 08:49
Опять лишние телодвижения, стоп бит у вас 2, не надо их менять.
А вот в сервере, есть возможность читать биты и регистры по одному или группой.
Вот это вы и не проверили.
Не надо выкладывать не работающие скрины, только где Good.
Не надо добавлять много бит, проверяйте нужные 0,1,9 ....29,30,31

Пьер
10.10.2022, 22:08
есть возможность читать биты и регистры по одному или группой.


А где эта настройка?

Пьер
10.10.2022, 22:48
Опять лишние телодвижения, стоп бит у вас 2, не надо их менять.
А вот в сервере, есть возможность читать биты и регистры по одному или группой.
Вот это вы и не проверили.
Не надо выкладывать не работающие скрины, только где Good.
Не надо добавлять много бит, проверяйте нужные 0,1,9 ....29,30,31
Запись регистра с адресом 03 происходит, а считывание не происходит. Ошибка таймаута. что это значит?

melky
11.10.2022, 09:04
Сколько раз еще надо повторить, чтобы вы проверили ДРУГИМИ средствами чтение ?

запись происходит единичного бита, чтение у вас всегда группы битов. Сделайте выводы...

kondor3000
11.10.2022, 09:05
Где проект? Где исследования по серверу? вы по 5 кругу уже пошли.


А где эта настройка?
Настройки группового опроса, читать каждый тег отдельно и использовать команду запись единичного регистра, ставите Да.
63105

melky
11.10.2022, 09:08
Тоже удивляет такое упрямство, продолжать долбить ПЛК в попытках достучаться до устройства, которое возможно на данную команду никогда не ответит группой.

Пьер
11.10.2022, 23:40
Где проект? Где исследования по серверу? вы по 5 кругу уже пошли.


Настройки группового опроса, читать каждый тег отдельно и использовать команду запись единичного регистра, ставите Да.
63105
Спасибо за помощь. Поставил в настройках ДА ДА. Все отлично считывает и записывает при групповом обращении.
С 0х10 по 0х20 hex считывает, как понимаю это регистр с функцией 02 в codsys, но я так пробовал считывать и нечего не получилось.

kondor3000
12.10.2022, 08:24
А теперь поставьте Нет, Нет, и проверьте ещё раз. Это и будет групповой опрос.
Вам же все написали, только без подсказки вы сами думать не хотите. Функцию записи попробуйте 0х0f, это запись битов группой.
Когда все проверите, составьте таблицу, какой бит читаете, пишете и какой с функцией работает, опрос единичный или групповой.

Пьер
13.10.2022, 23:06
А теперь поставьте Нет, Нет, и проверьте ещё раз. Это и будет групповой опрос.
Вам же все написали, только без подсказки вы сами думать не хотите. Функцию записи попробуйте 0х0f, это запись битов группой.
Когда все проверите, составьте таблицу, какой бит читаете, пишете и какой с функцией работает, опрос единичный или групповой.
По Owen OPC
Биты с 0 по 15 coil 01\05 да да и нет нет все работает
Биты с 16 по 31 ф-я 02 да да и нет нет все работает

Биты с 0 по 15 coil 01\0F да да и нет нет (Не работает 0F)

Holding Registr (с 00 по 03) 03\06 да да нет нет (работает)
Holding Registr (с 00 по 03) 03\0F да да нет нет (НЕ работает)
Holding Registr (с 00 по 03) 03\10 да да нет нет (НЕ работает)
----------------------------------------------------------------
Короче, вот так.
В cds все перепробовал, все функции. Биты и регистры. Всегда ошибка 81 , ничего не считывает. Спасибо.

kondor3000
15.10.2022, 11:44
А если так сделать, если Holding Registr (с 00 по 03) 03\06 да да нет нет (работает)
Создайте новый проект. Добавьте 4 на чтение Register Input и 4 на запись Register Output в проект ( с 0 по 3 адреса), проверьте будет ли ошибка и скрин выложите. Проверьте запись и чтение, меняя числа.

И ещё, у Register Input есть возможность вместо чтения ф-ей 03, читать ф-ями 01 и 02. Попробуйте читать этими функциями адреса 0 и 1.63160Проверьте запись и чтение, меняя числа. И на ошибку.

И не забывайте выкладывать проект. Может вы ошибки делаете, а мы тут голову ломаем. Проект выкладывать в расширенном режиме.

Пьер
19.10.2022, 21:54
А если так сделать, если Holding Registr (с 00 по 03) 03\06 да да нет нет (работает)
Создайте новый проект. Добавьте 4 на чтение Register Input и 4 на запись Register Output в проект ( с 0 по 3 адреса), проверьте будет ли ошибка и скрин выложите. Проверьте запись и чтение, меняя числа.

И ещё, у Register Input есть возможность вместо чтения ф-ей 03, читать ф-ями 01 и 02. Попробуйте читать этими функциями адреса 0 и 1.63160Проверьте запись и чтение, меняя числа. И на ошибку.

И не забывайте выкладывать проект. Может вы ошибки делаете, а мы тут голову ломаем. Проект выкладывать в расширенном режиме.

Ничего выкладывать не буду. Все что советовали, все перепробовал и все тщетно. Спасибо за содействие. Устал уже с ней. Пытаюсь программно подключиться, считывая 29 бит 02 ф-ей. Он даже не выполняет эту функцию, пишет ошибку 255 -таймаут.

Валенок
19.10.2022, 22:43
Ничего выкладывать не буду. ..Устал уже с ней..
Не надо. Живите с этим.