Тип данных word modbus

Содержание

  • 1 Введение
  • 2 Modbus-протокол. Общая информация
  • 3 Регистрация Modbus-устройств в Tekon OPC-сервер
    • 3.1 Тестовый опрос устройства 
    • 3.2 Тестовая запись значения регистра
    • 3.3 Особенности представления значений Modbus-регистров 
    • 3.4 Как регистрировать битовую маску ошибок
  • 4 Настройка SCADA
  • 5 Демонстрационный пример

Введение

Настройка Modbus  в  АСУД.SCADA может быть выполнена двумя способами:

  • регистрация устройства непосредственно  в Tekon OPC-сервер
    • это новый способ доступный с версии АСУД.SCADA 2.6.3
    • целесообразно использовать на всех новых объектах где добавляются Modbus-устройства
    • при этом варианте не используется БД original.gdb все настройки выполняются непосредственно в ОРС-сервере
    • поддерживается практически полный фунционал настройки, аналогичный ASUDBase
      • исключение — возможность выполнить запись в регистр по другому адресу (отличному от адреса чтения) доступна пока только при регистрации в ASUDBase
    • опрос осуществляется непосредственно OPC-сервером, программа KCSLogger не нужна
  • регистрация устройства в программе ASUDBase
    • целесообразно использовать, если у вас уже есть Modbus-устройства, зарегистрированные в программе ASUDBase
    • опрос осуществляется программой KCSLogger

Данная статья ориентируется на настройку Modbus-устройств непосредственно в OPC-сервере версии 2.7.2 (и выше) и не расматривает возможность настройки устройств в программе ASUDBase

Если, по каким-то причинам вы планируете выполнять настройку устройств в программе ASUDBase, либо  в АСУД.SCADA 2.5.х и ранее , а также настройку Modbus c конценратором  КЦС-М смотри предыдщую редакцию статьи.

АСУД-248 позволяет реализовать взаимодействие с ЛЮБЫМИ устройствами, поддерживающимипротокол Modbus.

Modbus-устройства могут быть подключены к концентраторам:

  • КЦС-IPM / КУН-IPM
  • КЦС-М (есть ограничения в типе поддерживаемых устройств, подробнее см. тут)
  • напрямую по компьютерной сети.

КЦС-IPM / КУН-IP

Тракт передачи данных:

Устройство Modbus -- RS-232/485 --  КЦС-IPM / КУН-IP -- Компьютерная сеть -- АРМ-диспетчера
Поддерживаются спецификации Modbus-RTU, Modbus TCP
Чтение данных одиночное, групповое
Запись данных одиночная
Число подключаемых устройств до 255* на каждом интерфейсе

 
* — подробнее см. спецификацию подключаемого устройства и интерфейса подключения.

Внимание:

  • Требуется наличие USB-ключа защиты АСУД.SCADA.
    В ключе защиты ПО АСУД.SCADA должно быть прописано число драйверов EXT-модуля, соответствующее общему числу подключаемых приборов.
    Для тестового опроса устройства в конфигураторе ОРС-сервера драйвер не требуется.
  • Следует придерживаться следующего правила при адресации Modbus-устройств: устройства, подключаемые к одному IP-концентратору должны иметь уникальные адреса (RS-идентификаторы).

Прямое подключение по компьютерной сети

Тракт передачи данных:

Устройство Modbus с Ethernet -- Компьютерная сеть -- АРМ-диспетчера

Остальное аналогично случая подключения к КЦС-IPM / КУН-IP, рассматриваемому далее

Modbus-протокол. Общая информация

Modbus — это коммуникационный протокол широко применяемый в промышленности. Он определяет правила пересылки данных при взаимодействии устройств.

Мы можем реализовать диспетчеризацию и управления практически любого устройства, если оно поддерживает данный протокол.

Есть несколько модификаций данного протокола:

  • Modbus RTU
  • Modbus TCP
  • Modbus ASCII (в настоящее время не поддерживается в АСУД-248)

Само слово «Modbus» — ничего не говорит об интерфейсе между устройствами.

Протокол Modbus может работать поверх интерфейсов RS-485/RS-232, компьютерной сети и других.

С точки зрения доступа к данным устройство Modbus представляет собой таблицу, примерно следующего вида

Адрес регистра Атрибуты Параметр Значение
1 R/W, Целое число Уставка температуры 15
2 R, Целое число * 10 Температура наружного воздуха -156
301 R, Дробное число Частота сети 49,8

где,

  • Адрес регистра — уникальный идентификатор параметра, по которому осуществляется запрос значения параметра
    Идентификатор находится в диапазоне 0 .. 65536.
  • Атрибуты — атрибуты параметра
    • R — параметр можно читать
    • W — параметр можно записывать
    • Целое число — параметр представляет собой целое число
    • Целое число * 10 — параметр следует разделить на 10 для получения реального значения
    • Дробное число — параметр представляет собой дробное число
  • Параметр — описание параметра
  • Значение — текущее значение параметра
Внимание!
Таблица должна быть отражена в технического документации конкретного устройства. 
Таблица не универсальна для разного типа Modbus-устройств.
Без наличия таблицы настроить устройство не получится.

Для некоторых типов Modbus-устройств, например: свободно программируемых контроллеров, таблица может зависеть от проекта, зашитого в контроллер.
Т.е. может быть сформирована в штатном ПО контроллера только после создания файла-проекта (см. например PIXEL).

Все регистры Modbus-устройства доступные на чтение / запись условно хранятся в 4-х таблицах:

Таблица Функция чтения Тип данных Разрешены Чтение (R) / Запись (W) Функция записи
Регистры флагов (Coils) 0х1 0 или 1 R / W 0x5
Дискретные входы (Discrete Inputs) 0х2 0 или 1 R
Регистры хранения (Holding Registers) 0х3 числовой/строковый R / W

0x10 или 0х6

(см. параметр AW далее)

Регистры ввода (Input Registers) 0х4 числовой/строковый R

Каждый регистр:

  • это ячейка размером в 2-байта.
  • имеет уникальный адрес.

В зависимости от типа Modbus-устройва адресное пространство таблиц может быть объединено, т.е.  регистр с адресом 0 в таблице HoldReg, аналогичен (полностью соответствует) адресу 0 в таблице InpReg (это можно понять либо из документации, либо при тестовом опросе устройства).

Если вы затрудняетесь с тем, какой тип регистра указывать — используйте HoldReg.

Иногда в документации на устройство можно увидеть, что адреса регистров  обозначаются 6-ти значными числами: логическими адресами. 

Старшая цифра логического адреса при этом обозначает тип регистра, а остальные цифры — физический адрес регистра.

Старшая цифра логического адреса Начальный логический адрес Тип данных
0 000001 Coil
1 100001 DiscInp
3 300001 InpReg
4 400001 HoldReg

Как правило, при таком указании логических адресов считается что базовый регистр устройства = 1  (т.е. из адреса еще нужно будет вычесть единицу)

Например: логический адрес = 40568

  • Тип регистра 4 = HoldReg
  • Физический адрес регистра = 568 — 1 = 567

Замечание!
При регистрации устройства единицу все время вычитать не нужно, вы просто указываете в настройках устройства значение базового регистра = 1.

Для определения значения, хранящегося в регистре, необходимо, исходя из документации, корректно указать тип данных.

Поддерживаются следующие типы данных:

Название Альтернативное название Число регистров Диапазон значений Комментарий
BIT   1 0 или 1

Может быть использован для выделения сигнала из битовой маски, которая записана в регистре.
Из регистра будет считано целое число, затем в этом числе будет проаназирован указанный бит.
Номер анализируемого бита указывается в настройке Блок / Бит
Если в регистр будет производится запись, то предварительно прочитается текущее значение регистра, выполнится установка или сброс указанного бита, и далее полученное значение будет записано в регистр.

BITInv   1 0 или 1 Аналогично BIT, но считаное из регистра значение будет проинвертировано
BOOL Boolean 1 0 или 1 По-сути, это тип BIT c  дополнительной настройкой Блок / Бит = 1 (независимо от настройки пользователя).
В отличии от типа BIT предполагает, что в регистре реально возможны только два значения: 0 или 1.
BOOLInv Boolean 1 0 или 1 Аналогично BOOL, но считанное из регистра значение будет проинвертировано
WORD Unsigned word 1 Целые числа
0 .. 65535
 
CHAR

Signed byte,
Short Integer

1 Целые числа
-128..127
 
SHORT Signed word,
Small Integer
1 Целые числа
-32 768 … 32 767
 
FLOAT   2 1.5×10^-45 …3.4×10^38  
DWORD Unsigned long 2

Целые числа

0..4294967295

 
INTEGER Signed long 2

Целые числа -2147483648..2147483647

 
BIT4   2 0 или 1  
DOUBLE   4 5.0 x 10^-324 .. 1.7 x 10^308  
STRING  

указывается

(запрашиваемое число регистров будет равно половине указанному)

строка данных Поддержка в SCADA 2.7.13 и выше
INT64 Big Integer  

Целые числа

-2^63 … 2^63-1

 
1 регистр  = 16 бит
2 регистра = 32 бита
4 регистра = 64 бита

Также важен формат представления числа в регистре. Он определяет порядок перестановки полу-байт в регистрах.

Обычное значение поля Формат:

  • Для типов данных в 1 регистр — 1
  • Для типов данных в 2 регистра — 4 (или значение 2)
  • Для типов в 4 регистра — 14 (или значение 12) 
    Для данного типа существуют дополнительные значения формата с 11 до 14:
    • формат с 1 до 4 — дополнительно меняют местами левые-правые 2-регистра
    • формат с 11 до 14 — аналог 1 — 4, но не выполняется перестановка.

Если при успешном опросе устройства, вы получаете в регистрах непонятные значения, попробуйте поменять Формат.

Комментарий по полю Формат (при первом чтении данный раздел можно пропустить).

Рассмотрим пример влияния значения поля Формат на вычисленный результат (см. программу KCS DEMO).

Предположим мы считываем целочисленное значение типа INTEGER (целое число, занимающее 2 регистра = 4 байта данных), по начальному адресу, например: 2054 (0x0806). Пусть нам известно, что в этом регистре должно хранится значение = 0х12345678 (значение в 16-ричной кодировке или 305419896 в привычной нам 10-ричной кодировке,  преобразование вы можете выполнить в калькуляторе Windows).

Запрос данных (в шестнадцатиричной  кодировке): 
>> 01 03 08 06 00 02 26 6A 

Значения регистров передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым.

Ответ устройства 
            3б 2б 1б 0б      
<< 01 03 04 12 34 56 78 81 07 

где:

  • 0х12 0х34 — первый регистр ( адрес 2054); байты 3, 2
  • 0х56 0х76 — второй регистр ( адрес 2055); байты 1, 0
Полученные данные
последовательность байт
Формат Правило перестановки Результат Комментарий
12 34 56 78 1 1_0_3_2 0x56781234  
12 34 56 78 2 0_1_2_3 0x78563412 обратный порядок
младший байт вперед
12 34 56 78 3 2_3_0_1 0x34127856  
12 34 56 78 4 3_2_1_0 0x12345678 прямой порядок
старший байт вперед

Т.е. для регистров устройства данного типа корректное значение формата — 4.

Предположим мы считываем целочисленное типа WORD, которое хранится в 1-м регистре (2 байта данных) по адресу, например: 2. Пусть мы значение что значение — 0х08.

Запрос данных (в шестнадцатиричной  кодировке): 
>> 01 03 00 02 00 01 25 CA 

Ответ устройства
            1б 0б 
<< 01 03 02 00 08 B9 82
Полученные данные
последовательность байт
Формат Правило перестановки Результат
00 08 1 1_0 0x0008
00 08 2 0_1 0x0800

Т.е. для регистров устройства данного типа корректное значение формата — 1.

Регистрация Modbus-устройств в Tekon OPC-сервер

Добавьте Modbus-устройство в конфигурациюOPC-сервера.
Если Modbus-устройство было зарегистрировано в программе ASUDBase, вы можете создать конфигурационный файл сервера, нажав в окне настройки Modbus-устройства в ASUDBase кнопку Экспорт.

Если устройство подключено

  • напрямую по компьютерной сети
    • Добавьте DA Компьютерная сеть Modbus TCP
  • через КЦС-IPM КУН-IPM
    • Добавьте DA Концентратор  КЦС-IPM или  КУН-IPM Modbus RTU
  • через сторонний конвертер интерфейса 
    • Добавьте DA IP-RS преобразователь  Modbus RTU

Modbus opc 1.PNG

Выполните двойной клик на созданном устройстве.

Modbus OPC 1 1.PNG

Нажмите Да, если вы создаете новое устройство с новым описанием регистров. Нажмите Нет — если вы создаете устройство, для которого ранее уже создавали таблицу регистров. 

Если вы выбрали Да — следует указать в латинице имя устройства, например: pixel

Далее выберите в свойствах созданный ранее конфигурационный файл устройства и нажмите два раза на само устройство, для того, чтобы открыть окно настройки.

Modbus opc 2.PNG

На рисунке отображен пример окна настройки устройства, подключенного к концентратору КЦС-IPM, КУН-IPM.

Для каждой ячейки доступна информационная подсказка (хинт).

Строки имеют следующий смысл:

  1. название столбцов таблицы
  2. тип протокола устройства [RTU, TCP]
    Если вы подлючаете устройство по RS-485, то почти всегда это RTU-протокол. Если по компьютерной сети — TCP.
  3. поля конфигурации устройства
    1. 0 — базовый регистр, указывает сдвиг регистров при запросе (обычно 0 или 1)
    2. 1 — количество регистров читаемых в одном запросе, по умолчанию 1.
      Большее значение параметра увеличивает скорость опроса устройства. 
      Но имеет смысл, если запрашиваемые регистры идут подряд.
      Если в документации не указано сколько можно читать — попробуйте указать 10 и провести тестовой опрос устройства.
      Если ошибок нет — оставляйте указанное значени. Иначе верните значение 1.
    3. 0 — не разрешать пропуски при чтении. Допустимые значения [0,1]
      Некоторые устройства позволяют опрашивать несколько регистров, если они расположены неподряд.
      Это также увеличивает скорость опроса устройства.
  4. следующие строки — это собственно таблица адресов Modbus-регистров из документации на устройство

Для редактирования таблицы следует нажать  Редактировать. 

При этом по правому клику мышки, доступно меню добавления новых строк.

Описание столбцов настройки:

  • Регистр — тип регистра из выпадающего меню
  • Адрес — адрес регистра (в десятичной системе счисления)
    Вы можете указывать адрес в 16-ричной кодировке, для этого добавьте в начале знак $. Например: $10, $FA и т.п.
  • Тип данных — тип указанный в документации на устройство
  • Блок/Бит
    • для типа данных BIT, BITInv  указывается анализируемый бит (от 1 до 16) в слове. Бит 1 — младший, 16 — старший.
    • для типа данных BIТ4 указывается анализируемый бит (от 1 до 32) в слове. Бит 1 — младший, 32 — старший.
    • для типа STRING — размер блока данных в байтах (обычно размер строки в документации на устройство указывается кратным двум байтам).
    • для других типов данных — не используется.
  • Формат — формат данных (подробнее см. ранее)
  • Множитель — множитель данных, по умолчанию 1.

Множитель учитывается для всех типов кроме BIT, BITInv, BOOL, BOOLInv, BIT4, STRING

После чтения регистра:  
   Значение SCADA = значение регистра * множитель 
Перед записью регистра: 
   Значение регистра  = Значение SCADA / множитель

Минимальное значение Множителя 0,0001.
Внимание!
При указании в качестве Множителя значений 2, 3, 4, 5, 6, 7, 8, 9 — реальное значение множителя определяется по формуле

Множитель = 1 / (2 ^ Указанный_множитель)
  • AW  — данный параметр разрешает запись значений в регистр, например для изменения уставок устройства или управления устройством из SCADA. 
    Актуально только для регистров типа Coils / HoldReg.
    Возможные значения:
    0 — запись в регистр запрещена
    1 — запись в регистр разрешена. Для регистров HoldReg будет использоваться функция $10 для записи
    6 — для регистров HoldReg будет использоваться функция $06 для записи   (для исп. данного значения требуется доп. обновление для версии 2.7.5)
    10 —  аналог значения 1. Для регистров HoldReg будет использоваться функция $10 для записи (для исп. данного значения требуется доп. обновление для версии 2.7.5)
  • Тег — имя тега, которое будет отображено в SCADA.
    Имя тега должно быть уникально в рамках устройства.
    В имени Тега не следует использовать символ точка.
  • Название — наименование сигнала (неисправности), которое будет отображаться в журнале событий в программе SCADA.

Для сохранения изменений, нажать кнопку Сохранить.

Замечание!
Начиная с версии 2.7.5 в свойствах Modbus-устройства появилась настройка Дополнительный сдвиг адреса — это настройка может быть применена, например: при регистрации контроллеров сплит-систем, когда адреса регистров внутренних блоков системы кондиционирования сдвинуты относительно общей карты на число, соответствующее номеру внутреннего блока.
Т.е. вы регистрируете и настраиваете Modbus-устройство с адресами первого блока. Затем добавляете второе Modbus-устройство, указываете файл настроек первого, но дополнительно указываете настройку сдвиг адресов.   

Замечание!
Поле Версия устройства — не используется (всегда отображает —)

Тестовый опрос устройства 

Для выполнения тестового опроса устройства, сохраните настройки и нажмите кнопку Опросить. Будет выполнен опрос устройства с отображением полученных данных в столбце Значение

Кнопка Лог  — отобразит лог последнего обмена  данными с устройством. Расшировку кодов возможных ошибок см. в описании программы KCS DEMO.EXE 

Вы также можете выполнить тестовый опрос одного регистра, нажав правой кнопкой мыши и выбрав меню Опросить.

Тестовая запись значения регистра

Если вы указали для регистра значение AW > 0, вы можете выполнить тествую запись непосредственно в окне настройки. 

Для этого в рабочем режиме выберите строку и нажмите правой кнопкой мыши, выбрав меню Записать значение.

Особенности представления значений Modbus-регистров 

Для настроенных Modbus-регистров ОРС-сервер создает следующие типы сигналов, которые будут доступны в SCADA: 

  • Дискретный сигнал —  если регистр имеет тип BIT (BITInv, BOOL, BOOLInv, BIT4) и AW = 0
    • в SCADA вы сможете использовать стандартные примитивы типа Дискретный сигнал или LED, Изображение
    • Вы можете использовать инвертирование дискретного сигнала, если в конце названия Тега допишите _INV, например: «А1_INV»
      Начиная с версии 2.7.5 вместо _INV — вы можете использовать типы BITInv, BOOLInv.
  • Канал управления — если для регистра установлен параметр AW = 1,  и название Тега окончивается на _CTRL, например «Svet_CTRL»
    • в SCADA вы сможете использовать стандартные примитивы типа Канал управления или Изображение
    • при этом подразумевается, что значение регистра может быть только 0 или 1. В противном случае не следует использовать данный тип сигнала
  • Числовое значение — для всех остальных случаев

Если регистр имеет тип BIT (BITInv, BOOL, BOOLInv, BIT4), но вы не хотите, чтобы сигнал был представлен в SCADA, как дискретный датчик, вам следует:

  • изменить тип с BIT  (BITInv, BOOL, BOOLInv) на Word  — если регистр может иметь только значения 0,1  (и не представляет собой битовую маску)
  • изменить тип с BIT4 на DWord  — если регистр может иметь только значения 0,1  (и не представляет собой битовую маску)
  • или добавить к имени тега «_$», т.е. например: вместо  «Tag1» указать «Tag1_$»

Как регистрировать битовую маску ошибок

Если, исходя из описания устройства, регистр представляет собой битовую маску ошибок, как его регистрировать? 

Например: 

  • 520.01  — авария насоса 
  • 520.02  — неиспраность датчика температуры 
  • 520.03  — перепад давления

Запись типа 520.01 — означает, что для получения сигнала «Авария насоса» следует прочитать регистр 520  и проверить факт установки в значении регистра 1-го (младшего бита).

Т.е в значении  регистра 520  хранится несколько сигнальных (аварийных)  событий. Допустим вы читаете регистр и получаете значение = 5. 

Переводим это значение в двоичный код (например, с помощью Калькулятора Windows)  и получаем значение  5 (DEC)  =  101 (BIN),  т.е. в регистре 520  установлены 1 и 3 биты, есть авария насоса и перепад давления.

Исходя из этого, следует определить, нужны ли в SCADA все ошибки по отдельности (отдельными примитивами типа Дискретный датчик) или только сигнал обощенной ошибки с текстовым описанием активных ошибок? 

Если все по отдельности — то для каждой ошибки делаете отдельную запись в таблице регистров:

  • Адрес — одинаков
  • Тип  — BIT, если битовая маска лежит в одном Modbus-регистре  или BIT4 — если в нескольких
  • Блок/Бит — 1, 2, 3, и т.д  — тот бит, который отвечает за конкретную ошибку 
  • Название — Название ошибки
  • В SCADA на каждую ошибку будет отображен свой Дискретный примитив

Если достаточно только обобщенной ошибка (т.е. факта того, что есть какая-то ошибка), то региструете только одну запись:

  • Адрес — адрес битовой маски 
  • Тип — WORD или DWORD
  • В SCADA используйте  (подробнее см. ниже)
    • Переменную для отображения Аварийного сигнала обощенной аварии или примитив LED-индикатор
    • Текстовое поле + Text-функцию для отображения описания активных ошибок

Настройка SCADA

В АСУД.SCADA для визуализации данных Modbus-устройств можно использовать следующие примитивы:

  • Таблица Тегов — быстрая визуализация в табличном виде в одном месте ситуационного плана без визуально-звуковой индикации: 
    • числовых данных
    • состояний работы устройства (преобразование числа в надпись с помощью Text-функций)
    • расшифровка кодов ошибок   (преобразование числа в надпись с помощью Text-функций)
  • Цифровой индикатор, стрелочный индикатор — для отображения любых числовых значений (с возможностью указания граничных значений и визуально-звуковой индикакаций выхода за границы)
  • Текстовое поле — для отображения любых числовых значений, а также преобразования числового значения в текстовое по заданному правилу с помощью скрипта или Text-функции. Кроме того с помощью данного примитива и скрипта можно выполнить запись значения в регистр Modbus-устройства.
  • Кнопка — для записи значения в регистр
  • Дискретный датчик — визуализация аварийных событий.
  • Led-индикатор — для отображения дискретных значений, в том числе выделение бита из маски.
  • Прибор учета  — если устройство было зарегистрировано в ASUDBase и вам нужна простая визуализация в табличной форме
  • Изображение — визуализация аварийный событий 
  • Набор изображений — визуализация состояния устройства или запись значения в регистр Modbus-устройства.

Замечание! Для того чтобы реализовать возможность записи введенного пользователем значения в Modbus-устройство, необходимо чтобы:

  • Регистр  относится к типу HoldReg или Coils
  • Значение поля AW (Allow Write) было > 0

Рассмотрим пример визуализации значения регистра, представляющего собой битовую маску ошибок, если этот регистр был настроен в ОРС-сервере, как числовое значение (а не набор типов BIT).

Пример 1. 
Необходимо визуализировать с помощью Дискретных примитивов состояние регистра «Авария», где значение регистра представляет собой битовую маску кодов аварий

Например, биты: 

  • 1  — авария насоса 
  • 2  — неиспраность датчика температуры 
  • 3  — перепад давления

Создаем несколько переменных  (по числу аварийный событий), например: 

Var.1:

  • Имя — 1
  • Журнал событие — Авария насоса 
  • Журнал адрес — Котельная
  • Задержка (с.) — 0
  • Тип —  ВЫРАЖЕНИЕ
  • Выражение — BIT (X;1)
  • Добавлям Тег регистра «Авария»

Var.2:

  • Имя — 2
  • Журнал событие — Неиспраность ДТ 
  • Журнал адрес — Котельная
  • Задержка (с.) — 0
  • Тип —  ВЫРАЖЕНИЕ
  • Выражение — BIT (X;2)
  • Добавлям Тег регистра «Авария»

Var.3:

  • Имя — 3
  • Журнал событие — Перепад давления
  • Журнал адрес — Котельная
  • Задержка (с.) — 0
  • Тип —  ВЫРАЖЕНИЕ
  • Выражение — BIT (X;3)
  • Добавлям Тег регистра «Авария»

Размещаем на ситуационном плане примтивы типа Дискретный датчик, в настройке Тег вручную указываем  имена переменных VAR.1, VAR.2, VAR.3.

Пример 2.  Необходимо визуализировать с помощью Дискретного датчика обобщенную аварию  регистра «Авария» из предыдущего примера.

Иногда нет необходимости выделять каждую Аварию отдельным примитивом Дискретный датчиком, а например достаточно просто показать сигнал Обощенной авариии. В этом случае, 

 Создаем переменную VAR.Total:

  • Имя — Total
  • Журнал событие — Авария
  • Журнал адрес — Котельная
  • Задержка (с.) — 0
  • Тип —  <> 0
  • Добавлям Тег регистра «Авария»

Размещаем на ситуационном плане примтив типа Дискретный датчик, в настройке Тег вручную указываем  VAR.Total.

Если значение тега «Авария» будет отлично от 0 (т.е. будет установлен флаг любой из аварий), то примтив Дискретный датчик перейдет в сигнальное состоения.

При этом расшифроку Аварий, удобно реализовать с помощью  примитивов Таблица Тегов или Текстовое поле, связав их с тегом «Авария» (не переменной, а тегом!),  и создав Text-фукцию (см. пример 3 Функция BITSTR в описании)

# BITSTR()
0=Норма
1=авария насоса
2=неиспраность датчика температуры
3=перепад давления

Демонстрационный пример

Вы можете сами попробовать настроить в SCADA Modbus-устройство воспользовавшись эмулятором в программе KUNIP.EXE
См. пример настройки в описании эмулятора.

Содержание

  • 1 Запись данных в Coil Registers
    • 1.1 Запись значения в регистр Coil с помощью кнопки
    • 1.2 Запись значения в регистр Coil с помощью триггера
  • 2 Запись данных в Holding Registers
    • 2.1 Запись значения в регистр Holding с помощью кнопки
    • 2.2 Запись значения в регистр Holding с помощью уровня
    • 2.3 Запись значения в регистр Holding с помощью триггера
    • 2.4 Запись значения в регистр Holding с помощью кнопок Up/Down
  • 3 Чтение данных о состоянии регистров
    • 3.1 Настройка каналов для получения данных о состоянии регистров
    • 3.2 Изменение состояния элемента при смене значения регистра
    • 3.3 Отображение текущего значения регистра в текстовом поле элемента
  • 4 Особенности Modbus контроллеров
    • 4.1 Insyte Spyder II
    • 4.2 Beckhoff
    • 4.3 ОВЕН
  • 5 Управление RGB светодиодами с помощью объекта Color Picker

Запись данных в Coil Registers

Coil Register — регистры флагов, содержание значение в один бит. Регистры Coil доступны для чтения и записи данных.

Для отправки данных в регистры Coil могут быть использованы команды (Commands), созданные на выходе драйвера Modbus, инициация отправки команд производится графическими элементами, к котором привязаны команды. Данные, полученные от контроллера, могут влиять на параметры графических элементов, в том числе на значения, отправку которых инициирует элемент. Отдельные типы графических элементов для работы используют одновременно канал записи значения и канал чтения состояния переменной (Trigger Button, Up/Down Button).

Графические элементы, которые могут быть использованы для управления регистром Coil драйвера Modbus:

  • Кнопка (Button) — отправка фиксированного значения регистру (0 или 1); отображение состояния регистра сменой состояния кнопки или вывод значения регистра на элемент в виде текста
  • Триггер (Trigger Button) — переключение между двумя состояниями Coil регистра (0 и 1). Для работы триггера необходим канал чтения текущего состояния управляемого регистра. В зависимости от текущего состояния, элемент выбирает значение, которое будет отправлено контроллеру при очередном нажатии на элемент (значение 0 или 1).

Запись значения в регистр Coil с помощью кнопки

1. Создайте команду отправки значения в регистр Coil
команда создается в дереве устройств проекта и адаптируется для работы с выбранным типом регистра:

Modbus Coil Button 1.png

Name имя команды (произвольно)
Device ID адрес подчиненного устройства, контроллера (Slave ID)
Type тип регистра, к которому обращена команда (Coil Register)
Address адрес управляемого Coil регистра

2. Создайте графический элемент — кнопку для отправки значения регистру
Элемент будет инициировать отправку значения регистру, само значение выбирается при натаскивании команды на графический элемент. Для выбора фиксированного значения, при привязке команды выбираем событие «Send Number»

Modbus Coil Button 2.png

Type тип графического элемента — кнопка (Button). Кнопка используется для отправки фиксированного значения в регистр
Feedback тип обратной связи для элемента — Momentary. Элемент будет менять состояние при нажатии, но полученные от контроллера данные не повлияют на его состояние
Hit восприимчивость элемента к нажатию — Active Touch. Активной для нажатия будет вся непрозрачная часть графического элемента

3. Привяжите команду к графическому элементу
Привязка команды осуществляется методом Drag&Drop — перетаскивание. В процессе привязки указывается тип отправляемых данных и событие, при котором они должны быть отправлены контроллеру:

Modbus Coil Button 3.png

Выпадающий список действий при натаскивании команды на элемент:
Send Number отправить регистру фиксированное целое число в десятичном формате. Значение указывается в диалоговом окне при выборе этого типа отправки данных. Команда Send Number всегда используется при работе с обычными кнопками (Button).
Диалоговое окно события Send Number:
Value Поле ввода значения (целого десятичного числа), которое будет отправлено регистру. Для регистров Coil это всегда 0 или 1
Event for Action Событие, при котором выбранное значение Value будет отправлено регистру (Press — при нажатии на элемент, Release — при отпускании элемента, другое для кнопки обычно не используется)

Когда вышеуказанные действия выполнены, можно запустить Эмуляцию работы проекта. При наличии лицензии Эмулятор iRidium подключится к управляемому контроллеру и при каждом нажатии на настроенную в этом пункте инструкции кнопку будет отправлять единицу на Coil регистр с указанным при настройке адресом.

Так же можно настроить отправку значения 0 этому регистру (например, для реализации раздельных элементов Вкл и Выкл).

↑ К оглавлению

Запись значения в регистр Coil с помощью триггера

1. Создайте команду отправки значения в регистр Coil
команда создается в дереве устройств проекта и адаптируется для работы с выбранным типом регистра:

Modbus Coil Button 1.png

Name имя команды (произвольно)
Device ID адрес подчиненного устройства, контроллера (Slave ID)
Type тип регистра, к которому обращена команда (Coil Register)
Address адрес управляемого Coil регистра

2. Создайте графический элемент — триггер для переключения состояния регистра
Элемент при каждом нажатии будет инициировать переключение между двумя состояниями Coil регистра (0 и 1). Для работы триггера необходим канал чтения текущего состояния управляемого регистра. В зависимости от текущего состояния, триггер выбирает значение, которое будет отправлено контроллеру при очередном нажатии на элемент (значение 0 или 1). Также канал чтения состояния регистра необходим для инициализации триггера при старте проекта iRidium.

Modbus Coil Trigger 2.png

Type тип графического элемента — кнопка триггер (Trigger Button). Используется для переключения регистра в значение, противоположное текущему
Feedback тип обратной связи для элемента — Channel. Элемент будет менять свое состояние в зависимости от текущего действительного значения управляемого регистра, это необходимо для инициализации триггера и корректного отображения его текущего состояния (при помощи канала чтения статуса регистра)
Hit восприимчивость элемента к нажатию — Active Touch. Активной для нажатия будет вся непрозрачная часть графического элемента
Trigger Value 1
Trigger Value 2
два возможных состояния триггера (обычно активное и неактивное). Для регистра Coil это всегда значения 0 и 1. Единица соответствует второму (активному) состоянию триггера
* States для корректной работы, триггер всегда должен иметь 2 состояния (State 1 и State 2), настраивающихся во вкладке States параметров графического элемента

3. Привяжите команду к графическому элементу
Привязка команды осуществляется методом Drag&Drop — перетаскивание. В процессе привязки указывается тип отправляемых данных и событие, при котором они должны быть отправлены контроллеру:

Modbus Coil Trigger 3.png

Выпадающий список действий при натаскивании команды на элемент:
Send Token это команда для отправки регистру одного из возможных значений триггера (Trigger Value 1 и Trigger Value 2). Текущее состояние триггера определяется параметром Value элемента. На его основе триггер формирует следующее значение для отправки регистру.
Команду Send Token выбираем, когда элемент должен отправить не фиксированное число, а переменную, зависящую от действий пользователя или состояния элемента. Т.е. при работе с уровнями, триггерами, кнопками прирост/убывание всегда используется команда Send Token
Диалоговое окно события Send Token:
Token Параметр Value определяет текущее состояние триггера (Trigger Value 1 или Trigger Value 2), поэтому при выборе источника отправляемого значения указываем именно Value элемента. Этот параметр будет выбран в диалоговом окне по умолчанию, оставляем его в исходном виде и переходим к следующей настройке
Event for Action Событие, при котором выбранное значение Value будет отправлено регистру (Press — при нажатии на элемент, Release — при отпускании элемента, другое для триггера не используется)
Create a feedback channel команда автоматического создания канала для получения статуса регистра. Канал создается на основе привязываемой к элементу команды, имеет то же имя и свойства. Создание канала обратной связи (с помощью этой опции или вручную) является обязательным при работе с триггером. В отсутствие канала, триггер не будет знать текущее состояние регистра для выбора значения, противоположного текущему.
Feedback:
In Value
настройка, определяющая параметр элемента, на который будет влиять созданный канала чтения статуса. Для работы триггера, полученное значение должно влиять на Value (состояние) элемента, поэтому выбираем событие In Value

Когда вышеуказанные действия выполнены, можно запустить Эмуляцию работы проекта. При наличии лицензии Эмулятор iRidium подключится к управляемому контроллеру и при каждом нажатии на настроенный в этом пункте инструкции триггер будет считывать текущее состояние управляемого Coil регистра. На основе текущего состояния регистра, полученного каналом, триггер выбирает и отправляет ему значение, противоположное текущему.

Кнопка триггер является удобной заменой раздельным элементам управления Coil регистром, один из которых устанавливает значение в единицу, другой — в ноль.

↑ К оглавлению

Запись данных в Holding Registers

Holding Registers — регистры хранения, содержащие (в стандартном протоколе Modbus) 16-битные значения. Регистры Holding доступны для чтения и записи данных.

Для отправки данных в регистры Holding используются команды (Commands), созданные на выходе драйвера Modbus, инициация отправки команд производится графическими элементами, к котором привязаны команды. Данные, полученные от контроллера, могут влиять на параметры графических элементов, в том числе на значения, отправку которых инициирует элемент. Отдельные типы графических элементов для работы используют одновременно канал записи значения и канал чтения состояния переменной (Trigger Button, Up/Down Button, Level).

Графические элементы, которые могут быть использованы для управления регистром Holding драйвера Modbus:

  • Кнопка (Button) — отправка фиксированного значения регистру (в диапазоне 16 бит — знаковые или беззнаковые значения); отображение состояния регистра за счет вывода его текущего значения в текстовое поле элемента
  • Уровень (Level) — установка значения переменной в диапазоне, определяемом пределами уровня; вывод полученного состояния регистра на уровень
  • Триггер (Trigger Button) — переключение между двумя произвольными состояниями Holding регистра (например, 0 и 65535). Для работы триггера необходим канал чтения текущего состояния управляемого регистра. В зависимости от текущего состояния, элемент выбирает значение, которое будет отправлено контроллеру при очередном нажатии на элемент (значение 0 или 65535)
  • Прирост/убывание (Up/Down Button) — увеличение или уменьшение текущего значения регистра на заданную величину относительно текущего значения. Пределы и шаг прироста/убывания задаются при настройке элемента

Запись значения в регистр Holding с помощью кнопки

1. Создайте команду отправки значения в регистр Holding
команда создается в дереве устройств проекта и адаптируется для работы с выбранным типом регистра:

Modbus Holding Button 1.png

Name имя команды (произвольно)
Device ID адрес подчиненного устройства, контроллера (Slave ID)
Type тип регистра, к которому обращена команда (Holding Register)
Address адрес управляемого Holding регистра
Word Size Размер слова Holding регистра. Word (16-bit) для стандартного протокола Modbus
Content Type последовательность записи байтов регистра. Low Endian для стандартного протокола Modbus

2. Создайте графический элемент — кнопку для отправки значения регистру
Элемент будет инициировать отправку значения регистру, само значение выбирается при натаскивании команды на графический элемент. Для выбора фиксированного значения, при привязке команды выбираем событие «Send Number»

Modbus Coil Button 2.png

Type тип графического элемента — кнопка (Button). Кнопка используется для отправки фиксированного значения в регистр
Feedback тип обратной связи для элемента — Momentary. Элемент будет менять состояние при нажатии, но полученные от контроллера данные не повлияют на его состояние
Hit восприимчивость элемента к нажатию — Active Touch. Активной для нажатия будет вся непрозрачная часть графического элемента

3. Привяжите команду к графическому элементу
Привязка команды осуществляется методом Drag&Drop — перетаскивание. В процессе привязки указывается тип отправляемых данных и событие, при котором они должны быть отправлены контроллеру:

Modbus Holding Button 3.png

Выпадающий список действий при натаскивании команды на элемент:
Send Number отправить регистру фиксированное целое число в десятичном формате. Значение указывается в диалоговом окне при выборе этого типа отправки данных. Команда Send Number всегда используется при работе с обычными кнопками (Button).
Диалоговое окно события Send Number:
Value Поле ввода значения (целого десятичного числа), которое будет отправлено регистру. Для регистров Holding это любое значение в диапазоне 16 бит
Event for Action Событие, при котором выбранное значение Value будет отправлено регистру (Press — при нажатии на элемент, Release — при отпускании элемента, другое для кнопки обычно не используется)

Когда вышеуказанные действия выполнены, можно запустить Эмуляцию работы проекта. При наличии лицензии Эмулятор iRidium подключится к управляемому контроллеру и при каждом нажатии на настроенную в этом пункте инструкции кнопку будет отправлять значение в Holding регистр с указанным при настройке адресом.

↑ К оглавлению

Запись значения в регистр Holding с помощью уровня

1. Создайте команду отправки значения в регистр Holding
команда создается в дереве устройств проекта и адаптируется для работы с выбранным типом регистра:

Modbus Holding Button 1.png

Name имя команды (произвольно)
Device ID адрес подчиненного устройства, контроллера (Slave ID)
Type тип регистра, к которому обращена команда (Holding Register)
Address адрес управляемого Holding регистра
Word Size Размер слова Holding регистра. Word (16-bit) для стандартного протокола Modbus
Content Type последовательность записи байтов регистра. Low Endian для стандартного протокола Modbus

2. Создайте графический элемент — уровень для управления занчением
При нажатию на какую-либо зону уровня, в регистр будет отправлено значение, соовтетствующее этой зоне. Пределы регулирования указываются при настройке уровня. Элемент всегда должен иметь 2 состояния, может работать как с каналом обратной связи, так и без него.

Modbus Holding Level.png

Type тип графического элемента — уровень (Level). Используется для установки значения регистра в указанном диапазоне
Feedback тип обратной связи для элемента — Channel. При нажатии уровень перейдет в указанное значение, но при получении от контроллера данных об изменении значения в регистре, ползунок перейдет в новое положение
Hit восприимчивость элемента к нажатию — Active Touch. Активной для нажатия будет вся непрозрачная часть графического элемента
Min
Max
минимальное и максимальное значения уровня, которые он не может превысить при регулировании
Direction ориентация уровня в пространстве — горизонтальная или вертикальная
Range Type тип данных, которым оперирует уровень. Integer — целочисленные значения, Float — числа с плавающей запятой
* States для корректной работы, уровень всегда должен иметь 2 состояния (State 1 и State 2), настраивающихся во вкладке States параметров графического элемента

3. Привяжите команду к графическому элементу
Привязка команды осуществляется методом Drag&Drop — перетаскивание. В процессе привязки указывается тип отправляемых данных и событие, при котором они должны быть отправлены контроллеру:

Modbus Holding Level 3.png

Выпадающий список действий при натаскивании команды на элемент:
Send Token это команда отправки регистру одного из доступных значений уровня. Текущее значение уровня определяется параметром Value элемента. Команду Send Token выбираем, когда элемент должен отправить не фиксированное число, а переменную, зависящую от действий пользователя или состояния элемента. Т.е. при работе с уровнями, триггерами, кнопками прирост/убывание всегда используется команда Send Token
Диалоговое окно события Send Token:
Token Параметр Value определяет текущее положение ползунка уровня, поэтому при выборе источника отправляемого значения указываем именно Value элемента. Этот параметр будет выбран в диалоговом окне по умолчанию, оставляем его в исходном виде и переходим к следующей настройке
Event for Action Событие, при котором выбранное значение Value будет отправлено регистру (Press — при нажатии на элемент, Release — при отпускании элемента, Move — при движении ползунка уровня будут отправляться все принятые им промежуточные значения, до момента отпускания). Рекомендуется привязывать команду сразу на 2 события — Press и Release при работе с уровнем. Событие Move может создать излишнюю нагрузку на контроллер из-за большого объема передаваемых данных

Когда вышеуказанные действия выполнены, можно запустить Эмуляцию работы проекта. При наличии лицензии, Эмулятор iRidium подключится к управляемому контроллеру и при каждом нажатии на настроенный уровень будет отправлять в регистр соответствующее выбранной зоне уровня значение.

↑ К оглавлению

Запись значения в регистр Holding с помощью триггера

1. Создайте команду отправки значения в регистр Holding
команда создается в дереве устройств проекта и адаптируется для работы с выбранным типом регистра:

Modbus Holding Button 1.png

Name имя команды (произвольно)
Device ID адрес подчиненного устройства, контроллера (Slave ID)
Type тип регистра, к которому обращена команда (Holding Register)
Address адрес управляемого Holding регистра
Word Size Размер слова Holding регистра. Word (16-bit) для стандартного протокола Modbus
Content Type последовательность записи байтов регистра. Low Endian для стандартного протокола Modbus

2. Создайте графический элемент — триггер для переключения состояния регистра
Элемент при каждом нажатии будет инициировать переключение между двумя состояниями Holding регистра (к примеру, 0 и 65535). Для работы триггера необходим канал чтения текущего состояния управляемого регистра. В зависимости от текущего состояния, триггер выбирает значение, которое будет отправлено контроллеру при очередном нажатии на элемент. Также канал чтения состояния регистра необходим для инициализации триггера при старте проекта iRidium.

Modbus Coil Trigger 2.png

Type тип графического элемента — кнопка триггер (Trigger Button). Используется для переключения регистра в значение, противоположное текущему
Feedback тип обратной связи для элемента — Channel. Элемент будет менять свое состояние в зависимости от текущего действительного значения управляемого регистра, это необходимо для инициализации триггера и корректного отображения его текущего состояния (при помощи канала чтения статуса регистра)
Hit восприимчивость элемента к нажатию — Active Touch. Активной для нажатия будет вся непрозрачная часть графического элемента
Trigger Value 1
Trigger Value 2
два возможных состояния триггера (обычно активное и неактивное). Для регистра Holding это могут быть любые 2 значения из диапазона 16 бит.
* States для корректной работы, триггер всегда должен иметь 2 состояния (State 1 и State 2), настраивающихся во вкладке States параметров графического элемента
  • если реальное значение в регистре не совпадает ни с одним из двух значений, указанных для триггера, то при очередном нажатии на триггер регистру отправится значение, указанное в поле Trigger Value 2

3. Привяжите команду к графическому элементу
Привязка команды осуществляется методом Drag&Drop — перетаскивание. В процессе привязки указывается тип отправляемых данных и событие, при котором они должны быть отправлены контроллеру:

Modbus Holding Trigger 3.png

Выпадающий список действий при натаскивании команды на элемент:
Send Token это команда для отправки регистру одного из возможных значений триггера (Trigger Value 1 и Trigger Value 2). Текущее состояние триггера определяется параметром Value элемента. На его основе триггер формирует следующее значение для отправки регистру.
Команду Send Token выбираем, когда элемент должен отправить не фиксированное число, а переменную, зависящую от действий пользователя или состояния элемента. Т.е. при работе с уровнями, триггерами, кнопками прирост/убывание всегда используется команда Send Token
Диалоговое окно события Send Token:
Token Параметр Value определяет текущее состояние триггера (Trigger Value 1 или Trigger Value 2), поэтому при выборе источника отправляемого значения указываем именно Value элемента. Этот параметр будет выбран в диалоговом окне по умолчанию, оставляем его в исходном виде и переходим к следующей настройке
Event for Action Событие, при котором выбранное значение Value будет отправлено регистру (Press — при нажатии на элемент, Release — при отпускании элемента, другое для триггера не используется)
Create a feedback channel команда автоматического создания канала для получения статуса регистра. Канал создается на основе привязываемой к элементу команды, имеет то же имя и свойства. Создание канала обратной связи (с помощью этой опции или вручную) является обязательным при работе с триггером. В отсутствие канала, триггер не будет знать текущее состояние регистра для выбора значения, противоположного текущему.
Feedback:
In Value
настройка, определяющая параметр элемента, на который будет влиять созданный канала чтения статуса. Для работы триггера, полученное значение должно влиять на Value (состояние) элемента, поэтому выбираем событие In Value

Когда вышеуказанные действия выполнены, можно запустить Эмуляцию работы проекта. При наличии лицензии Эмулятор iRidium подключится к управляемому контроллеру и при каждом нажатии на настроенный в этом пункте инструкции триггер будет считывать текущее состояние управляемого Holding регистра. На основе текущего состояния регистра, полученного каналом, триггер выбирает и отправляет ему значение, противоположное текущему.

↑ К оглавлению

Запись значения в регистр Holding с помощью кнопок Up/Down

1. Создайте команду отправки значения в регистр Holding
команда создается в дереве устройств проекта и адаптируется для работы с выбранным типом регистра:

Modbus Holding Button 1.png

Name имя команды (произвольно)
Device ID адрес подчиненного устройства, контроллера (Slave ID)
Type тип регистра, к которому обращена команда (Holding Register)
Address адрес управляемого Holding регистра
Word Size Размер слова Holding регистра. Word (16-bit) для стандартного протокола Modbus
Content Type последовательность записи байтов регистра. Low Endian для стандартного протокола Modbus

2. Создайте графический элемент — кнопку прирост/убывание (Up/Down Button)
Элемент при каждом нажатии будет обращаться к управляемому регистру, читать его текущее значение и прибавив к нему указанную величину отправлять регистру в качестве новой уставки. Применяется для точного регулирования температуры или др. величин относительно текущего значения. Для работы Up/Down Button необходим канал чтения текущего состояния регистра.

Modbus Holding UpDown 2.png

Type тип графического элемента — кнопка прирост/убывание (Up/Down Button). Применяется для точного регулирования величин относительно текущего значения.
Feedback тип обратной связи для элемента — Momentary. Элемент будет менять состояние при нажатии для визуальной фиксации, на вычисление прирощенного значения тип обратной связи не влияет
Hit восприимчивость элемента к нажатию — Active Touch. Активной для нажатия будет вся непрозрачная часть графического элемента
Up/Down Value величина, на которую необходимо прирастить текущее значение управляемого регистра (целое число), может быть положительной («1») или отрицательной («-1»)
Min/Max Value предел приращения, величина, больше которой прирост осуществляться не должен. Для положительного значения прироста (Up/Down Value > 0) — верхний предел приращения, для отрицательного значения прироста (Up/Down Value < 0) — нижний предел приращения.

3. Привяжите команду к графическому элементу
Привязка команды осуществляется методом Drag&Drop — перетаскивание. В процессе привязки указывается тип отправляемых данных и событие, при котором они должны быть отправлены контроллеру:

Modbus Holding UpDown 3.png

Выпадающий список действий при натаскивании команды на элемент:
Send Token это команда для отправки регистру приращенного значения. Текущее состояние Up/Down Button определяется параметром Value элемента. На его основе триггер формирует приращенное значение для отправки регистру.
Команду Send Token выбираем, когда элемент должен отправить не фиксированное число, а переменную, зависящую от действий пользователя или состояния элемента. Т.е. при работе с уровнями, триггерами, кнопками прирост/убывание всегда используется команда Send Token
Диалоговое окно события Send Token:
Token Параметр Value хранит текущее и формирует приращенное значение для отправки, поэтому при выборе источника отправляемого значения указываем именно Value элемента. Этот параметр будет выбран в диалоговом окне по умолчанию, оставляем его в исходном виде и переходим к следующей настройке
Event for Action Событие, при котором значение Value будет отправлено регистру (Press — при нажатии на элемент, Release — при отпускании элемента, другое для этого элемента не используется)
Create a feedback channel Команда автоматического создания канала для получения статуса регистра. Канал создается на основе привязываемой к элементу команды, имеет то же имя и свойства. Создание канала обратной связи (с помощью этой опции или вручную) является обязательным при работе с элементами Up/Down. В отсутствие канала, Up/Down Button не будет знать текущее состояние регистра для формирования и отправки приращенного значения.
Feedback:
In Value
Настройка, определяющая параметр элемента, на который будет влиять созданный канал чтения статуса. Для работы кнопки Up/Down, полученное значение должно влиять на Value (состояние) элемента, поэтому выбираем событие In Value

Когда вышеуказанные действия выполнены, можно запустить Эмуляцию работы проекта. При наличии лицензии Эмулятор iRidium подключится к управляемому контроллеру и при каждом нажатии на настроенный в этом пункте инструкции элемент будет считывать текущее состояние управляемого Holding регистра. На основе текущего состояния регистра, полученного каналом, кнопка Up/Down выбирает и отправляет приращенное значение регистра.

↑ К оглавлению

Чтение данных о состоянии регистров

В соответствии со стандартами протокола Modbus, iRidium может обратиться для получения данных к следующим типам регистров — Type:

  • Coil Register — регистры флагов, один бит, чтение и запись данных
  • Holding Register — регистры хранения, 16-битное слово, чтение и запись данных
  • Discret Inputs — дискретные входы, один бит, только чтение данных
  • Input Register — регистры ввода, 16-битное слово, только чтение данных

Для получения данных о состоянии регистров iRidium использует каналы обратной связи (Feedbacks), в которых указываются параметры регистра, статус которого необходимо получить. Каналы создаются во вкладке Feedbacks драйвера Modbus в дереве устройств проекта.

Получение данных о состоянии переменных производится драйвером на основе списка имеющихся у него каналов. Отображение полученных данных осуществляется за счет графических элементов, к которым привязываются команды. Данные, полученные от контроллера, могут отображаться в текстовом поле графического элемента или влиять на его текущее состояние.

Настройка каналов для получения данных о состоянии регистров

Как ранее упоминалось, iRidium может получать данные о состоянии 4х типов регистров: Coil Register, Holding Register, Discret Inputs, Input Register. Все эти типы регистров настраиваются в дереве устройств проекта, параметры каналов имеют вид:

Modbus Reead RegiserTypes.png

Name имя канала (произвольно)
Device ID адрес подчиненного устройства, контроллера (Slave ID)
Type тип регистра, данные от которого получаем
Address адрес регистра, данные от которого получаем
Word Size Размер слова регистра. Word (16-bit) для стандартного протокола Modbus
Content Type последовательность записи байтов регистра. Low Endian для стандартного протокола Modbus

Созданные каналы могут влиять на различные параметры графических элементов — состояние, внешний вид, активность, могут отображать данные о текущем значении регистра в текстовое поле элемента.
Для привязки канала к графическому элементу используется метод Drag&Drop, в процессе привязки выбирается параметр элемента, на который будет воздействовать выбранный канал:

Modbus Read ChannelDragging.png

Наиболее часто используемые способы воздействия каналов на графические элементы:

  • In Value — канал влияет на парметр Value — состояние графического элемента. При переходе регистра в любое ненулевое значение, в случае использования кнопки, графический элемент сменит свое состояние на активное (от State 1 до State 2); в случае использования уровня элемент изменит положение ползунка.
    Также In Value используется для работы со сложными графическими элементами — Trigger Button, Up/Down Button и участвует в вычислении значений, которые будут отправлять эти элементы в регистр.
    In Value используется при работе с шаблонами обработки и отображения входящих данных на элемент ($V, $P, $F1, …)
  • In Text — канал записывает значение, полученное от регистра в текстовое поле элемента, заменяя имеющийся в нем текст. Записывается абсолютное значение без преобразования, поэтому этот тип привязки НЕ используется при работе с шаблонами обработки и отображения входящих данных
  • More… — при необходимости настраиваются более сложные способы воздействия канала на параметры графического элемента. Например, значение регистра может изменять координату или степень прозрачности элемента, делать его неактивным для нажатия или невидимым.

Изменение состояния элемента при смене значения регистра

Для изменения состояния элемента при изменении состояния регистра, необходимо привязать канал статуса регистра к графическому элемент с использованием функции In Value — т.е. создать связь для воздействия канала на параметр Value (состояние, значение) графического элемента.

Применения:

  • изменение состояния кнопки (Button) или анимированной кнопки при получении ненулевого значения от регистра любого типа
  • изменение положения ползунка уровня (Level) или анимированного уровня при получении значения от Holding или Inpit Register (в диапазоне 16 бит)
  • работа с элементами Trigger Button и Up/Down Button, для которых наличие каналов получения статуса регистра обязательно.

Настройки графических элементов для отображения статуса регистра:

1. Кнопка, меняющая состояние при переходе регистра в ненулевое значение:

Modbus Read Channel InValue.png

Type тип графического элемента — кнопка с двумя состояниями (Button)
Feedback тип обратной связи графического элемента. Для возможности отображения полученного состояния регистра всегда выбираем Channel
Hit реакция элемента на нажатия пользователя. Если элемент служит только для отображения статуса переменной и не должен отправлять команд, выбираем Pass Through. Если элемент должен отправлять команды и получать данные, выбираем Active Touch.

2. Уровень, меняющий положение ползунка при изменении значения регистра
Уровень применяется при работе с регистрами, статус которых может меняться в широком диапазоне, поэтому подходит для получения статуса Holding или Inpit Register (диапазон 16 или 32 бита).

Modbus Read Channel InValue Level.png

Type тип графического элемента — уровень (Level)
Feedback тип обратной связи графического элемента. Для возможности отображения полученного состояния регистра всегда выбираем Channel
Hit реакция элемента на нажатия пользователя. Если элемент служит только для отображения статуса переменной и не должен отправлять команд, выбираем Display Only. Если элемент должен отправлять команды и получать данные, выбираем Active.

3. Канала обратной связи обязательно должен привязываться к элементам Trigger Button и Up/Down Button совместно с командой установки значения регистра. Команда и канал должны иметь одинаковые настройки (обращаться к одному и тому же регистру) для правильной работы этих элементов.

↑ К оглавлению

Отображение текущего значения регистра в текстовом поле элемента

Применения (вывод полученного из канала значения в текст возможен двумя способами):

  • Отображение абсолютного значения, полученного каналом от регистра, в текстовом поле элемента
  • Получение и отображение состояния любого регистра в текстовом поле элемента, когда значение должно быть предварительно преобразовано одним из шаблонов обработки и отображения входящих данных ($V, $P, $F1, …)

Настройки графических элементов:

1. Вывести значение регистра в текстовое поле элемента без преобразования
Для ввода значения в текстовое поле (с заменой ранее внесенных туда данных) используется команда «In Text» при натаскивании канала на графический элемент. Может использоваться для любого типа графического элемента, заменяет текст во всех состояниях элемента.

Modbus Read Channel In Text.png

Type тип графического элемента — кнопка (Button) или любой другой элемент
Feedback тип обратной связи графического элемента. Тип обратной связи не влияет на вывод значения в текстовое поле элемента, поэтому можно указать любой тип
Hit реакция элемента на нажатия пользователя. Если элемент служит только для отображения статуса переменной и не должен отправлять команд, выбираем Pass Through. Если элемент должен отправлять команды и получать данные, выбираем Active Touch.

2. Дисплей с шаблоном обработки и вывода значения в текст элемента
Это элемент, в текстовое поле которого введен шаблон обработки и вывода значения на графические элементы, преобразующий полученное значение регистра в нужный формат:

Шаблон

Функция

Шаблон

Функция

$P

процента от максимального значения Уровня

$V

целая часть полученного значения

$L

минимальное значение Уровня

$H

максимальное значение Уровня

$S

номер выбранного состояния

$A

значение за вычетом минимального значения Уровня

$R

размах Уровня (максимальное минус минимальное)

$F1-5

значение с плавающей запятой,
1-5 — число знаков после запятой

$X

текущее значение в формате HEX

$$

символ «доллара»

команда (шаблон) обработки и отображения входящих данных вносится в текстовое поле графического элемента и может быть совмещен с другим текстом и символами (комментариями, единицами измерения)

  • Загрузить: Проект демонстрирующий работу шаблонов (0,7 Mb)

Modbus Read Channel InValue Template.png

Type тип графического элемента — кнопка (Button) с одним состоянием (State 1)
Feedback тип обратной связи графического элемента. Работа шаблона ($V, $P, $S, …) не зависит от Feedback, можно выбрать любой тип обратной связи в зависимости от свойств элемента, с которым используется шаблон.
Hit реакция элемента на нажатия пользователя. Если элемент служит только для отображения статуса переменной и не должен отправлять команд, выбираем Pass Through. Если элемент должен отправлять команды и получать данные, выбираем Active Touch.

Особенности Modbus контроллеров

Insyte Spyder II

Attention.png Убедитесь, что на контроллер Spyder II установлена прошивка 1.40 или старше, иначе возможны существенные задержки связи с контроллером и проблемы при работе с регистрами Coil.

Для работы с контроллером Insyte по протоколу Modbus TCP, активируйте возможность работы по этому протоколу в сетевых настройках контроллера, вкладка Ethernet. Пример конфигурации:

Insyte Ethernet Config.png

При создании команды управления регистром сдвигайте адресацию на «-1» относительно Insyte:.
У контроллера Insyte адреса регистров начинаются с 1, а в iRidium — с нуля.

Для обращения к ПЕРЕМЕННЫМ Insyte, используйте формулу:

Address = 1000 + [номер слота]*2

Номер слота есть у каждой переменной, он будет виден, если навести курсор мыши на переменную. Для отправки команды переменной используется тип данных Type: Holding Register и Word Size: Dword(32-bit).

Для отправки ИК команды через Insyte:

Address = адрес ИК эмиттера, с которого уходят команды 

Номер ИК команды = параметр Value (число) при натаскивании команды на графический элемент. 

Команда на элемент натаскивается с указанием события Send Number.

Arrow download.png Пример управления контроллером Insyte Spyder II по Modbus TCP (проект), 0.8 Мб

↑ К оглавлению

Beckhoff

Beckhoff CX8090. Карта памяти Modbus/ADS:

Modbus areas Modbus address (HEX) Modbus address (DEC) ADS area
Digital inputs 0x0000 — 0x7FFF 0 — 32767 Index group:
0xF021 — process image of physical inputs (bit access)
Index offset:
0x0
0x8000 — 0x80FF 32768 — 33023 Name of the variables in PLC program:
.mb_Input_Coils
Data type:
ARRAY [0..255] OF BOOL
Digital outputs (coils) 0x0000 — 0x7FFF 0 — 32767 Index group:
0xF031 — process image of physical outputs (bit access)
Index offset:
0x0
0x8000 — 0x80FF 32768 — 33023 Name of the variables in PLC program:
.mb_Output_Coils
Data type:
ARRAY [0..255] OF BOOL
Input registers 0x0000 — 0x7FFF 0 — 32767 Index group:
0xF020 — process image of physical inputs
Index offset:
0x0
0x8000 — 0x80FF 32768 — 33023 Name of the variables in PLC program:
.mb_Input_Registers
Data type:
ARRAY [0..255] OF WORD
Output registers 0x0000 — 0x2FFF 0 — 12287 Index group:
0xF030 — process image of physical outputs
Index offset:
0x0
0x3000 — 0x5FFF 12288 — 24575 0x4020 — PLC memory area 0x0
0x6000 — 0x7FFF 24576 — 32767 0x4040 — PLC data area 0x0
0x8000 — 0x80FF 32768 — 33023 Name of the variables in PLC program:
.mb_Output_Registers
Data type:
ARRAY [0..255] OF WORD

Read/Write Holding Registers.

iPad1 AT %MB0 : WORD; (*адрес 12288*)
iPad2 AT %MB1 : WORD; (*адрес 12289*)

Read/Write Coils. Необходимо создать в global_var массив mb_Output_Coils. Например:

mb_Output_Coils AT %QB1000 : ARRAY[0..255] OF BOOL;
Создаем переменные:

iPad1 AT %QX1000.0 : BOOL; (*адрес 32768*)
iPad2 AT %QX1001.0 : BOOL; (*адрес 32769*)
iPad3 AT %QB1002 : ARRAY[0..5] OF BOOL; (*адрес 32770-32775*)
iPad3 AT %QB1007 : ARRAY[0..5] OF BOOL; (*адрес 32775-32780*)

Beckhoff BC9хх0. Карта памяти Modbus/ADS:


Вычисление Modbus адреса Read/Write Holding Registers производится по формуле:

Address = 16384 + 12 - 1 = 16395

16384 — начало области %MB (0x4000-0x47FF)
12 – индекс переменной (можно посмотреть в свойствах переменной)
1 – учитывает отсчет с нуля

↑ К оглавлению

ОВЕН

При настройке контроллера, в параметр FIX необходимо добавить ТСР Port подключения к контроллеру. По умолчанию — 502.

Один порт держит одно подключение ТСР мастера (клиента iRidium)

Номера регистров Modbus можно смотреть по адресам типа %QB7.1.5:

Address = %QB7.1.5 - 1 = 5 - 1 = 4

Последняя цифра адреса минус один — это номер регистра, который будет указываться в iRidium.

Выравнивание переменных CoDeSys при размещении в области памяти Modbus:

переменные размером 8 бит, 2 байта и 4 байта должны располагаться только по определенным
адресам. Адрес 4-байтной переменной кратен 4, 2-байтной – кратен 2, а 1-байтной – кратен 1 и может находиться в любой точке пространства памяти. Т.е. если идет первая переменная типа «байт», то она будет расположена по адресу 0х00, следующая – 0х01 и т.д. Если дальше идет 4-байтная переменная, она должна располагаться по адресу 0х04 и т.д. При этом, если однобайтная переменная заняла место, кратное четырем, следующая 4-байтная переменная занимает следующее кратное 4 место. Порядок задания переменных может быть произвольным, выравнивание же ставит переменные
на кратные их длине адреса. Соответственно, возникают не занятые пространства памяти, которые
должны учитываться пользователем: когда производится опрос прибора. Учет производится на стадии задания переменных.

↑ К оглавлению

↑ К оглавлению

Управление RGB светодиодами с помощью объекта Color Picker

правление RGB светодиодами (DMX контроллером) в осуществляется iRidium с помощью специализированного модуля, преобразующего цвет, выбранный на палитре в команды установки значения в три Holding регистра Modbus, соответствующие уставкам на красный, синий и зеленый цвета светодиодной ленты.

Отдельно отправляется значение в регистр, управляющий яркостью светодиодной ленты. В качестве Color Picker’a может использоваться палитра любого вида.

Создание графических элементов для управления RGB светодиодной лентой:

ColorPicker Item 1.png

ColorPicker Item 3.png

1. Color Picker — палитра выбора цвета

Color Picker — графический элемент типа «Joystick», в поле Image которого выбрано изображение — цветовая палитра. Джойстик определяет цвет под курсором, который нужно разложить на составляющие RGB палитры, при этом сам курсор джойстика может быть невидим.

Для управления светодиодной лентой, в настройках джойстика важно указать диапазон от 0 до 100 для осей Х и Y, настройки формируйте, как на изображении.

2. Элемент-дисплей для отображения цвета и управления яркостью

Кнопка-триггер с 2 состояниями (Trigger Button), которая будет включать-выключать ленту и показывать цвет под курсором Color Picker’а, если лента включена.

Формирование списка команд для управления светодиодной лентой

ColorPicker Commands Modbus.png

В дереве устройств Modbus создайте 4 адреса для управления регистрами «Type: Holding».

Команды должны быть связаны с номерами регистров, регулирующими составляющие цвета светодиодной ленты и ее яркость.

Добавление скрипта управления Color Picker в проект

Скрипт для управления Color Picker нужно скопировать в окно Script Editor редактора GUI Editor или импортировать туда как файл в формате *.js.

Icon Scripts.png

Откройте окно редактирования скриптов проекта и используйте один из методов добавления скрипта: добавить из файла или создать новый скрипт.

При создании нового скрипта, укажите его имя (не должно содержать только цифры) и вставьте приложенный код модуля управления Color Picker:

function work_pick_color(in_color_picker, in_color_resipient, in_sRed, in_sGreen, in_sBlue)
{
   var device = IR.GetDevice("ModBus TCP");                        // ModBus TCP Driver in your Project Device Tree
   var color = in_color_picker.PickColor;
   var red = (color  >> 24) & 0xFF;
   var green = (color >> 16) & 0xFF;
   var blue = (color >> 8) & 0xFF;
 
   in_color_resipient.GetState(1).FillColor = color;

   device.Set(in_sRed, red); 
   device.Set(in_sGreen, green);
   device.Set(in_sBlue, blue);
}

// Обработчик "DMX 1". Скопируйте этот модуль, чтобы управлять еще одним ColourPicker:

IR.AddListener(IR.EVENT_ITEM_RELEASE,
               IR.GetItem("Page_ColorPicker").GetItem("Item Color Picker 1"),        //  Color Picker (Page.Item)
               function()
               {
                  work_pick_color(
                     IR.GetItem("Page_ColorPicker").GetItem("Item Color Picker 1"),  //  Color Picker (Page.Item)
                     IR.GetItem("Page_ColorPicker").GetItem("Item Display Color 1"), //  Display Colour Item (Page.Item)       
                     "R",                                                       //  Red Channel
                     "G",                                                       //  Green Channel
                     "B");                                                      //  Blue Channel
               }
               );

Загрузить файл скрипта для Color Picker

В настройках скрипта указываем (в строках, где имеются соответствующие комментарии):

  • имя Modbus драйвера в дереве проекта
  • Color Picker — имя страницы и элемента-палитры RGB на этой странице
  • Display — имя кнопки-дисплея для отображения цвета и управления яркостью
  • Red, Green, Blue — имена каналов в дереве проекта Modbus, куда должны записываться составляющие цвета в диапазоне от 0 до 255.

К графическому элементу — триггеру для управления яркостью светодиодной ленты, привязываем команду, отвечающую за регулирование яркости. Команду привязываем на событие интерфейса — «Press», активируем галочку настроек «Add a Feedback Channel» в том же диалоговом окне.

После этого модуль полностью готов к работе.

Загрузить пример реализации модуля управления RGB светодиодной лентой (Modbus)

↑ К оглавлению

Для обмена контроллера данными с подчиненными modbus-устройствами, необходимо создать запрос определенного типа к нужным регистрам памяти modbus-устройств и объявить в проекте глобальные переменные, связанные с соответствующими адресами этих регистров. В данном уроке разберем все нюансы присваивания для разных подмодулей Modbus.

Адрес глобальной переменной присваивается внесением записи в поле «Location». Структура записи выглядит следующим образом:

%[Форма] [Размер] [Идентификатор] . [Номер]

Форма регистра

Тип формы

Описание

Q

Глобальная переменная используется для записи Reg/Coil slave–устройства (WriteSingleСoil, WriteSingleRegister, WriteMultipleCoils, WriteMultipleRegisters)

I

Глобальная переменная используется для чтения Reg/Coil slave–устройства (ReadCoils, ReadInputDiscretes, ReadHoldingRegisters, ReadInputRegisters)

M

Глобальная переменная используется для записи и чтения

Размер переменной

Размер

Количество байтов

Тип данных

D

4

DINT, REAL, UDINT, DWORD

L

8

LINT, ULINT, LREAL, LWORD

B

1

BYTE, USINT, SINT

X

1

BOOL

W

2

WORD, INT, UINT

Идентификатор элемента

Структура

Предназначение

X.X.X

Для ModbusRequest

X.X

Для MemoryArea

X

Для остальных, не входящих в модуль расширения

Номер регистра выставляется согласно номеру в выборке ModbusRequest, при этом номер первого регистра равен 0.

Если пока ничего не понятно, то не стоит переживать, сейчас мы на примерах узнаем подробнее.

Допустим, есть slave–устройство, подключенное к порту RS-485_1 и нам необходимо прочитать состояние регистра с типом данных UINT по адресу 6032 и 6015. Modbus-адрес устройства — 5. Скорость передачи данных — 9600, 8-n-1.

Добавим подмодуль ModbusRTUMaster.

../_images/132.png

Выбираем нужный нам порт — RS_485_1, скорость передачи данных и тип 8-n-1.
Далее добавляем ModbusRequest для настройки конкретного slave–устройства.

Создадим запрос типа «Read Holding Registers» к нашему modbus-устройству, имеющему modbus-адрес 5 (Slave_Modbus_Adress:5). Начальный адрес пула регистров Start_Address сделаем равным: 6000. Так как регистр с адресом 6032 имеет размер W (используется 2 байта для хранения данных типа UINT, т.е. одна ячейка), то Regs_number запишем как 33. Таким образом, задействуются регистры с 6000 по 6032 включительно.

../_images/141.png

Далее напишем программу на языке FBD. Добавим глобальные переменные read_mdb1 и read_mdb2 с типом данных UINT.

../_images/152.png

Далее переходим во вкладку с глобальными переменными проекта. Пропишем Modbus-адреса для наших переменных.

../_images/gif91.gif

Как видно, мы задали адрес по структуре, указанной выше:

  • Прописываем «%»

  • Прописываем форму регистра для чтения ReadHoldingRegisters — «I»

  • Прописываем размер переменной — «W» в соответствии с типом данных UINT

  • Для ModbusRequest структура имеет вид «X.X.X» — «1.0.0.X»

  • Прописываем номера необходимых регистров 32 и 15.

Совет

Если в проекте несколько ModbusRequest, необходимо прописать нужный субмодуль, проверяя в дереве проекта

Имеется еще один вариант прописывания адреса. Для этого нажимаем на три точки в «Location» и далее выбираем наши нужные регистры.

../_images/gif10.gif

В данном случае мы сами выбираем адрес из нужного подмодуля. Также не забываем указать правильный номер регистра.

Внимание

После ввода Modbus-адреса через три точки в «Location» обычно ИСР Beremiz по умолчанию меняет тип данных на WORD

Рассмотрим другой пример. Допустим, у нас есть несколько переменных, которые необходимо прочитать другому устройству. В данном случае наш контроллер будет выполнять функции slave–устройства.

Итак, пусть переменными у нас будут LocalVar0 — LocalVar3 с типами данных WORD, REAL, LWORD и BOOL. Напишем простую программу, которая будет фиктивной.

../_images/162.png

Остальные переменные добавим в Config variables.

../_images/172.png

Следующим шагом мы добавим подмодуль MemoryArea. Зададим область адресов с 6000 с количеством регистров — 10. Тип MemoryArea выберем 03 — HoldingRegisters.

../_images/182.png

Остался последний шаг — корректно прописать адреса. С помощью таблицы структуры мы запишем сначала для LocalVar0:

  • Прописываем «%»

  • Прописываем форму регистра — «M»

  • Прописываем размер переменной — «W» в соответствии с типом данных WORD

  • Для MemoryArea структура имеет вид X.X — «1.0»

  • Прописываем номер, пусть LocalVar0 будет первым — «1.0.0»

../_images/192.png

Итоговый вариант глобальных пременных выглядит так:

../_images/202.png

Возникает вопрос: почему LocalVar2 прописан с адресом %ML1.0.3, а не %ML1.0.2? Потому что тип данных REAL имеет количество битов 4, значит занимает 2 ячейки. Аналогично с этим и прописан адрес для LocalVar3 — количество битов для типа данных LWORD — 8.

Готово, компиллируем и загружем программу, и теперь мастер-устройство может опросить, менять данные переменные обратишись к конроллеру по Modbus-адресу — 3(по умолчанию) со скоростью — 115200 к регистрам с адресами от 6000.

Modbus — коммуникационный протокол, основанный на архитектуре «клиент-сервер».
Широко применяется в промышленности для организации связи между
электронными устройствами. Может использовать для передачи данных
последовательные линии связи RS-485, RS-422, RS-232, а также сети TCP/IP (Modbus TCP).

История

Modbus был разработан фирмой Modicon (в настоящее время принадлежит Schneider Electric) для использования в её контроллерах с программируемой логикой. Впервые спецификация протокола была опубликована в 1979 году.[1]
Это был открытый стандарт, описывающий формат сообщений и способы их
передачи в сети состоящей из различных электронных устройств.

Первоначально контроллеры MODICON использовали последовательный интерфейс RS-232.[1]
Позднее стал применяться интерфейс RS-485, так как он обеспечивает
более высокую надёжность, позволяет использовать более длинные линии
связи и подключать к одной линии несколько устройств.

Многие производители электронного оборудования поддержали стандарт,
на рынке появились сотни использующих его изделий. В настоящее время
развитием Modbus занимается некоммерческая организация Modbus-IDA, созданная производителями и пользователями электронных приборов[2].

Введение

Modbus относится к протоколам прикладного уровня сетевой модели OSI.[3] Контроллеры на шине Modbus взаимодействуют, используя клиент-серверную модель, основанную на транзакциях, состоящих из запроса и ответа.

Обычно в сети есть только один клиент, так называемое, «главное» (англ. master) устройство, и несколько серверов — «подчиненных» (slaves)
устройств. Главное устройство инициирует транзакции (передаёт запросы).
Подчиненные устройства передают запрашиваемые главным устройством
данные, или производят запрашиваемые действия. Главный может
адресоваться индивидуально к подчиненному или инициировать передачу
широковещательного сообщения для всех подчиненных устройств.
Подчиненное устройство формирует сообщение и возвращает его в ответ на
запрос, адресованный именно ему. При получении широковещательного
запроса ответное сообщение не формируется.

Спецификация Modbus описывает структуру запросов и ответов. Их
основа — элементарный пакет протокола, так называемый PDU (Protocol
Data Unit). Структура PDU не зависит от типа линии связи и включает в
себя код функции и поле данных. Код функции кодируется однобайтовым
полем и может принимать значения в диапазоне 1…127. Диапазон значений
128…255 зарезервирован для кодов ошибок. Поле данных может быть
переменной длины. Размер пакета PDU ограничен 253 байтами.

Modbus PDU

номер функции данные
1 байт N < 253 (байт)

Для передачи пакета по физическим линиям связи PDU помещается в
другой пакет, содержащий дополнительные поля. Этот пакет носит название
ADU (Application Data Unit). Формат ADU зависит от типа линии связи.

Существуют три основных реализации протокола Modbus, две для
передачи данных по последовательным линиям связи, как медным
EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS-485), так и оптическим и радио:

  • Modbus RTU и
  • Modbus ASCII,

и для передачи данных по сетям Ethernet поверх TCP/IP:

  • Modbus TCP.

Общая структура ADU следующая (в зависимости от реализации, некоторые из полей могут отсутствовать):

адрес ведомого устройства код функции данные блок обнаружения ошибок

где

  • адрес ведомого устройства — адрес подчинённого устройства, к
    которому адресован запрос. Ведомые устройства отвечают только на
    запросы, поступившие в их адрес. Ответ также начинается с адреса
    отвечающего ведомого устройства, который может изменяться от 1 до 247.
    Адрес 0 используется для широковещательной передачи, его распознаёт
    каждое устройство, адреса в диапазоне 248…255 — зарезервированы;
  • номер функции — это следующее однобайтное поле кадра. Оно
    говорит ведомому устройству, какие данные или выполнение какого
    действия требует от него ведущее устройство;
  • данные — поле содержит информацию, необходимую ведомому
    устройству для выполнения заданной мастером функции или содержит
    данные, передаваемые ведомым устройством в ответ на запрос ведущего.
    Длина и формат поля зависит от номера функции;
  • блок обнаружения ошибок — контрольная сумма для проверки отсутствия ошибок в кадре.

Максимальный размер ADU для последовательных сетей RS232/RS485 — 256 байт, для сетей TCP — 260 байт.

Для Modbus TCP ADU выглядит следующим образом:

ид транзакции ид протокола длина пакета адрес ведомого устройства код функции данные

где

  • ид транзакции — два байта, обычно нули
  • ид протокола — два байта, нули
  • длина пакета — два байта, старший затем младший, длина следующей за этим полем части пакета
  • адрес ведомого устройства — адрес подчинённого устройства, к
    которому адресован запрос. Обычно игнорируется, если соединение
    установлено с конкретным устройством. Может использоваться, если
    соединение установлено с бриджом, который выводит нас, например, в сеть
    RS485.

Поле контрольной суммы в Modbus TCP отсутствует.

Категории кодов функций

В действующей в настоящее время спецификации протокола определяются три категории кодов функций:

Стандартные команды 
Их описание должно быть опубликовано и утверждено Modbus-IDA. Эта
категория включает в себя как уже определенные, так и свободные в
настоящее время коды.
Пользовательские команды 
Два диапазона кодов (от 65 до 72 и от 100 до 110), для которых
пользователь может реализовать произвольную функцию. При этом не
гарантируется, что какое-то другое устройство не будет использовать тот
же самый код для выполнения другой функции.
Зарезервированные 
В эту категорию входят коды функций, не являющиеся стандартными, но
уже используемые в устройствах, производимых различными компаниями. Это
коды 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 и 127.

Модель данных

Одно из типичных применений протокола — чтение и запись данных в
регистры контроллеров. Спецификация протокола определяет четыре таблицы
данных:

Таблица Тип элемента Тип доступа
Дискретные входы (Discrete Inputs) один бит только чтение
Регистры флагов (Coils) один бит чтение и запись
Регистры ввода (Input Registers) 16-битное слово только чтение
Регистры хранения (Holding Registers) 16-битное слово чтение и запись

Доступ к элементам в каждой таблице осуществляется с помощью
16-битного адреса, первой ячейке соответствует адрес 0. Таким образом,
каждая таблица может содержать до 65536 элементов. Спецификация не
определяет, что физически должны представлять собой элементы таблиц и
по каким внутренним адресам устройства они должны быть доступны.
Например, допустимо организовать перекрывающиеся таблицы, В этом случае
команды работающие с дискретными данными и с 16-битными регистрами
будут фактически обращаться к одним и тем же данным.

Следует отметить, что со способом адресации данных связана
определённая путаница. Modbus был первоначально разработан для
контроллеров Modicon. В этих контроллерах для каждой из таблиц
использовалась специальная нумерация. Например, первому регистру ввода
соответствовал номер ячейки 30001, а первому регистру хранения — 40001.
Таким образом, регистру хранения с адресом 107 в команде Modbus
соответствовал регистр № 40108 контроллера. Хотя такое соответствие
адресов больше не является частью стандарта, некоторые программные
пакеты могут автоматически «корректировать» вводимые пользователем
адреса, например, вычитая 40001 из адреса регистра хранения.

PDU запроса и ответа для стандартных функций

номер
функции
запрос/ответ
1 (0x01) A1 A0 Q1 Q0
N D (N байт)
2 (0x02) A1 A0 Q1 Q0
N D (N байт)
3 (0x03) A1 A0 Q1 Q0
N D (N байт)
4 (0x04) A1 A0 Q1 Q0
N D (N байт)
5 (0x05) A1 A0 D1 D0
A1 A0 D1 D0
6 (0x06) A1 A0 D1 D0
A1 A0 D1 D0
15 (0x0F) A1 A0 Q1 Q0 N D (N байт)
A1 A0 Q1 Q0
16 (0x10) A1 A0 Q1 Q0 N D (N байт)
A1 A0 Q1 Q0
  • A1 и A0 — адрес элемента,
  • Q1 и Q0 — количество элементов,
  • N — количество байт данных
  • D — данные

Чтение данных

Для чтения значений из перечисленных выше таблиц данных используются функции с кодами 1—4 (шестнадцатеричные значения 0x01—0x04):

  • 1 (0x01) — чтение значений из нескольких регистров флагов (Read Coil Status)
  • 2 (0x02) — чтение значений из нескольких дискретных регистров (Read Discrete Inputs)
  • 3 (0x03) — чтение значений из нескольких регистров хранения (Read Holding Registers)
  • 4 (0x04) — чтение значений из нескольких регистров ввода (Read Input Registers)

Запрос состоит из адреса первого элемента таблицы, значение которого
требуется прочитать, и количества считываемых элементов. Адрес и
количество данных задаются 16-битными числами, старший байт каждого из
них передается первым.

В ответе передаются запрошенные данные. Количество байт данных
зависит от количества запрошенных элементов. Перед данными передается
один байт, значение которого равно количеству байт данных.

Значения регистров хранения и регистров ввода передаются начиная с
указанного адреса, по два байта на регистр, старший байт каждого
регистра передаётся первым:

байт 1 байт 2 байт 3 байт 4 байт N-1 байт N
RA,1 RA,0 RA+1,1 RA+1,0 RA+Q-1,1 RA+Q-1,0

Значения флагов и дискретных входов передаются в упакованном виде:
по одному биту на флаг. Единица означает включённое состояние, ноль —
выключенное. Значения запрошенных флагов заполняют сначала первый байт,
начиная с младшего бита, затем следующие байты, также от младшего бита
к старшим. Младший бит первого байта данных содержит значение флага,
указанного в поле «адрес». Если запрошено количество флагов, не кратное
восьми, то значения лишних битов заполняются нулями:

байт 1 байт N
FA+7 FA+6 FA+5 FA+4 FA+3 FA+2 FA+1 FA 0 0 FA+Q-1 FA+Q-2

Запись одного значения

  • 5 (0x05) — запись значения одного флага (Force Single Coil)
  • 6 (0x06) — запись значения в один регистр хранения (Preset Single Register)

Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта).

Для регистра хранения значение является просто 16-битным словом.

Для флагов значение 0xFF00 означает включённое состояние, 0x0000 — выключенное, другие значения недопустимы.

Если команда выполнена успешно, ведомое устройство возвращает копию запроса.

Запись нескольких значений

  • 15 (0x0F) — запись значений в несколько регистров флагов (Force Multiple Coils)
  • 16 (0x10) — запись значений в несколько регистров хранения (Preset Multiple Registers)

Команда состоит из адреса элемента, количества изменяемых элементов,
количества передаваемых байт устанавливаемых значений и самих
устанавливаемых значений. Данные упаковываются так же, как в командах
чтения данных.

Ответ состоит из начального адреса и количества изменённых элементов.

Ниже приведён пример команды ведущего устройства и ответа ведомого (для Modbus RTU).

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Количество флагов ст. байт 05 Количество флагов мл. байт 06 Количество байт данных 07 Данные (значения для флагов биты 0-7) 08 Данные (значения для флагов биты 8-15) 09 CRC мл. байт 0A CRC ст. байт

Master→Slave

0x01

0x0F

0x00

0x13

0x00

0x0A

0x02

0xCD

0x01

0x72

0xCB

Направление передачи 00 адрес подчиненного устройства 01 номер функции 02 Адрес ст. байт 03 Адрес мл. байт 04 Количество флагов ст. байт 05 Количество флагов мл. байт 05 CRC мл. байт 06 CRC ст. байт

 Контроль ошибок в протоколе Modbus RTU

Во время обмена данными могут возникать ошибки двух типов:

  • ошибки, связанные с искажениями при передаче данных;
  • логические ошибки.

Ошибки первого типа обнаруживаются при помощи фреймов символов, контроля чётности и циклической контрольной суммы CRC-16-IBM (используется число-полином = 0xA001).

RTU фрейм

В RTU режиме сообщение должно начинаться и заканчиваться интервалом
тишины — временем передачи не менее 3.5 символов при данной скорости в
сети. Первым полем затем передаётся адрес устройства.

Вслед за последним передаваемым символом также следует интервал
тишины продолжительностью не менее 3.5 символов. Новое сообщение может
начинаться после этого интервала.

Фрейм сообщения передаётся непрерывно. Если интервал тишины
продолжительностью 1.5 возник во время передачи фрейма, принимающее
устройство должно игнорировать этот фрейм как неполный.

Таким образом, новое сообщение должно начинаться не раньше 3.5 интервала, т.к. в этом случае устанавливается ошибка.

Немного об интервалах (речь идёт о Serial Modbus RTU): при скорости
9600 и 11 битах в кадре (стартовый бит + 8 бит данных + бит контроля
чётности + стоп-бит): 3.5 * 11 / 9600 = 0,00401041(6), т.е. более 4 мс;
1.5 * 11 / 9600 = 0,00171875, т.е. более 1 мс. Для скоростей более
19200 бод допускается использовать интервалы 1,75 и 0,75 мс
соответственно.

Логические ошибки

Для сообщений об ошибках второго типа протокол Modbus RTU
предусматривает, что устройства могут отсылать ответы,
свидетельствующие об ошибочной ситуации. Признаком того, что ответ
содержит сообщение об ошибке, является установленный старший бит кода
команды. Пример кадра при выявлении ошибки ведомым устройством, в ответ
на запрос приведён в (Таблица 2-1).

1. Если Slave принимает корректный запрос и может его нормально обработать, то возвращает нормальный ответ.

2. Если Slave не принимает какого-либо значения, никакого ответа не отправляется. Master диагностирует ошибку по таймауту.

3. Если Slave принимает запрос, но обнаруживает ошибку (parity, LRC,
or CRC), никакого ответа не отправляется. Master диагностирует ошибку
по таймауту.

4. Если Slave принимает запрос, но не может его обработать
(обращение к несуществующему регистру и т.д.), отправляется ответ
содержащий в себе данные об ошибке.

Таблица 2-1. Кадр ответа (Slave→Master) при возникновении ошибки modbus RTU

Направление передачи адрес подчинённого устройства номер функции данные (или код ошибки) CRC

Запрос (Master→Slave)

0x01

0x77

0xDD

0xC7 0xA9

Ответ (Slave→Master)

0x01

0xF7

0xEE

0xE6 0x7C

] Стандартные коды ошибок

01 Принятый код функции не может быть обработан на подчиненном.
02 Адрес данных, указанный в запросе, не доступен данному подчиненному.
03 Величина, содержащаяся в поле данных запроса, является не допустимой величиной для подчиненного.
04 Невосстанавливаемая ошибка имела место, пока подчиненный пытался выполнить затребованное действие.
05 Подчиненный принял запрос и обрабатывает его, но это требует много времени.
Этот ответ предохраняет главного от генерации ошибки таймаута.
06 Подчиненный занят обработкой команды.
Главный должен повторить сообщение позже, когда подчиненный освободится.
07 Подчиненный не может выполнить программную функцию, принятую в запросе.
Этот код возвращается для неудачного программного запроса, использующего функции с номерами 13 или 14.
Главный должен запросить диагностическую информацию или информацию об ошибках с подчиненного.
08 Подчиненный пытается читать расширенную память, но обнаружил ошибку паритета.
Главный может повторить запрос, но обычно в таких случаях требуется ремонт.

Примечания

  1. 1 2 Modbus interface tutorial
  2. About Modbus-IDA
  3. Understanding the Modbus Protocol

Ссылки на используемые в статье источники

  • Modbus-IDA некоммерческая организация, которая поддерживает данный протокол
  • Оригинальные спецификации протокола на английском языке
  • Modbus Specifications and Implementation Guides (ModBus TCPIP)
  • Введение в Modbus протокол
  • Описание стандартного протокола ModBus на английском языке
  • Linux C Programming Examples
  • Как Modbus работает
  • Site for software developers which develop, test modbus protocol in drivers, devices, PLC etc.
  • FreeModbus — ASCII/RTU и TCP для микроконтроллеров

Утилиты

  • Утилита опроса и записи данных по протоколу Modbus RTU/ASCII — некорректно формирует запросы по TCP/IP (не по Modbus TCPIP Specifications and Implementation)
  • modpoll (Master) (win32, linux, solaris, qnx6 )
    — Бесплатная консольная утилита опроса и записи данных по протоколу
    Modbus RTU/ASCII/TCPIP; достаточно удобная, но код выхода программы
    (при правильных параметрах) всегда 0 (версия 2.4.0) даже если Slave
    вернул код ошибки на запрос (обещано исправить в след релизе).
  • PeakHMI MODBUS TCP/IP Slave simulator (Win GUI) — бесплатная и очень удобная утилита, симулятор ModBus TCP/IP Slave
  • Simply Modbus — программа испытания Modbus.
  • [1] — свободная библиотека на языке Ruby.
  • NModbus — реализация протокола Modbus на языке C#.

Прочие ссылки

  • Образовательный сайт об АСУ ТП. Спецификация Modbus RTU на русском языке

Понравилась статья? Поделить с друзьями:
  • Тип данных word delphi
  • Тип данных vba word
  • Тип графического редактора в word
  • Тип графики в word 2010
  • Тип word в паскале что это