PDA

Просмотр полной версии : восстановление связи по modbus СПК107



Сомов Илья
29.12.2014, 15:33
Здравствуйте!
Проблема заключается в следующем, на СПК107 в codesys 3.5 SP5 создан проект который обращается с контроллером через MODBUS RTU.
контроллер сделан на ПЛИС конфигурация - собственной разработки.
Если контроллер с ПЛИС включается раньше чем происходит загрузка СПК107 - то обмен работает.
Если контроллер с ПЛИС включается при работающем СПК107 то, несмотря на устойчивое мигание светодиода связи и в принципе правильному обмену запрос-ответ
между контроллером и СПК107, переменные не обновляются и состояние модуля MODBUSGenericSerialSlave - "не запущен".
Очень нужно чтобы связь востанавливась автоматически, что предпринять?
Мастер обмена - СПК107, галочка -"Avto-Restart communication" есть.

Andrew_Stranger
29.12.2014, 16:06
Можно попробовать программно перезапускать Modbus.

Сомов Илья
29.12.2014, 16:19
Как можно сделать это?

Andrew_Stranger
30.12.2014, 08:16
Что-то вроде этого:
IF Modbus_Slave_COM_Port.xError
THEN Modbus_Slave_COM_Port.xReset:=BL1.OUT;
ELSE Modbus_Slave_COM_Port.xReset:= FALSE;
END_IF;
(BL1: это BLINK)

Изюм
30.12.2014, 09:40
Столкнулся с такой же проблемой.
Спк107 - мастер, мв110-8а и мв110-8д4р - слейвы.
Светодиоды связи моргают, а переменные не изменяются. Модбас_слейв_ком_порт.хЕррор в это время остаётся "ложь".
Подскажите пожалуйста, как решить проблему?

Сомов Илья
30.12.2014, 10:02
Поробовали, сама конструкция что-то делает, .xerror находится в TRUE, затем когда xReset BL1.OUT ставит в TRUE, x.ERROR переходит на некоторое время в FALSE.
Значок MODBUS-SLAVE_COM_PORT в диспетчере устройств из красного ненадолго становится желтым, но данные не обновляются, связь не востанавливается.
При этом, повторюсь, тестер RS485 показывает правильный обмен между контроллером и СПК107.
Параметры BLINK - 2S "FALSE", 100ms "TRUE"

Сомов Илья
30.12.2014, 11:16
Смотрим параметр
byModbusError - когда работает (т.е. сначала включается контроллер потом СПК107) - значение response success,
когда не работает - CRC_fail или WRONG_SLAVE.
Обнулил значения передаваемые с контроллера - на тестере значения CRC одинаковые и когда работает и когда неработает....

Сомов Илья
30.12.2014, 12:08
Еще один эксперимент:
отключил на СПК канал записи регистров (Write multiple registers 16), а канал чтения оставил (Read Holding registers 03) - результат положительный, после возобновления питания контроллера связь тоже восстанавливается.
Если наоборот включить (Write multiple registers 16) и отключить (Read Holding registers 03), то результат отрицательный, связи нет - RESPONS_WRONG_SLAVE.

Что делать дальше пока незнаю.

Ефремов Николай
30.12.2014, 12:16
- RESPONS_WRONG_SLAVE.
Что делать дальше пока незнаю.

Не посылайте команды на запись одновременно- разделите их хотя бы в каждом рабочем цикле выполнить только одну команду и будет всё ОК.

Сомов Илья
30.12.2014, 13:29
Не совсем понял что и как разделить, однако для эксперимента цикл запросов сделал 2 сек, и команда только одна (Write multiple registers 16) - результат: RESPONS_WRONG_SLAVE. Может нужно как-то подругому?

Ефремов Николай
02.01.2015, 10:13
Не совсем понял, что Вы не поняли поэтому объясняю как я понял работу Модбас-Мастера:Модбас-Мастер посылает запрос слейву с определенным адресом и ждет ответа, слэйв выдерживает паузу( в это время выполняет команду) и посылает ответ, что все в порядке и он выполнил команду или произошла какая-то ошибка. Если же Ваш Модбас-Мастер начинает слать команды всем подряд без перерыва, то скорее всего в памяти у него остался последний адрес слэйва, а ответ он принимает от другого слэйва выдержавшего паузу- поэтому Вы и получаете RESPONS_WRONG_SLAVE или WRONG CRC если отвечает тот же слэйв, но на старый запрос. Я назвал бы это эффектом пьяной компании- когда за столом все говорят, каждый о своем, но ничего понять не могут, так как разобрать слов в общем гаме невозможно.
Поэтому, постарайтесь разделить запросы мастера (и на чтение и на запись) в разные рабочие циклы Вашей программы, уменьшите время задержки ответа слэйва в соответствие со скоростью обмена в Вашей сети и т.д.
В соседней ветке речь идет о том же - прочитайте.http://www.owen.ru/forum/showthread.php?t=20169&p=157118&viewfull=1#post157118
Желаю успехов.

RomAl
02.01.2015, 12:26
[QUOTE=Ефремов Николай;157622
Поэтому, постарайтесь разделить запросы мастера (и на чтение и на запись) в разные рабочие циклы Вашей программы, .[/QUOTE]

Как разделить в разные рабочие циклы? в конфигураторе что надо для этого сделать?..
И совсем чайниковский вопрос: что есть рабочий цикл?
В каждом канале Модбас слейва я устанавливаю своё время цикла. Например для МК110 в 0 канале на чтение 500мс, а в 1-м канале на запись тоже 500мс, время "таймаут ответа 50мс". Значит раз в 500мс мастер должен прочитать регистр подождав 50мс если надо, затем сделать запись регистра, а затем 50мс. ждать ответа с результатом записи. Получив ответ или через 50мс переходит к другим устройствам.
Что тут можно улучшить? Если устройства "правильные" (а не выдают ответ с очень большой задержкой) всё должно работать без ошибок вообще. Может вообще для чтения и записи физически одного устройства имеет смысл создавать разные модбас слейвы? Не будет ли это совсем параноей?
Когда спрашивают у меня каков у вас процент ошибок? я во-первых не заю где этот процент посмотреть, а во-вторых думаю почему эти ошибки вообще должны быть? (расстояние всего 150м и скорость 19.2)

жекон
03.01.2015, 06:40
А время цикла менять пробовали, я так Модбас на СПК110 одолел

Сомов Илья
04.01.2015, 12:34
Всех с Новым Годом!
Спасибо за советы, но пока ничего не помогло продвинуться к нужному результату.
- Перезапуск по .xRESET не помогает.
- Увеличение времени цикла не помогает.
- разделение запроса данных и передачи команд в разные циклы main_task (сделал принудительный запуск передачи) - не помогает.
Вернусь немного назад:устройств в канале только 2 (мастер и слейв), все дело в том, что если slave готов к работе и мастер начинает обмен - то все очень даже отлично работает, а вот когда slave на некоторое время отключается, (и естественно возникают ошибки тайм аута), а затем slave снова включается то при записи данных в регистры slavе-а СПК выдает ошибку (или ошибку CRC или просто RESPONS_WRONG_SLAVE) , при этом команда чтения проходит безошибочно.
Независимый тестер RS485 показывает, что информация в канале, в случае когда все работает и когда СПК дает ошибку АБСОЛЮТНО одинаковая.
Еще есть ощущение, что тайм-ауты и время циклов тут не причем.
Сам с этой техникой (СПК, ПЛК) работаю первый год, во многих вопросах плаваю, однако стаж в электронике, электротехнике уже более 20 лет, просто нужен дельный совет.

RomAl
06.01.2015, 00:45
Под воздействиием предыдущих постов решил проверить запись по Модбасу
с использованием конфигуратора. Кодесис 3.5.5.0, панель СПК107. Под рукой только ТРМ138. И вот какие чудеса я обнаружил:
Записывал уставку в 1-й канал ТРМ138, регистр 0х0011 и смотрел как она меняется.
Паралельно читал все каналы командой 4 (с 3 аналогично).
Начал записывать командой 16, но от неё всё поломалось и не работало даже чтение и даже
не работало чтение на других учтройствах.. В паспорте указана команда 6 для записи и пусть бы запись по 16 не работала, но причём тут чтение?
Затем проверил запись командой 6. В этом случае всё вроде бы работало и записывалось и читало.
Но.. читало-то штатно согласно времени цикла (пробовал 1 и 3 сек), а вот запись проходила только через 30-60сек независимо от времени цикла, таймаута и времени между фреймами. Даже когда
оставил только одно устройство и один канал на запись ничего не изменилось..
PS. Пооже, что дело не в том что слишком "медленно" записывается параметр, а в том что отображаемое значение уставки после перезаписи на ТРМ138 обновляется только через 30-60 секунд ..странно конечно, но тем не менее сама запись идёт вроде нормально

Ефремов Николай
13.01.2015, 12:28
Как разделить в разные рабочие циклы? в конфигураторе что надо для этого сделать?..
И совсем чайниковский вопрос: что есть рабочий цикл?
В каждом канале Модбас слейва я устанавливаю своё время цикла. Например для МК110 в 0 канале на чтение 500мс, а в 1-м канале на запись тоже 500мс, время "таймаут ответа 50мс". Значит раз в 500мс мастер должен прочитать регистр подождав 50мс если надо, затем сделать запись регистра, а затем 50мс. ждать ответа с результатом записи. Получив ответ или через 50мс переходит к другим устройствам.
Что тут можно улучшить? Если устройства "правильные" (а не выдают ответ с очень большой задержкой) всё должно работать без ошибок вообще. Может вообще для чтения и записи физически одного устройства имеет смысл создавать разные модбас слейвы? Не будет ли это совсем параноей?
Когда спрашивают у меня каков у вас процент ошибок? я во-первых не заю где этот процент посмотреть, а во-вторых думаю почему эти ошибки вообще должны быть? (расстояние всего 150м и скорость 19.2)

Рабочий цикл в моём понимании - это время за которое ПЛК или СПК выполняет все задания, которые Вы задали в своей программе ( в зависимости от Вашего творчества это примеро от 1мс до 100 мс). Если у слэйва 10 каналов (например 8 чтение и 2 запись), то это означает, что Мастер обратится 10 раз к одному и тому же слэйву. Если Вы не разделите эти запросы, установив какой-нибудь селектор запросов от Мастера, то в результате получите только пьяный галдёж на RS-485.

Никита_ХБК
29.06.2023, 04:26
Аналогично столкнулся с подобной проблемой. СПК107 по RS485 Modbus производит опрос МВ110. КАртина такая: светодиод RS485 на МВ110 как добросовестно мигает, в CDS3.5 в дереве устройств показывает что связь есть, там же во вкладке МодбасСлэйв (ModbusGenericSerialSlaveIEC) переменные связи xDoInit, xInitDone = TRUE, xDone, xBusy попеременно мигают. ОДНАКО, соотнесенные переменные к каналу Модбас не меняются. Вытаскиваю провода из пинов - все перечисленное перестают подавать признаки жизни, вставляю назад возвращается... Дело было не в бобине... В настройках соотнесения канала связи и переменных проекта внизу справа необходимо выставить настройку обновления тэгов = 2. и о чудо...68514