Просмотр полной версии : перезагрузка ПЛК73 при использовании функции из библиотеки modbus
Добрый день.
Осваиваю свзязь ПЛК73 с другими устройствами по modbus.
За основу беру файл примера с диска, который поставлялся вместе с ПЛК.
Проблемм со связью модулей вывода овеновских с ПЛК не было. Связь работает.
Пытаюсь подключить сервопривод, а точнее прочитать один из его регистров.
Если провод rs485 не подключен, програма не виснет, подключаю провод rs485 к сервоприводу, ПЛК перезагружается постоянно (я так понимаю, срабатывает сторожевой таймер). Если меняю адрес сервопривода, то при подключении провода rs485 ПЛК не перезагружается.
То есть выходит, что опрос то идет, но зависает.
И еще вопрос. При отключенном проводе всё равно есть какието цифры в переменной bufer. Откуда они берутся, если ничего в принципе придти не может?
Немного поэксперементировал. Проблемма не в коде, потому что эта программа прекрасно работает с МВ110-8А. Температуру датчика считывает. Зависает только тогда, когда подключаю сервопривод, и если настройки сети и адрес в программе и сервоприводе совпадают. То есть зависает именно при обращении к сервоприводу. Ума не приложу в каком направлении двигатся дальше. Пробывал и rtu и ascII, и разные настройки четности и стоп битов. Всегда зависает при обращению к сервоприводу.
Пока не выложите код, не приведете данные сервопривода, так и будете вести диалог с самим собой.
А вообще, по собственному опыту - скорее всего, Вам самому придётся этот вопрос решать.
Дозвонился до поддержки. Посоветовали посмтреть на компе что приходит уходит.
Вот логи:
1. Посылка запроса к сервоприводу без подключения кабеля, повторяющиеся "02 02 00 00 01 85 81" - насколько понимаю все как надо кроме команды, вроде как должно быть 02 (адрес устройства) 03(команда) 02 00 (адрес регистра 512) 01 (количество регистров) 85 81(crc0).
2 Подключаю кабель к приводу "02 02 00 00 01 85 81 b0 60 60" и далее ничего. Что значит b0 60 60 не представляю.
Для примера вот лог норамльной передачи температуры от МВ-110-8А "10 00 01 00 01 d6 8b 10 02 01 0a 84 12" Тут кстати тоже нет байта с командой 03, но ПЛК воспринимает это нормально.
Sergey666
12.02.2015, 22:43
Дозвонился до поддержки. Посоветовали посмтреть на компе что приходит уходит.
Вот логи:
1. Посылка запроса к сервоприводу без подключения кабеля, повторяющиеся "02 02 00 00 01 85 81" - насколько понимаю все как надо кроме команды, вроде как должно быть 02 (адрес устройства) 03(команда) 02 00 (адрес регистра 512) 01 (количество регистров) 85 81(crc0).
2 Подключаю кабель к приводу "02 02 00 00 01 85 81 b0 60 60" и далее ничего. Что значит b0 60 60 не представляю.
Для примера вот лог норамльной передачи температуры от МВ-110-8А "10 00 01 00 01 d6 8b 10 02 01 0a 84 12" Тут кстати тоже нет байта с командой 03, но ПЛК воспринимает это нормально.
b0 60 60 Это сервак мастера на три буквы посылает за запрос кривой - что за команда 02 - ??? Read Discrete Input , она может устройством не поддерживаться . И МВ-110-8а ее не подерживает .
И перезагруз скорее всего из-за кривого разбора кривого ответа .
Опросите сервак модбас-тестером или др. программой .
[02][03][02][00][00][01][85][81]- вот запрос на чтение одного регистра 512 с адреса 02.
Запрос не я формирую. Использую функциональный блок MB_RD_HOLD_REGS из овеновской библиотеки modbus.lib. Тут везде пишут, что с ней всё работает, и по другому на ПЛК-73 никак. Каналы не создать, нет возможности в конфигурации.
То, что запрос должен быть с 03 я и сам понимаю. Странно, но мв-110-8а этот запрос поняла и ответила даже. исчезнувшая 03 меня самого очень смущает. Попробую другие команды, не чтение, а запись к примеру.
Вопрос с 03 хоть и не решенный, но уже не важный. Почему то терминал не отображает байты со значением 03. Задал адрес устройства 03 и он и его пропустил, так что считаю, что он там есть на самом деле.
Попробывал функцию 06
Запрос создан верно функцией из библиотеки modbus.lib: 02 06 01 30 00 14 88 05
Адрес устройства 02 функция 06 регистр 304 значение 20 ну и црц
Ответ, если запрос верен, судя по документации на привод должен быть аналогичным, но это не так: 30 b0 30 00 14 88 05.
Откуда взялось 30 b0 мне не ясно - думаю в этом и проблема. Самое интересное, что параметр в приводе всё таки изменил свое значение на 20, значит запрос то он понял верно, а вот ответил коряво. Можно ли сделать так, чтобы функция не зависала в случае неверного ответа? Это в принципе решило бы мою проблемму, поскольку мне всего и нужно включить/выключить привод на определенной скорости, считывать с него я ничего не собираюсь.
Сам не разберусь всё таки.
Получил совершенно другой частотник, другой фирмы и та же проблемма.
При считывании какого-либо регистра несколько раз частотник отвечает, а затем "матерится" чем то вроде С1 60 60, и у ПЛК срабатывает сторожевой таймер.
Вот сылка на руководство:
http://www.euradrives.com.ua/downloads/E1000-Manual%28eng%29.pdf
В частотнике настроил параметры связи f900-f904, и всё. Может еще что надо? Использую функцию чтения регистров Модбас 03. Читаю только 1 регистр по адресу 16#1000. ПЛк выдает следующую команду 04 03 10 00 00 01 80 9f. Команда верна, несколько раз приходит правильный ответ 04 03 02 13 88 79 12. Считываемый параметр действительно равен 5000=16#1388. Но потом приходит какая-то ересь вроде 60 60 62 5C 93 И ПЛК отключается.
Программа больше ничего не делает, только пытается считать этот параметр каждые полсекунды.
Я уже просто не знаю в какую сторону копать. Может знающие тут люди подскажут?
lara197a
18.02.2015, 19:57
Вы по времени или по команде опрашиваете.
Сделайте таймаут 0. И часто запросом не сыпьте.
Раз в 3-5 сек.
Не в каждом ли цикле?
Если скините код, то могу попробовать опросить.
В гараже лежал ПЧ и ПЛК73. Завтра посмотрю, кажется в ПЧ модуль мадбас стоит.
Вот прога за вычетом всего лишнего
IF port_opened=2 THEN (*Удачно проинициализировали *)
CASE Init OF
1:
MB_03( (*модбас функция 03*)
Enable:=1 , (*разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=4 , (*адрес*)
FirstAddr:=16#1000, (*регистр*)
Quantity:=1, (*количество регистров*)
ComHandle:= Settings.Port, (*номер сом-порта*)
TimeOut:=t#50ms , (*таймаут T#50ms*)
Buffer:=Buffer, (* буфер данных *)
);
IF MB_03.Complete THEN
x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
Init:=Init+1;
END_IF;
2:
TON1(IN:=1,PT:=t#5s);
IF TON1.Q THEN
Init:=1;
TON1(IN:=0);
END_IF;
END_CASE;
END_IF;
Добавил таймер, чтобы опрашивало каждые 5 секунд по совету lara197a. Не помогло.
Для иллюстрации вот сделал скрин терминала.
16797
На картинке синим выделил запрос, желтым нормальный ответ, красным ненормальный ответ, после которого ПЛК перезагружался.
На первом красном ответе видно, что частотник пытался ответить правильно, поскольку ЦРЦ совпадает с правильным ответом, только вот первый байт вместо 04 - 82.
Второй красный - полная чушь.
После него значение в регистре изменилось, 4 правильных ответа, а потом опять чушь: 40 60 62 54 93, за ним сразу опять неверный ответ, который имеет много общего с предыдущим ответом b0 40 60 62 54 93. следующий неверный ответ потерял первый байт, ЦРЦ ответа правильного, затем опять чушь.
Разобрался. В настройках порта количество стоповых бит 1 - означает 1,5, а 0 - 1. Ошибки связи не пропали, но ПЛК больше не перезагружается. Вдруг кто с таким же столкнется. Меня удивляет, что были правильные ответы при неправильных настройках.
xzadmanx
20.11.2018, 17:55
Аналогичная проблема, но при условии если ставлю два стоповых бита в настройках Ком-порта(
Столкнулся с аналогичной проблемой, плк73 перезагружается и сбрасывает все значения. Пользуюсь овеновской библиотекой для Modbus. Заметил следующее.
Работаю с двумя портами, на одном порту частотники с Modbus.lib, на втором модем с самописным слейвом(проблема не в нем, без этого блока так же перезагружается), подключил к ОРС для проверки работоспособности, отработала программа три дня без отключений. Потом пересоздавал конфигурацию ОРС и перепутал номера COM-портов, на одном интерфейсе оказалось два мастера, на втором три слейва без мастера, и контроллер уходил в постоянную перезагрузку. Найдя проблему подключился просто терминалом на порт с мастером и невпопад слал мастеру всякие символы. Контроллер с 5-10 посылки перезагружался. В отладочном режиме контроллер выдает причину перезагрузки сторожевой таймер.
В итоге "на столе" с нормально настроенным OPC контроллер работает отлично, на объекте постоянно перезагружается.
Это аппаратная защита интерфейса, возможно какое-нибудь наведённое напряжение от ПЧ в интерфейс, или всё таки проблема в Modbus.lib по той же причине? на функциях записи одного регистра используются While, контроллер долго отрабатывает точки останова не удалось проверить нормально на каком моменте происходит сбой.
Филоненко Владислав
10.02.2020, 13:00
Нельзя while использовать. представьте помеха собьёт передачу и while никогда не выполнится. ПЛК перегрузится как раз по сторожевому таймеру.
Сделайте машину состояний. Тогда ПЛК будет работать, точки останова нормально отрабатывать и т.д.
Я это писал про Modbus.lib
FUNCTION_BLOCK MB_UNI_IO
7-я строчка
Мастер использовался из библиотеки.
Непросто разобраться в таком большом листинге, проще написать своего мастера, но мне просто интересна сама реакция ПЛК, на ситуацию когда "два мастера в сети", а в моем случае возможно просто помехи в порт шлют всякий мусор.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot