PDA

Просмотр полной версии : Modbus контроль ошибок соединения



aven
21.06.2011, 20:19
Допустим к ПЛК подключен МВА8. Связь сконфигурирована в CoDeSys PLC-configuration как Modbus(master) RS-485 - MVA8

Вот ПЛК отправляет запрос, а ответа, допустим, нет. Нет секунду, нет минуту, нет час. И чего будет?
Если ничего не будет, так будет совсем плохо. Не уж то всё писать через SysLibCom?

Николаев Андрей
22.06.2011, 00:56
Почитать описание. Есть в подмодуле ModBus Master соответствующие параметры, отвечающие за ошибку обмена.

Александр Приходько
22.06.2011, 13:52
Допустим к ПЛК подключен МВА8. Связь сконфигурирована в CoDeSys PLC-configuration как Modbus(master) RS-485 - MVA8

Вот ПЛК отправляет запрос, а ответа, допустим, нет. Нет секунду, нет минуту, нет час. И чего будет?
Если ничего не будет, так будет совсем плохо. Не уж то всё писать через SysLibCom?

Велосипед в миллионный раз изобретать интересно, но!
Открываем РП и читаем главу Modbus Master из которой мы узнаем, что есть два регистра

last adres и last error.
Дальше дело техники, но в подсказку, ставите оператор case, а в качестве его статуса задаете last adres. Если он совпадает с адресом вашего устройства, то в переменную ошибки пишите last error.

lara197a
23.06.2011, 20:01
Примерно так:
В сети устройство с адресом 16 (*Last address*), Priznak_KacH-Это(*Last error*)

IF Adres=16 AND Priznak_KacH=81 THEN
M_KacH:=TRUE;
ELSIF Adres=16 AND Priznak_KacH=0 THEN
M_KacH:=FALSE;
END_IF

Затем поставьте переменную M_KacH, к примеру на вход таймера "Задержка включения".
Если по истечении какого-то времени не было удачных сеансов связи, то поднимайте тревогу.

N_KacH(IN:=M_KacH , PT:=T#5s , Q=> , ET=> );
M_KacH_p:=TON_KacH.Q;

aven
24.06.2011, 15:23
Вопрос 1,
зачем Last address типа DWORD ?

Вопрос 2,
зачем всё это имеет идентификатор %Q типа выход?

Вопрос 3,
выловить ошибку на конкретном устройстве... вот их 16 будет. На одном подкоротило шину, гвоздиком прибили провод но не насмерть. Получилось, что кто-то ловить пакеты, а кто-то нет. Допустим 5 адресов нормально, а с остальных мы имеем только Last address. Как не пропустить его оперативные изменения?

lara197a
24.06.2011, 19:37
1,2- Вам это принципиально?
3-а в чем трудность? Какая разница 1 устройство или 16.

Александр Приходько
27.06.2011, 10:07
Берем мою разработку за основу. Я ее успешно внедрил уже на нескольких объектах, в том числе и на котельной.
1) Делаем ФБ

Область объявления:


FUNCTION_BLOCK Get_Modules_Errors
VAR_INPUT
err:WORD;
END_VAR
VAR_OUTPUT
stat:BOOL:=0;
END_VAR
VAR
rt: R_TRIG;
tim_err: TIME := T#5s;
t: TON;
END_VAR


Тело ФБ:



(*Тригер прихода ошибки*)
rt(CLK:=WORD_TO_BOOL(err));
(*Если пришла ошибка, запускаем таймер*)
IF rt.Q THEN
t(IN:=TRUE , PT:=tim_err);
END_IF
(*Вызываем таймер*)
t;
(*Если таймер не запущен и ошибки нет, то аварии нет*)
IF t.IN=FALSE AND err=0 THEN
stat:=FALSE;
END_IF
(*Если таймер запущен, а ошибка ушла, то была помеха, отключаем аварию и таймер*)
IF t.IN AND err=0 THEN
t(IN:=FALSE , PT:=tim_err);
stat:=FALSE;
END_IF
(*Если таймер отработал, а ошибка не ушла - беда, ищем ваши гвозди ))) *)
IF t.Q THEN
stat:=TRUE;
t(IN:=FALSE , PT:=tim_err);
END_IF

RETURN;



В основной программе делаем следующее:

Область объявления:



PROGRAM PLC_PRG
VAR
(*Обработка гвоздей, грызунов, монтажников, и солнечного затмения*)
er_32: Get_Modules_Errors;
er_48: Get_Modules_Errors;
er_64: Get_Modules_Errors;
er_80: Get_Modules_Errors;
er_112:Get_Modules_Errors;
(*Каждому модулю даем свою ошибку*)
mod_32:BOOL:=0;
mod_48:BOOL:=0;
mod_64:BOOL:=0;
mod_80:BOOL:=0;
mod_112:BOOL:=0;
END_VAR


В теле пишем следующее:


CASE Last_adr OF
32:
er_32(err:=Last_err , stat=> mod_32);
48:
er_48(err:=Last_err , stat=> mod_48);
64:
er_64(err:=Last_err , stat=> mod_64);
80:
er_80(err:=Last_err , stat=> mod_80);
112:
er_112(err:=Last_err , stat=> mod_112);
END_CASE;


Все гениальное просто.

Smpl
02.09.2011, 11:28
Спасибо, хорошая программка!

В конфигурации ПЛК надо создать еще 2-е переменные:
в модбас мастере- Last_adr и Last_err

На тревогу подключаем переменные: mod_32, mod48...

Vlad_doc
29.10.2019, 12:39
Возможно ли эту программку использовать, если помимо 485 сети имеется сеть на 232 порту через интерфейс АС3_М?

Andrew_Stranger
30.10.2019, 13:44
Берем мою разработку за основу. Я ее успешно внедрил уже на нескольких объектах, в том числе и на котельной.
Все гениальное просто.
Александр растолкуйте назначение триггера rt(CLK:=WORD_TO_BOOL(err)); И почему нельзя просто обойтись TON?

kait-volga
28.10.2020, 14:59
Добрый день.

Решил не создавать новую тему, а поднять старую. Тема та же, только под другим углом.


Почитать описание. Есть в подмодуле ModBus Master соответствующие параметры, отвечающие за ошибку обмена.


Велосипед в миллионный раз изобретать интересно, но!
Открываем РП и читаем главу Modbus Master из которой мы узнаем, что есть два регистра

last adres и last error.

Подскажите пожалуйста, как выяснить адрес устройства, с целью контроля связи, при опросе приборов по Ethernet (ПЛК110 опрашивает через МКОН).
В данном случае в регистре last adress постоянное значение, вероятно т.к. IP один, а адрес конечного прибора задается в "Universal Modbus device".

kait-volga
30.10.2020, 07:14
Туз бубей говорит что плк по eth, а приборы на rs, тогда

почитать собственное РЭ устройства

Добрый день, Валенок.

Спасибо что откликнулись.

Прошу Вас пояснить, что Вы имели ввиду. Адрес устройств опрашиваемых по RS мне известны, опрос ПЛК110 Ethernet Modbus Master > МКОН > устройства RS485 Slave производится.

В РП "Программирование программируемых логических контроллеров ПЛК110" содержится информация обсуждаемая в данной теме:
«Last Address» – содержит адрес последнего опрошенного мастером
устройства (адрес последовательного устройства или IP-адрес, в зависимости от режима работы универсального устройства ModBus);
− «Last error» – содержит код ошибки из таблицы В.1"

Меня интересует, как в CoDeSys 2.3 выяснить какому из устройств на нижнем уровне (Slave RS485) принадлежит ошибка содержится в "Last error", какой ModbusSlaveAdress в данный момент опрашивается. В регистре «Last Address» всегда одно и то же значение = IP МКОН.
51588

РЭ на какое устройство мне стоит еще раз перечитать?

kait-volga
02.11.2020, 09:01
обычное дело


Теперь - на МКОН. Почему то кажется что стр 17

:confused:

РЭ МКОН конечно же читал, возможно не то ищу, поэтому и спрашиваю.

стр. 17 РЭ МКОН содержит изображение плагина настроек шлюза, примечание о резервировании адреса 1 и отсыл к приложению "Ручная настройка".
Я не нахожу здесь ответа на вопрос, как в CoDeSys 2.3 диагностировать ошибку связи с определенным Slave устройством в сети RS-485.

kait-volga
03.11.2020, 11:41
У меня нет мкона. РЭ/Рис 7.5. Разным slave id в rtu разные slave id в tcp - не ?

Вероятно "не". "Рисунок 7.5 – Настройки шлюза Master RS-485/Slave Ethernet" - другой режим. Меня интересует Master Ethernet/Slave RS-485.

Если я верно трактую документацию, при обращении к МКОН по Ethernet порт не изменно равен 502.
51662

PS Разные Slave ID в RTU, в Ethernet имеют различные друг от друга Slave ID. Они одинаковы, что в RTU, что в Ethernet.

Вопрос был, что в CoDeSys регистр «Last Address» содержит всегда одно и то же значение Module IP = IP МКОН, а Slave ID задается в ModuleSlave и как идентифицировать опрашиваемое устройство в момент получения ошибки Last Error.

Павел_Хабаровск
22.05.2021, 05:55
Благодаря пользователю Валенок получилось вычислить КС. Немного поправил, как мог.

FUNCTION crc16Calc : WORD
VAR_INPUT
buffer : POINTER TO ARRAY[0..16] OF BYTE;
n : INT;
END_VAR
VAR
i : INT;
crc1, crc2, tmp : BYTE;
END_VAR

crc1 := crc2 := 16#FF;
i := 0;
WHILE i < n DO
crc2 := crc2 XOR buffer^[i];
tmp := ((ROL(crc2,4) OR ROR(crc2,4)) AND 16#0F) XOR crc2;
crc2 := crc1;
crc1 := tmp;
tmp := (ROL(tmp,4) OR ROR(tmp,4)) AND 16#F0;
crc2 := crc2 XOR tmp;
tmp := SHL(tmp,1) XOR crc1;
crc1 := SHR(crc1, 3);
crc2 := crc2 XOR crc1;
crc1 := tmp;
i := i + 1;
END_WHILE
crc16Calc := crc2 + SHL(BYTE_TO_WORD(crc1), 8);

Запрос/ответ
[22/05/2021 12:00:56] Written data (COM4)
03 00 02 03 49 1d ....I.
[22/05/2021 12:00:56] Read data (COM4)
03 00 02 6a b4 92 ...jґ’
1 байт - адрес устройства
2 байт - адрес устройства (пусто)
3 байт - регистр управления ключом
4 байт - регистр состояния 6 дискретных входов
5,6 КС
Из описания
55241
Теперь надо осуществить процедуру обмена. Уф, это ещё неделю сидеть буду. А потом ещё циклический опрос 15 устройств.

capzap
22.05.2021, 08:03
Благодаря пользователю Валенок получилось вычислить КС. Немного поправил, как мог.

FUNCTION crc16Calc : WORD
VAR_INPUT
buffer : POINTER TO ARRAY[0..16] OF BYTE;
n : INT;
END_VAR
VAR
i : INT;
crc1, crc2, tmp : BYTE;
END_VAR

crc1 := crc2 := 16#FF;
i := 0;
WHILE i < n DO
crc2 := crc2 XOR buffer^[i];
tmp := ((ROL(crc2,4) OR ROR(crc2,4)) AND 16#0F) XOR crc2;
crc2 := crc1;
crc1 := tmp;
tmp := (ROL(tmp,4) OR ROR(tmp,4)) AND 16#F0;
crc2 := crc2 XOR tmp;
tmp := SHL(tmp,1) XOR crc1;
crc1 := SHR(crc1, 3);
crc2 := crc2 XOR crc1;
crc1 := tmp;
i := i + 1;
END_WHILE
crc16Calc := crc2 + SHL(BYTE_TO_WORD(crc1), 8);

Запрос/ответ
[22/05/2021 12:00:56] Written data (COM4)
03 00 02 03 49 1d ....I.
[22/05/2021 12:00:56] Read data (COM4)
03 00 02 6a b4 92 ...jґ’
1 байт - адрес устройства
2 байт - адрес устройства (пусто)
3 байт - регистр управления ключом
4 байт - регистр состояния 6 дискретных входов
5,6 КС
Из описания
55241
Теперь надо осуществить процедуру обмена. Уф, это ещё неделю сидеть буду. А потом ещё циклический опрос 15 устройств.

Зачем Вы гадите в тему если у Вас протокол не модбас?

ferret_maybe
22.05.2021, 10:32
Зачем Вы гадите в тему если у Вас протокол не модбас?
Почти Modbus второй байт назвали бы функцией и номер, пусть 100 и вполне похоже на Modbus.

capzap
22.05.2021, 12:07
Почти Modbus второй байт назвали бы функцией и номер, пусть 100 и вполне похоже на Modbus.

вполне не тоже самое что в соответствии со стандартом

вот же
Разобрался с получением КС в десятичном формате. Как перевести в 16#?
218 перевожу в HEX получается DA а в запросе должно 16#8Bон сам на этом споткнулся, требует чтоб десятичная 218 чудесным образом превратилась в 139 от незнания что пользуется не тем протоколом и так же ему подобные новички увидев в теме про модбас и полином A001h какой то расчет контрольной суммы и воспользуются им будут удивляться почему данные не приходят