Настройка преобразователя Anybus Communicator
Само по себе устройство Anybus Communicator достаточно интересное. Существуют множество его разновидностей на разные конфигурации сетей, которые он может стыковать. Мне посчастливилось работать с Profibus DP на RS232. Особенность этого девайса в том, что его нельзя просто так поставить, выставить адреса и запустить в работу. Его настройка требует достаточно приличных знаний в информатике. И хоть на сайте Anybus Communicator и есть примеры его настройки, но проверял ли кто-нибудь их на работоспособность - я лично сомневаюсь. Потихоньку начнем...
Что это за устройство и как оно работает?
Суть этого преобразователя - связать прозрачно два сегмента сети с разными интерфейсами, например, Profibus и RS232, RS422 или RS485. То есть устройства со стороны Profibus опрашивает Anybus, считывая из его ячеек памяти данные определенной длины. А в эти ячейки памяти данные складываются Anybus'ом, который выступает мастером и циклически опрашивает подключенные к нему устройства со стороны последовательного интерфейса. Вот вся загвоздка и заключается в правильной "разметке памяти" для этих данных.
В самой документации устройство называют шлюзом, а обе эти сети определены так: fieldbus (полевая сеть) - это сторона Profibus DP, а subnetwork (подсеть) - это сторона последовательного интерфейса, к которому подключены опрашиваемые устройства.
Если нужно что-то прочитать из устройства в подсети, мастер-устройство полевой сети просто обращается в область памяти по настроенному заранее адресу для чтения данных (Input data) из устройства Anybus Communicator. Область для записи данных используется для отправки команд или изменения данных в устройстве подсети.
Всё искусство заключается в том, чтобы настроить, с какого адреса и сколько байт нужно считать или записать в память шлюза, чтобы получить то, что нам нужно. Для этого существует специальная программа Anybus Configuration Manager. Она бесплатная, и её можно скачать с официального сайта производителя.
Шаг 1. Настройка шлюза переключателями
Шаг 2. Настройка шлюза в Anybus Configuration Manager
В моем случае в подсети находилось одно устройство на интерфейсе RS232, работающее по протоколу Modbus. И прежде, чем приступить к настройке, нужно вначале собрать данные, что будет считываться из устройства и в каком формате. Вот, что мне нужно считать с устройства:
Параметр | № регистра (DEC) | № регистра (HEX) | Тип | Тип данных | Длина, байт |
---|---|---|---|---|---|
CW Trasar | 656 | 0290 | Input | Floating | 32-bit FLOAT |
CW Tag | 658 | 0292 | Input | Floating | 32-bit FLOAT |
CW Trb | 666 | 029A | Input | Floating | 32-bit FLOAT |
pH 01 | 2664 | 0A68 | Input | Floating | 32-bit FLOAT |
ORP 01 | 2704 | 0A90 | Input | Floating | 32-bit FLOAT |
Temp 03 | 3806 | 0EDE | Input | Floating | 32-bit FLOAT |
Tower Cond1 | 4284 | 10BC | Input | Floating | 32-bit FLOAT |
NCM Ms 01 | 4754 | 1292 | Input | Floating | 32-bit FLOAT |
Теперь, как это "объяснить" шлюзу? Запускаем программу Anybus Configurator Manager (в моем случае актуальна версия 4.4.1.3). Создаем структуру, как показано на рисунке ниже:
После запуска программы в левом окне Устройства есть только элементы Fieldbus, Communicator RS232/422/485 и Подсеть. Если в Подсеть нет никакого устройства, то его можно добавить щелкнув правой кнопкой на значке Подсеть → Добавить Узел. В правой части окна, в поле Конфигурация задается адрес Modbus устройства. У меня оно называется NALCO 3D Trasar.
Теперь самое время добавлять так называемые команды. Правой кнопкой на добавленном узле NALCO 3D Trasar → Добавить команду. Я не знаю, почему во всех примерах и документациях авторы выбирают 0х03 Read Holding Registers для чтения аналоговых величин. Это в корне не верно. Нужно выбирать 0x04 Read Input registers. В результате, получаем дочерние к нашему узлу элемент в виде папки, внутри которого содержатся структура команды на запрос к устройству (Query) и структура ответа устройства (Response). Их нам и нужно правильно заполнить.
Рассмотри каждый элемент подробно, что и как нужно настроить:
Узел | Параметр | Варианты | Значение |
---|---|---|---|
Query | General→Offline options for fieldbus Что отправлять устройствам Подсети, если связь по Profibus отсутствует |
Clear Отправлять нулевые значения Freeze Отправлять последние успешно полученные данные NoScanning Передача данных в подсети останавливается |
Clear |
Query |
General→Offline options for sub-network Что отправлять устройстам по Profibus, если отсутствует связь с устройством в подсети |
Clear Отправлять нулевые значения Freeze Отправлять последние успешно полученные данные |
Clear |
Query |
General→Update mode Как команды передаются в подсеть: |
Cyclically Команды передаются с периодом, заданным в Update time On data change Команды передаются только при изменениях в данных Single shot Команда передается один раз при запуске Change of state trigger Команда передается при изменении триггера |
Cyclically |
Query |
Timing→Minimum time between broadcasts Пауза между широковещательными посылками команд. Пункт используется, если есть широковещательный узел Broadcaster. |
Кратно 10 мс |
100 |
Query |
Timing→Reconnect time Время между повторной попыткой связаться с недоступным узлом. |
Кратно 10 мс. 0 - запрещает повторную попытку установки связи. |
1000 |
Query |
Timing→Retries Количество попыток связаться с недоступным узлом. |
Целое число |
3 |
Query |
Timing→Timeout time Время ожидания ответа от узла до повторной отправки данных. |
Кратно 10 мс |
100 |
Query |
Timing→Update time Минимальное время между однотипными транзакциями. |
Кратно 10 мс |
100 |
Query |
Trigger→Trigger byte address Адрес данных в памяти длиной один байт, изменение которых дает событие срабатывания триггера. |
Адрес в формате HEX |
0x05FF |
Query→Slave Address |
General→Value Адрес в сети Modbus, который будет послан устройства. По-сути, это и адрес узла. |
Не редактируется |
0x7E |
Query→Function |
General→Value Команда по протоколу Modbus. |
Все поддерживаемые Modbus команды |
0x04 |
Query→Starting Address |
General→Value Адрес данных внутри устройства Modbus. Это как раз то, что указано в таблице выше в колонке "№ регистра (HEX)" |
Адрес в формате HEX |
0x0290 |
Query→Quantity Of Input Registers |
General→Value Это длина данных в словах. Таким образом для данных типа FLOAT мы должны использовать 2 слова или 4 байта. |
Целое число |
0x0002 |
Query→Checksum |
General→Error check start byte Номер байта в кадре, начиная с которого вычисляется контрольная сумма. |
Целое число |
0x0000 |
Query→Checksum |
General→Error check type Тип алгоритма вычисления контрольной суммы |
CRC LRC XOR ADD |
CRC |
Query→Checksum |
General→Error check by combined with Способы передачи контрольной суммы в сеть |
None Без преобразования One's complement Преобразование до первого дополнения Two's complement Преобразование до второго дополнения |
None |
Query→Checksum |
General→Representation Представление контрольной суммы |
Binary Без преобразования в двоичном виде ASCII Символы будут преобразованы в значение ACSII кода |
Binary |
Response |
Trigger→Trigger byte Включение или отключение счетчика триггера |
Enabled Изменять триггер при каждом удачном приеме данных из подсети Disabled Не использовать триггер для данной команды |
Disabled |
Response |
Trigger→Trigger byte address Адрес триггера в памяти |
Целое число в формате (HEX) |
0x05FF |
Response→Slave Address |
General→Value Адрес Modbus устройства, передавшего данные |
Не редактируется |
0x7E |
Response→Function |
General→Value Номер Modbus команды, на которую пришел ответ данных |
Не редактируется |
0x7E |
Response→Byte Count |
General→Value Длина ответа - данных в байтах |
Целое число |
0x04 |
Response→Input Registers |
General→Data Length Длина ответа - данных в байтах |
Целое число |
0x0004 |
Response→Input Registers |
General→Data Location Адрес в памяти шлюза, по которому будут размещены полученные данные длиной Data Length (из предыдущего пункта) |
Целое число |
0x0000 - Адреса не должны совпадать для остальных команд, иначе данные будут перезаписаны |
Response→Input Registers |
Operations→Byte swap Определяет, как данные будут размещены в памяти |
No swapping Размещаются как есть, без преобразования Swap 2 bytes Парное переворачивание байт в каждом слове данных, например двойное слово [ABCD] преобазуется в [BADC] Swap 4 bytes Полное переворачивание байт, например двойное слово [ABCD] преобазуется в [DCBA] |
No swapping |
И таких команд должно быть столько, сколько запросов требуется сделать для конкретного устройства. В моем случае для устройства NALCO 3D Trasar выполняется 8 запросов. Команды будут все однотипные, отличия должны быть только в:
- Query→Starting Address (для каждой команды свой регистр в памяти Modbus устройства);
- Query→Quantity Of Input Registers (Длина данных может отличаться);
- Response→Input Registers→General→Data Length (Длина данных зависит от типа);
- Response→Input Registers→General→Data Location (Данные от разных команд должны помещаться по разным адресам);