Цитата:
Сообщение от lau
Пытаюсь подключить устройство с протоколом Modbus и считывать и изменять состояния его дискретных выходов и входов.
Возьмем для начала один дискретный выход.
Для этого создаю карту памяти Slave для переменной типа boolean, с направлением R/W(out), периодом 100 и адресом 1, что приводит к созданию переменной для чтения/записи. Причем чтение происходит функцией 01, а записи 15 (при конвертировании карты памяти в конфигурационный файл для ОРС Lectus получаются именно эти функции). Согласно же спецификации ModBus функция 01 и 15 служат для чтения и соответственно записи статуса последовательности выходов.
Это бы устроило, но так как в SMLogix сетевая переменная типа boolean, то и последовательность увидеть или записать не удается (при любой комбинации состояний выходов при чтении или записи переменная будет равна 1 или 0).
Как быть в этом случае? Ведь явно задать функцию 05 для установки единичного выхода нет возможности, то же самое и для чтения.
Не говорит ли это о какой-то неполноте реализации протокола ModBus?
Может есть какое-то решение данной задачи?
|
Функция 15 (force multiple coils) осуществляет последовательную запись нескольких битовых переменных - "койлов". Минимальная размерность последовательности - 1. Насколько я понимаю, это вам и нужно.
"Последовательность" в данном случае подразумевает возможность (именно возможность, а не обязательность) объединения нескольких переменных в один запрос (один пакет данных) для более рационального использования пропускной способности канала связи. Для объединения переменных должны выполниться три условия: переменные должны быть одного типа, переменные должны принадлежать одному устройству, переменные должны размещаться в карте памяти подряд без разрывов в адресации (причём не важно, по возрастанию адресов или по убыванию).
"Многобулевых" переменных не существует, если я правильно понял ваши слова "сетевая переменная типа boolean, то и последовательность увидеть или записать не удается (при любой комбинации состояний выходов при чтении или записи переменная будет равна 1 или 0)", есть только несколько расположенных подряд "обычных" переменных типа "boolean".
Функций "одиночного чтения" в модбасе не существует ни для каких типов данных. Для всех функций чтения (01, 02, 03 и 04) верны все те предпосылки, описанные для функции 15.
Прошу вас пояснить задачу, которую вам невозможно решить в нашей реализации modbus-rtu.