Показать сообщение отдельно
Старый 05.02.2007, 15:09   #36
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 117
Благодарил(а): 15 раз(а)
Поблагодарили: 660 раз(а) в 604 сообщениях
По умолчанию Ответ: SMLogic

Цитата:
Сообщение от 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.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie вне форума   Ответить с цитированием