К сожалению, к ошибкам от помех добавляются ещё и ошибки от программной обработки. Именно о них и шла речь в моем сообщении. При переходе к контроллеру М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] можно с помощью приведенной ниже тест-программы.





Ответить с цитированием
