Здравствуйте. ПЛК110-24.30.Р-М [М02]. На RS-485-1 висит модуль МВ110-32ДН (ошибок нет), на RS-485-2 панель СПК110 (панель мастер). Так панель его не видит (в Codesys V3 пишет Bus_Failure). Меняю порты местами (RS-485) - все работает. RS-485-2 не может работать по Modbus Slave или что?
Предистория - появление ошибок обмена через COM-порт после перехода на М2...
С целью выявления причин ошибок протестировал функцию SysComRead, используемую при разборе пакета данных на фрагменты.
Тестирование предусматривало циклический опрос функции с регистрацией момента появления очередного фрагмента и его размера. Отсчет времени - по основному циклу контроллера 1ms.
В случае старого контроллера функция возвращала значение от 1 до 12, в зависмости от скорости обмена.
А вот для М2 размер фрагмента, исключая последний, всегда составляет не менее 14 байтов. Кроме того последний межфрагментный интервал увеличен на длительность обмена в несколько (3-5) байт.
Для библиотеки Modbus.lib в режиме RTU, использующей в качестве тайм-аута межпакетный интервал в 3ms для фрагментов начиная со второго, с небходимостью должны возникать ошибки при скорости обмена менее 14 байт за 3ms.
Еще один "подводный камень" SysComRead заключается при ее использовании для очистки входного буфера перед началом обмена. Мусор, прилетевший менее чем за время обмена 3-5 байтами, просто не виден (см. замечание о последнем межфрагментном интервале).
Однако все это внешнее поведение функции, а что в ней спрятано достоверно могут рассказать только разработчики (магическое число 14 навивает мысль об аппаратном буфере в ИМС процессора).
Ниже приведена тест-программа для контроллера М2. Входные переменные: скорость обмена и длина передаваемого пакета.
Временные интервалы отсчитываются по основному циклу контроллера 1 мс.
Для работы программы необходимо соединение двух СОМ-портров минимально в одном направлении или "эхо" для одного.
Информация по котроллеру М2:
PLC model MODEL PLC 110-60
Binary VERSION 0.3.67
Need Target version >= 3.10
Compiled: 13:05:36 Feb 8 2017
STM32 binary version 114
Последний раз редактировалось pan2000; 01.04.2017 в 09:05. Причина: Перенос программы в другое сообщение
Всегда читайте по 1-му байту и разбирайте последовательно. Ожидать N символов от последовательного интерфейса с возможностью помех - нельзя.
Пример правильной машины состояний для разбора приведен в стандарте ModBus.
P.S. таки да, 14 байт размер FIFO.
Тролль-наседка, добрый, нежный и ласковый
К сожалению, к ошибкам от помех добавляются ещё и ошибки от программной обработки. Именно о них и шла речь в моем сообщении. При переходе к контроллеру М2 изменилось поведение функции SysComRead. И для исправления ранее безошибочно работающих программ, одной рекомендации "читайте по 1-му байту" (если под этим подразумевается значение параметра "Число считаемых байт" =1) мало. Алгоритмы, чувствительные к более-менее равномерному поступлению байт, на длинных пакетах и при низких скоростях начинают отказывать.
------------------
Начну с того,что сведенья о параметрах функции SysComRead, приведенные в документации, весьма лаконичны:
dwBytesToRead DWORD Число считаемых байт
О тайном смысле параметра остается только догадываться основываясь на собственном опыте и экспериментми с функцией.
По результатам тест-программы (исходный текст в приложении):
Для функции, выполняющейся на старом контроллере, это параметр следует считать "размером используемого буфера", который ограничивает максимальное значение функции (и соответственно заполнение буфера). Значение функции - число принятых байт на момент обращения к функции. Допустимые значения от нуля и по "Число считаемых байт". Функция принимает ненулевые значения в темпе приема байта контроллером.
Для функции, выполняющейся на контроллере М2, этот параметр следует считать "МИНИМАЛЬНЫМ числом считываемых байт", ограничивающим минимальное, отличное от нуля, значение функции. Верхнее значение равно размеру FIFO. функция принимает ненулевые значения только после заполнения FIF0 и строго в ПОСЛЕДОВАТЕЛЬНЫХ циклах опроса (не следует забывать, что в тест-программе одно обращение к функции за 1 временной интервал). Для незаполненного FIFO к задержке появления ненулевых значений функции после завершения приема пакета добавляется временной интервал несколько байт (3-5 ?).
В библиотеке Modbus.lib вариант RTU для функции значение параметра "Число считаемых байт" явно указано как размер массива из 256 байт. В приложении приведены распределения приема пакета, имитирующие работу Modbus.lib (RTU) для наиболее "плохой" длины пакета (чтение 11 регистров), для обоих типов контроллера. На М2 прием пакета завершится с ошибкой из-за большой длительности "межфрагментного" интервала.
Для чтения не более 4-х регистров прием осуществляется за "одно" FIFO. Т.е. при использовании Modbus.lib RTU "не читайте медленно более 4-х регистров".
Посмотреть поведение функции SysComRead для контроллера 110[M2] можно с помощью приведенной ниже тест-программы.
Последний раз редактировалось pan2000; 01.04.2017 в 12:25. Причина: Изменение текста и приложений