Модуль |
Имя |
Версия |
Лицензия |
Источник |
Языки |
Платформы |
Тип |
Автор
|
ModBus |
ModBus
|
3.4 |
GPL2 |
daq_ModBus.so |
en,uk,ru,de |
x86,x86_64,ARM
|
Сбор Данных |
Роман Савоченко
|
Описание
|
Предоставляет реализацию клиентского сервиса протокола ModBus. Поддерживаются ModBus/TCP, ModBus/RTU и ModBus/ASCII протоколы.
|
ModBus |
ModBus
|
2.9 |
GPL2 |
daq_ModBus.so |
en,uk,ru,de |
x86,x86_64,ARM
|
Протокол |
Роман Савоченко
|
Описание
|
Предоставляет реализацию протоколов ModBus. Поддерживаются ModBus/TCP, ModBus/RTU и ModBus/ASCII протоколы.
- Общая трудоёмкость: > 20 ЧД[!]
- Сделать (To Do):
- - добавить опцию 'L' для байтов регистра в порядке "младший-первый" (LE) вместо стандартного "старший-первый" (BE).
|
ModBus — коммуникационный протокол, основанный на клиент-серверной архитектуре. Разработан фирмой Modicon для использования в контроллерах с программируемой логикой (PLC). Стал стандартом де-факто в промышленности и широко применяется для организации связи промышленного электронного оборудования. Используется для передачи данных через последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP. В настоящее время поддерживается некоммерческой организацией ModBus-IDA.
Существуют три режима протокола: ModBus/RTU, ModBus/ASCII и ModBus/TCP. Первые два используют последовательные линии связи (в основном RS-485, реже RS-422/RS-232), последний использует сети TCP/IP для передачи данных.
Модуль сбора данных предоставляет возможность собирать информацию у различных устройств по протоколу ModBus во всех режимах. Также, модулем реализуются функции горизонтального резервирования, а именно — совместной работы с удалённой станцией этого-же уровня. В то же время, модуль протокола позволяет сформировать и выдать данные по протоколу ModBus в различных режимах и через интерфейсы, поддерживаемые модулями подсистемы "Транспорты".
1 Общее описание протокола ModBus
Протокол ModBus/{RTU,ASCII} предполагает одно ведущее (запрашивающее) устройство в линии (master), которое может передавать команды одному или нескольким ведомым устройствам (slave), обращаясь к ним по уникальному адресу в линии. Синтаксис команд протокола позволяет адресовать 247 устройств на одной линии связи стандарта RS-485 (реже RS-422 или RS-232). В случае с режимом TCP, адресация исключена из протокола, поскольку выполняется на уровне TCP/IP стека.
Инициатива осуществления обмена всегда исходит от ведущего устройства. Ведомые устройства прослушивают линию связи. Мастер подаёт запрос (посылка, последовательность байт) в линию и переходит в режим прослушивания линии связи. Ведомое устройство отвечает на запрос, пришедший на его адрес.
Окончание ответной посылки определяется в зависимости от режима. В режиме RTU окончание посылки определяется по временному интервалу между окончанием приёма предыдущего байта и началом приёма следующего — время символа. Если этот интервал превысил время, необходимое для приёма полтора байта на заданной скорости передачи то приём фрейма ответа считается завершённым. В режиме ASCII критерием окончания посылки является символ '\r', а в режиме TCP — ожидаемый размер посылки, информация о котором присутствует в заголовке пакета.
1.1 Адресация
Все операции с данными привязаны к нулю, каждый вид данных (регистр, бит, регистр входа или бита входа) начинаются с адреса 0 и заканчиваются 65535.
1.2 Стандартные коды функций
В протоколе ModBus можно выделить несколько подмножеств команд (Таблица 1).
Таблица 1: Подмножества команд протокола ModBus
Подмножество |
Диапазон кодов
|
Стандартные |
1-21
|
Резерв для расширенных функций |
22-64
|
Пользовательские |
65-119
|
Резерв для внутренних нужд |
120-255
|
Модулем сбора данных используются команды 3 и 6(16) для чтения и записи регистров, 1 и 5(15) для чтения и записи битов, 2 и 4 для чтения бита и регистра входа, соответственно. Для реализации остальных и нетипичных команд модулем предусмотрена функция API пользовательского программирования, которую можно вызывать из процедуры шаблона логического уровня, отправляя произвольные PDU пакеты и обрабатывая полученные в ответ.
Модуль протокола обрабатывает запросы командами 3 и 6(16) для чтения и записи регистров, 1 и 5(15) для чтения и записи битов.
2 Модуль реализации протокола
Модуль протокола ModBus содержит код реализации протокольной части ModBus, а именно — особенности вариантов протоколов ModBus/TCP, ModBus/RTU и ModBus/ASCII. Модуль протокола, совместно с выбранным транспортом, активно используется модулем сбора данных для осуществления непосредственных запросов. Поскольку модуль протокола является автономным то, используя его, можно создавать дополнительные модули сбора данных посредством нестандартных функций расширения ModBus различного оборудования автоматизации.
2.1 API функции исходящих запросов
API функции исходящих запросов (messIO()) оперируют обменом блоками PDU, завёрнутыми в XML-пакеты, со следующей структурой:
- <{prt} id="{sId}" reqTm="{reqTm}" node="{node}" reqTry="{reqTry}">{pdu}</{prt}>
- Где:
- prt — имя тега запроса с названием используемого варианта протокола (TCP, RTU или ASCII).
- sId — идентификатор источника запроса. Используется для помещения в отчёт выходного протокола.
- reqTm — время запроса, а именно — время, в течение которого, ожидать ответ, в миллисекундах.
- node — номер узла назначения или идентификатор юнита ModBus/TCP.
- reqTry — количество попыток повторения запроса с ошибкой в ответе. Только для вариантов ModBus/{RTU,ASCII}.
- pdu — непосредственно блок юнита данных (PDU) протокола ModBus.
Результирующий pdu в XML-пакете заменяет pdu запроса, а также устанавливается атрибут "err" с кодом и текстом ошибки, если таковая имела место.
2.2 Обслуживание запросов по протоколу ModBus
Входная часть, обслуживания запросов к модулю протокола, осуществляет проверку и обработку запросов посредством предусмотренных модулем объектов узлов (рис.1). Фактически, реализуется механизм, позволяющий OpenSCADA выполнять роль сервера ModBus/TCP или подчинённого устройства ModBus/{RTU,ADCII}. Таким образом, OpenSCADA получает возможность использоваться в роли любого участника сети ModBus.
Рис.1. Вкладка перечня узлов обслуживания входящих запросов протокола.
Узел протокола эквивалентен физическому узлу устройства сети ModBus и может работать в трёх режимах:
- "Данные" — режим отражения данных OpenSCADA на массивы регистров и битов ModBus с передачей их по запросу клиентского узла или мастера.
- "Шлюз узла" — режим перенаправления (шлюзования) запросов к узлу в другой сети ModBus через данный узел.
- "Шлюз сети" — режим перенаправления запросов к любому узлу в другую сеть ModBus, фактически выполняя интеграцию нескольких сетей ModBus в одну.
Поскольку узлов протокола может быть создано множество то получается, что на одном интерфейсе, т.е. в одной сети, одна станция на основе OpenSCADA может прозрачно представлять несколько узлов сети ModBus с различными данными.
Рассмотрим особенности конфигурации узла протокола в различных режимах.
2.2.1 Режим "Данные"
Режим используется для отражения данных OpenSCADA на массивы регистров и битов ModBus. Общая конфигурация узла осуществляется во вкладке "Узел" (рис.2) параметрами:
- Состояние узла, а именно: статус, "Включен" и имя БД, содержащей конфигурацию, с отслеживанием наличия данных в различных хранилищах и предоставлением последовательного удаления дубликатов.
- Идентификатор, имя и описание узла.
- Состояние "Включен", в которое переводить узел при загрузке.
- Адрес узла сети ModBus от 1 до 247.
- Входной транспорт, к сети которого относится узел. Выбирается из перечня входных транспортов подсистемы "Транспорты" OpenSCADA. Указание символа "*" в качестве транспорта делает данный узел участником любой сети ModBus с обработкой запросов от любого транспорта.
- Вариант протокола ModBus, запросы в котором должен обрабатывать узел, из списка: Все, RTU, ASCII, TCP/IP.
- Выбор режима, в данном случае этот режим "Данные".
- Период обсчёта данных в секундах. Указывает период обработки формируемых для запросов данных, а именно: таблицы данных ModBus, программы обсчёта данных и обслуживание ссылок на данные OpenSCADA.
- DAQ шаблон или язык прямой процедуры. Предусматривает выбор шаблона или языка прямой процедуры для формирования и вычисления таблиц данных ModBus, а также для обслуживания внешних ссылок на модель данных подсистемы "Сбор Данных".
Узлом в этом режиме обрабатываются следующие стандартные команды протокола ModBus:
- 1 — чтение группы битов;
- 2 — чтение группы битов входов;
- 3 — чтение группы регистров;
- 4 — чтение группы регистров входов;
- 5 — установка одного бита;
- 6 — установка одного регистра;
- 15 — установка группы битов;
- 16 — установка группы регистров.
Рис.2. Вкладка "Узел" страницы конфигурации узла протокола в режиме "Данные".
Для формирования таблицы отражения данных сети ModBus, а именно регистров и битов, предусматривается вкладка "Данные" (рис.3). Вкладка "Данные" содержит таблицу параметров и программу обработки параметров указанным языком программирования доступным в OpenSCADA, но по шаблону тут доступна только таблица и в режиме "Включено". Таблица содержит параметры со свойствами:
- Идентификатор — идентификатор параметра, является ключевым в формировании таблиц регистров и битов ModBus. Регистры и биты ModBus указываются следующим образом:
- R{N}[w~], RI{N}[w~] — специфичная форма регистра и регистра входа, может быть расширена суффиксами: "i"—Int32, "f"—Float, "d"—Double, "s"—Строка (размер по умолчанию 10 и до 100 регистров);
- R:{N}[:w~]', RI:{N}[:w~] — классическая форма регистра и регистра входа, может быть расширена суффиксами: "i4"—Int32, "i8"—Int64, "f"—Float, "d"—Double, "s"—Строка;
- C{N}[w], CI{N}[w], C:{N}[:w], CI:{N}[:w] — бит и бит входа.
- Где:
- {N} — адрес данных ModBus устройства (десятичный, шестнадцатеричный, или восьмеричный) [0...65535];
- w~ — флаги: режим записи 'w', инверсия порядка регистров '~'.
- Примеры:
- "R0x300" — доступ к регистру;
- "C100w" — доступ к биту, доступен для записи;
- "R_f200", "R_f200~" — получить вещественное из регистров 200 и 201, 201 и 200;
- "R_i400,300" — получить int32 из регистров 400 и 300;
- "R_s15,20" — получить строку, блок регистров, из регистра 15 и размером 20;
- "R_i8:0x10:w" — получить и установить int64 в регистры [0x10-0x13];
- "R_d:0x20,0x30" — получить вещественное двойной точности (8 байтов) из регистров [0x20,0x30-0x32].
- Все остальные параметры, не попавшие под вышеуказанные правила, являются внутренними, используются для различных промежуточных вычислений, обработки, преобразований и значения их могут быть оперативно проконтролированы и изменены из этой таблицы в режиме исполнения.
- Имя — имя параметра, используется для именования связи.
- Тип — тип параметра из списка: "Вещественный", "Целый", "Логический" и "Строка". Для регистров и битов ModBus имеет смысл устанавливать "Целый" и "Логический" тип, соответственно. Для регистров, расширенных префиксами "f" и "s", нужно указывать типы "Вещественный" и "Строка", соответственно.
- Связь — признак того, что данный параметр должен связываться с атрибутом параметра подсистемы "Сбор данных". Указанные этим флагом связи устанавливаются во вкладке "Конфигурация шаблона".
- Значение — исходное или текущее значение параметра, если узел включен.
В таблице, по умолчанию, определяется несколько параметров специального назначения:
- f_frq — частота вычисления таблицы программой;
- f_start — признак первого исполнения — запуска программы.
- f_stop — признак последнего исполнения — останова программы.
Поскольку в указателе расширенных типов регистров может использоваться недопустимый символ ',' то доступ к нему из программы можно осуществить только альтернативным способом, через объект "arguments":
arguments["R_s10,5w"] = "9876543210";
Рис.3. Вкладка "Данные" страницы конфигурации узла протокола в режиме "Данные".
Для параметров указанных в качестве связей, связи можно установить для включенного узла протокола и во вкладке "Конфигурация шаблона" (рис.4).
Рис.4. Вкладка "Связи" страницы конфигурации узла протокола в режиме "Конфигурация шаблона".
2.2.2 Режим "Шлюз узла"
Режим используется для перенаправления запросов к отдельному устройству в другой сети ModBus, из сети ModBus для которой сконфигурирован данный узел. Общая конфигурация узла осуществляется во вкладке "Узел" (рис.5) параметрами:
- Состояние узла, а именно: статус, "Включен" и имя БД, содержащей конфигурацию.
- Идентификатор, имя и описание узла.
- Состояние "Включен", в которое переводить узел при загрузке.
- Адрес узла исходной сети ModBus от 1 до 247.
- Входной транспорт, к сети которого относится узел. Выбирается из перечня входных транспортов подсистемы "Транспорты" OpenSCADA. Указание символа "*" в качестве транспорта делает данный узел участником любой сети ModBus с обработкой запросов от любого транспорта.
- Вариант протокола ModBus запросы, в котором должен обрабатывать узел, из списка: Все, RTU, ASCII, TCP/IP.
- Выбор режима, в данном случае этот режим "Шлюз узла".
- Транспорт, в который перенаправлять запрос, из перечня исходящих транспортов подсистемы "Транспорты".
- Протокол, в котором перенаправлять запрос.
- Адрес узла сети ModBus, от 1 до 247, в которую перенаправляется запрос.
Рис.5. Вкладка "Узел" страницы конфигурации узла протокола в режиме "Шлюз узла".
2.2.3 Режим "Шлюз сети"
Режим используется для перенаправления запросов сети целиком в другую сеть ModBus, из сети ModBus для которой сконфигурирован данный узел протокола. Т.е., запрос на устройство с любым адресом будет направляться в другую сеть, без переадресовки. Общая конфигурация узла протокола осуществляется во вкладке "Узел" (рис.6) параметрами:
- Состояние узла, а именно: статус, "Включен" и имя БД, содержащей конфигурацию.
- Идентификатор, имя и описание узла.
- Состояние "Включен", в которое переводить узел при загрузке.
- Входной транспорт сети, из которой перенаправляются запросы. Выбирается из перечня входных транспортов подсистемы "Транспорты" OpenSCADA.
- Вариант протокола ModBus, запросы в котором должен обрабатывать узел, из списка: Все, RTU, ASCII, TCP/IP.
- Выбор режима, в данном случае этот режим "Шлюз сети".
- Транспорт сети, в которую перенаправлять запрос, из перечня выходных транспортов подсистемы "Транспорты".
- Протокол, в котором перенаправлять запрос.
Рис.6. Вкладка "Узел" страницы конфигурации узла протокола в режиме "Шлюз сети".
2.3 Отчёт запросов ModBus
Для контроля и диагностики за корректностью осуществления запросов различными компонентами, модулем предоставляется возможность включения отчёта запросов, проходящих через модуль протокола. Отчёт включается указанием ненулевого количества записей во вкладе "Отчёт" страницы модуля протокола (рис.7).
Этот механизм в основном является устаревшим, поскольку его функции сейчас исполняются ядром программы:
Рис.7. Вкладка "Отчёт" страницы модуля протокола.
3 Модуль сбора данных
Модуль сбора данных предоставляет возможность опроса и записи регистров и битов устройств посредством режимов протокола TCP, RTU, ASCII и команд запроса 1 — 6, 15, 16.
3.1 Объект контроллера
Для добавления источника данных ModBus создаётся и конфигурируется объект контроллера OpenSCADA. Пример вкладки конфигурации объекта контроллера данного типа изображен на рисунке 8.
Рис.8. Вкладка конфигурации объекта контроллера.
С помощью этой вкладки можно установить:
- Состояние объекта контроллера, а именно: Статус, "Включен", "Выполняется" и имя БД, содержащей конфигурацию.
Ручной перезапуск включенного объекта контроллера вызывает принудительное переформирование блоков сбора.
- Идентификатор, имя и описание контроллера.
- Состояние "Включен" и "Выполняется", в которое переводить объект контроллера при загрузке.
- Имя таблиц хранения конфигурации параметров контроллера стандартного и логического типа.
- Политика планирования и приоритет задачи сбора данных.
- ModBus протокол, используемый для опроса физического устройства (TCP/IP, RTU или ASCII).
- Адрес исходящего транспорта из списка сконфигурированных исходящих транспортов в подсистеме "Транспорты" OpenSCADA. Типовой порт ModuBus/TCP это 502. Поле может быть установлено в пустое и изменено во время исполнения.
- ModBus узел назначения. В случае с протоколами RTU и ASCII это индивидуальный адрес физического устройства, а для TCP/IP это идентификатор единицы.
- Объединение фрагментов регистров. Стандартные функции 1-4 позволяют запросить сразу несколько смежных регистров или битов. Такая стратегия часто позволяет оптимизировать трафик и время. Однако, нужные регистры не всегда расположены смежно друг к другу и данная опция позволяет собирать их в блоки до 100 регистров или 1600 битов.
К установке данного параметра нужно подходить с осторожностью, поскольку не все устройства поддерживают доступ к регистрам между фрагментами.
- Использовать функции записи нескольких элементов (15, 16). Вместо функций одно-элементной записи будут использованы много-элементные.
- Асинхронная запись. Включает асинхронную запись изменений в контроллер, в общем цикле опроса и после самого опроса данных, блокируя чтение записанных значений на один цикл (до очистки буфера записи).
-
Этот режим также предотвращает потере записанных данных при потере подключения и записанные данные будут переданы только подключение будет восстановлено. При этом блокируется чтение только что записанных данных, чтобы дать время ПЛК принять изменения.
- Время ожидания соединения в миллисекундах. Указывает промежуток времени, в течение которого ожидать ответа. В случае указания нулевого значения используется время ожидания по умолчанию в транспорте. Позволяет учитывать индивидуальные свойства контроллера в общей сети.
- Время восстановления соединения в секундах. Указывает промежуток времени, по истечению которого осуществлять повторную попытку запроса к ранее недоступному устройству.
- Попыток запроса для протоколов RTU и ASCII. Указывает на количество попыток повторения запроса в случае получения неполного или повреждённого ответа.
- Максимальный размер блока запроса в байтах, полезен для контроллеров с таким ограничением.
3.2 Параметры
Модуль сбора данных предоставляет два типа параметра: "Стандартный (std)" и "Логический (logic)". Дополнительными конфигурационными полями параметров данного модуля являются:
- Стандартный (std):
- Перечень атрибутов — содержит структурированный список конфигурации атрибутов ModBUS.
- Логический (logic):
- Шаблон параметра — адрес шаблона параметра DAQ.
3.2.1 Стандартный (std)
Главная страница конфигурации параметра стандартного типа представлена на рисунке 9.
Рис.9. Вкладка конфигурации параметра стандартного типа.
Линия атрибута в параметре списка атрибутов записывается как "{dt}:{numb}[:{flg}[:{id}[:{name}]]]".
Где:
- dt — тип данных ModBus ("R"—регистр[3,6(16)], "C"—бит[1,5(15)], "RI"—регистр входа[4], "CI"—бит входа[2]);
- "R" и "RI" могут быть расширены суффиксами: "i2"—Int16, "i4"—Int32, "i8"—Int64, "u2"—UInt16, "u4"—UInt32, "f"—Float, "d"—Double, "b5"—Бит5, "b"—Бит в адресе, "s"—Строка (размер по умолчанию 10 и до 100 регистров);
- numb — адрес ModBus устройства (десятичный, шестнадцатеричный или восьмеричный) [0...65535];
- flg — флаги: режим чтения/записи (r-чтение, w-запись), строгий режим запроса (без комбинирования) 's', инверсия порядка регистров '~';
- id — идентификатор создаваемого атрибута;
- name — имя создаваемого атрибута.
Примеры:
- "R:0x300:rw:var:Variable" — доступ к регистру;
- "C:100:rw:var1:Variable 1" — доступ к биту;
- "R_f:200:r:float:Float", "R_f:200:r~:float:Float" — получить вещественное из регистров 200 и 201, 201 и 200;
- "R_i4:400,300:r:int32:Int32" — получить int32 из регистров 400 и 300;
- "R_b10:25:r:rBit:Reg bit", "R_b:25.10:r:rBit:Reg bit" — получить бит 10 из регистра 25;
- "R_s:15,20:r:str:Reg blk" — получить строку (блок регистров) из регистра 15 и размером 20.
Линия, которая начинается с символа '#', считается комментарием и не обрабатывается.
В соответствии с указанным списком атрибутов выполняется опрос и создание атрибутов параметра (рис.10).
Рис.10. Вкладка атрибутов параметра стандартного типа.
3.2.2 Логический (logic)
Главная страница конфигурации параметра логического типа представлена на рисунке 11.
Рис.11. Вкладка конфигурации параметра логического типа.
Значение ссылки при конфигурации шаблона (рис.12) записывается в форме
"{dt}:{numb}[:{flg}]".
Где:
- dt — тип данных ModBus ("R"—регистр[3,6(16)], "C"—бит[1,5(15)], "RI"—регистр входа[4], "CI"—бит входа[2]);
- "R" и "RI" могут быть расширены суффиксами: "i2"—Int16, "i4"—Int32, i8-Int64, u2-UInt16, u4-UInt32, "f"—Float, "d"—Double, "b5"—Бит5, "b"—Бит в адресе, "s"—Строка (размер по умолчанию 10 и до 100 регистров);
- numb — адрес данных ModBus устройства (десятичный, шестнадцатеричный или восьмеричный) [0...65535];
- flg — флаги: режим чтения/записи (r-чтение, w-запись), инверсия порядка регистров '~'.
Примеры:
- "R:0x300:rw" — доступ к регистру;
- "C:100:rw" — доступ к биту;
- "R_f:200:r", "R_f:200:r~" — получить вещественное из регистров 200 и 201, 201 и 200;
- "R_i4:400,300:r" — получить int32 из регистров 400 и 300;
- "R_b10:25:r", "R_b:25.10:r" — получить бит 10 из регистра 25;
- "R_s:15,20:r" — получить строку (блок регистров) из регистра 15 и размером 20.
Рис.12. Вкладка "Конфигурация шаблона" параметра логического типа.
Модулем предусмотрена особая обработка ряда атрибутов шаблона:
- f_frq — частота вычисления процедуры шаблона или время после последнего вычисления (отрицательное в секундах) для планирования по CRON, только чтение.
- f_start — флаг первого выполнения процедуры шаблона — запуск, только чтение.
- f_stop — флаг последнего выполнения процедуры шаблона — останов, только чтение.
- f_err — ошибка параметра, полный доступ. Значение этого атрибута шаблона попадает в атрибут ошибки параметра "err". Записать сюда EVAL для возможности установки извне атрибута "err" и всех других в режиме Только для Чтения.
- SHIFR — значение шифра параметра, только чтение.
- NAME — значение имени параметра, только чтение.
- DESCR — значение описания параметра, только чтение.
- this — объект данного параметра, позволяет получить доступ к атрибутам параметра, например, для доступа к архивам-истории.
В соответствии с шаблоном, лежащим в основе параметра, мы получаем набор атрибутов параметра (рис.13).
Рис.13. Вкладка атрибутов параметра логического типа.
3.3 API пользовательского программирования
В виду поддержки параметров логического типа, имеет смысл предоставление ряда функций пользовательского API для их вызова из шаблона логического параметра.
Объект "Контроллер" [this.cntr()]
- string messIO(string pdu) — отправка PDU pdu через транспорт объекта контроллера посредством ModBus протокола. PDU результата запроса помещается вместо запроса в pdu, а ошибка возвращается в результате функции.
Объект "Параметр" [this]
- bool attrAdd( string id, string name, string tp = "real", string selValsNms = "" ) [для включенного параметра логического типа] — добавление атрибута id с именем name и типом tp. Если атрибут уже присутствует то будут применены свойства, которые возможно изменить "на ходу": имя, режим выбора и параметры выбора.
- id, name — идентификатор и имя нового атрибута;
- tp — тип атрибута [boolean | integer | real | string | text | object] + режим выбора [sel | seled] + только для чтения [ro];
- selValsNms — две строки со значениями в первой и их именами во второй, разделённые ";".
- bool attrDel( string id ) [для включенного параметра логического типа] — удаление атрибута id.
4 Ссылки