This is topic MODBUS - проблема с 16 функцией in forum TRACE MODE 5 бесплатная версия / TRACE MODE 5 Free version at Форум TRACE MODE: техническая поддержка.
Здравствуйте! У меня такая ситуация: необходимо считывать и записывать 4 регистра контроллера по протоколу MODBUS. Контроллер требует что-бы операции с этими регистрами проводились блочно, по одному не отдает. Для чтения я сделал четыре канала типа INPUT, подтипа MODBUS с дополнением Rout Word(3), вид представления HEX. Замечательно читаются регистрики. Если последить за портом видно что читаются они одним блоком. Для записи тоже четыре канала типа OUTPUT, подтип MODBUS, дополнение W Word(16), вид HEX. Вот тут начинаются сплошные вопросы: выпали флаги недостоверности, записи нетушки. Смотрим в порт- драйвер формирует 4 запроса по одному регистру. Кстати при первом после старта МРВ пересчете драйвер пытается писать второй регистр из четырех и только на следующем пересчете начинает с первого. Для первого из четырех регистров контроллер возвращает код ошибки 03 (ошибка данных), для остальных 02 (ошибка адреса). Написал на С тестовую программку - той-же 16-ой функцией пишу в эти регистры те-же самые значения. Пишутся. Пытаюсь писать отдельными регистрами возвращаются те-же коды ошибок. Так-же не понятно назначение настройки Q - если это количество регистров то совсем не понятно как это использовать. Автопостроение всегда ставит Q=1. При установке этого значения больше 1 никакой разницы не заметил. Подскажите пожалуйста, что я делаю не так как надо.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
При чтении действительно все четыре канала уложились в один групповой запрос. ТМ5 укладывает каналы, которые в базе идут друг за другом с одной и той же функцией MODBUS и по порядку идущим смещением адреса в один групповой запрос. Поэтому Вы и наблюдали один запрос на чтение четырех байт. А вот для записи такое не пройдет - ТМ будет формировать запрос для каждого канала индивидуально. Попробуйте функцию W Float(16) - это будет как раз посылка 4-х байт.
Настройка Q в каналах ModBus чисто информативная и никакой функциональности ненесет. Можно не обращать на нее внимания.
Posted by holod (Участник № / Member № 1065) on :
Надо писать в контроллер 4 16-ти разрядных регистра. Если не ошибаюсь, по стандарту протокола именно этим и занимается 16-я функция. Как-же быть, получается что ТМ5 не может писать блочно по MODBUS? Писать свой драйвер?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Да уж - 8 байт ТМ блоком не отправит, максимум 4. Выход - только в собственном драйвере. А что за такое устройство, которое категорически отказывается принять байт или послово как самостоятельную посылку? Странно... Это первое, что должно реализовывать устройство из ModBus, ведь блоковый запрос или блоковая посылка - это расширение для стандартного кадра протокола ModBus, но никак не его основа!
Posted by holod (Участник № / Member № 1065) on :
И все-же, в настройках канала MODBUS есть TYPE,которая предлагает выбор:"Modbus" и "Modbus(нет групповой записи)"-это как можно понимать? В разделе документации посвященной написанию драйверов сказано что драйвер может формировать блоковые запросы, при этом упоминается флаг принадлежности канала к блоку. Почему этот флаг недоступен из инструменталки ТМ5? Неужели из 15000 инсталяций ТМ никто из разработчиков не сталкивался с подобной проблемой? Вам не кажется что это,мягко говоря, ложка дегтя....? Ведь реализация блочной записи не сложнее реализации блочного чтения. Блочное чтение есть а....непонятно,честное пионерское Железка эта называется Sepam производства SchneiderElectric. В этих четырех регистрах у него лежат внутренние дата/время, запрет пословного чтения/записи это своего рода защита от дурака. И тогда еще вопрос: из доки непонятно,драйвер надо писать на WinAPI или можно использовать MFC DLL?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
По поводу блочной записи - дело в том, что все внешние и встроенные драйвера через последовательный интерфейс в ТМ работают по одному и тому же алгоритму TYPE_11, который не поддерживает групповой записи, поэтому это не только минус реализации нашего ModBus'а. Обычно - никто не работает с более чем четырмя байтами по ModBus (формат Float), поэтому никто и не сталкивался с такой проблемой, потому как все что больше 4-х байт обычно устройство позволяет записать раздельно. Флаг принадлежности к групповому запросу система выставляет сама. ТМ все равно что будет использоваться в драйвере - WinAPI или MFC. В драйвре типа TYPE_11 - вся обработка СОМ-порта выполяется нашим сервером, поэтому в самом драйвере Вы реализуете только логику формирования и разбора пакетов. А в драйвере TYPE_12 - обработку "носителя" Вы можете реализовать сами, и это может быть не только СОМ-порт.