Стандартные средства конфигурирования
Общая методика конфигурирования интерфейсов
Настройка обмена в CODESYS состоит из следующих действий:

Последовательность конфигурирования Modbus в CODESYS
Сначала следует добавить и настроить интерфейс. Затем выбрать режим работы интерфейса – Master или Slave (режим работы представляется отдельным компонентом). Если интерфейс работает в режиме master, то следует добавить все slave-устройства и указать для них адреса и опрашиваемые/записываемые регистры. Если интерфейс работает в режиме slave, то достаточно привязать к его регистрам нужные переменные.
Настройка контроллера в режиме Modbus_Serial_Master
Для настройки контроллера в режиме Modbus Serial Master следует:
1. Нажать ПКМ* на компонент Device и добавить компонент Modbus COM, расположенный во вкладке Промышленные сети/Modbus/Порт Modbus Serial.
*ПКМ — правая кнопка мыши
ВАЖНО! Версия компонента должна соответствовать версии таргет-файла. Для отображения всех доступных версий компонента следует установить галочку Отображать все версии.
Добавление компонента Modbus COM

В настройках компонента на вкладке Общее следует указать номер COM-порта контроллера и его сетевые настройки.

Нажать ПКМ на компонент Modbus COM и добавить компонент Modbus Master, расположенный во вкладке Промышленные сети /Modbus/Мастер Modbus Serial.

Добавление компонента Modbus Master
В настройках компонента на вкладке Общее следует задать настройки master-устройства.

Настройки компонента Modbus Master
- Режим передачи
Тип протокола обмена: Modbus RTU или Modbus ASCII
- Таймаут ответа
Время (в мс), в течение которого master ожидает ответа slave-устройства.
В случае отсутствия ответа по истечению этого времени master делает паузу на время между фреймами и переходит к опросу следующего канала slave-устройства (или следующему slave-устройству).
Значение, введенное здесь, будет по умолчанию использоваться для всех slave-устройств.
На вкладке Конфигурация Modbus Slave для каждого устройства можно задать индивидуальный таймаут отклика.
- Время между фреймами
Время (в мс) между получением ответа от slave-устройства и началом опроса следующего. Чем выше скорость, тем меньшим может быть это значение.
- Автоперезапуск соединения
В случае отсутствия галочки не ответившее slave-устройство исключается из дальнейшего опроса. Настоятельно рекомендуем всегда включать эту опцию.
Нажать ПКМ на компонент Modbus Master и добавить компонент Modbus Slave, расположенный во вкладке Промышленные сети /Modbus/Слейв Modbus Serial. Число компонентов должно соответствовать числу slave-устройств, подключенных к COM-порту. Максимальное возможное количество slave-устройств для одного master-устройства — 256.

Добавление компонента Modbus Slave

В настройках компонента на вкладке Общее следует указать адрес slave-устройства.
В случае необходимости можно указать индивидуальный таймаут ответа — он будет иметь приоритет по сравнению с таймаутом, установленным в настройках Modbus Master.
Диапазон доступных адресов slave-устройств — 1…247.
На вкладке Канал Modbus Slave происходит добавление каналов slave-устройства.
Канал является структурной единицей обмена, определяющей тип и число последовательно расположенных регистров slave-устройства и применяемую к ним операцию (чтение/запись).
Максимальное число каналов для одного устройства — 100. Для создания нового канала следует нажать кнопку Добавить канал, после чего определить его настройки:
Добавление канала Modbus Slave. После создания канала его можно отредактировать с помощью кнопки Изменить и переместить в списке добавленных каналов с помощью кнопок Выше/Ниже.

Параметры канала Modbus Slave
Основные функции протокола Modbus

Функция определяет операцию (чтение/запись) и область памяти, с которой эта операция будет произведена.
Области данных протокола Modbus

- Имя
Название канала
- Тип доступа
Функция, применяемая к регистрам slave-устройства
- Триггер
Тип обращения к регистрам slave-устройства: циклически, по переднему фронту заданной логической переменной или из кода приложения
- Время цикла
Желательный период опроса канала slave-устройства (для триггера типа циклический) должен быть кратен времени цикла задачи, к которой привязан обмен и быть не меньше, чем интервал ее вызова.Также время цикла должно выбираться в зависимости от опрашиваемого
устройства. Фактический период опроса может быть меньше желаемого (например, из-за наличия в проекте большого числа каналов опроса)
- Комментарий
Описание канала
- Сдвиг
Номер регистра или первого из последовательности регистров (для операций группового чтения/записи), к которым применяется заданная функция. Можно вводить как в десятичном, так и в шестнадцатеричном виде (например, 0x00FF или 16#00FF)
- Длина
Количество регистров, к которым применяется заданная функция (для операций группового чтения/записи)
- Обработка ошибок
Операция, выполняемая со значениями канала при возникновении ошибки обмена (только для считываемых регистров) — сохранение последнего значения или обнуление

В данном случае master-устройство каждые 100 мс будет опрашивать нулевой и первый holding регистры slave-устройства и по переднему фронту триггерной переменной записывать значение в десятый (16#000A=10#10) holding регистр slave-устройства. На вкладке Modbus Slave Init можно указать команды записи, однократно выполняемые при запуске проекта, а также после восстановления с ним связи в случае его обрыва.
На вкладке ModbusGenericSerialSlave Соотнесение входов/выходов осуществляется привязка переменных программы к каналам Modbus. Стандарт Modbus определяет использование переменных двух типов: BOOL и WORD.

Настройка контроллера в режиме Modbus RTU Slave
Для настройки контроллера в режиме Modbus RTU Slave следует:
1. Нажать ПКМ на компонент Device и добавить компонент Modbus COM, расположенный во вкладке Промышленные сети/Modbus/Порт Modbus Serial

2. Нажать ПКМ на компонент Modbus COM и добавить компонент Modbus Serial Device, расположенный во вкладке Промышленные сети/Modbus/Устройство Modbus Serial.

3. На вкладке Modbus Serial Device указываем настройки Slave-устройства.

Настройки компонента Modbus Serial Device
- ID
Адрес (Slave ID) контроллера в рамках выбранного COM-порта
- Сторожевой таймер
Время ожидания (мс) запроса от master-устройства. Если за это время запрос не приходит, то данные в регистрах обнуляются. В случае отсутствия галочки, обнуление данных не происходит
- Регистр значения
Количество Holding регистров данного Slave-устройства (2..4096)
- Запись
В случае установки галочки, в slave-устройстве значения регистров со стороны программы ПЛК можно будет изменять. В случае отсутствия галочки, изменение значений coils/holding регистров возможно только со стороны master-устройства
- Входные регистры
Количество Input регистров для данного slave-устройства (2..4096)
- Дискретные битовые области
В случае установки галочки в slave-устройстве будет использована следующая модель данных с независимыми областями памяти:
Coils/discrete, inputs/input, регистры/holding. При отсутствии галочки в slave-устройстве будет использована модель данных, в которой области
памяти битов и регистров являются общими:
Область coils наложена на область holding регистров, а область discrete inputs наложена на область input регистров. При этом области памяти holding регистров и регистров Input являются независимыми
- Обмотки
Количество coils для данного slave-устройства (1..65535)
- Дискретные входы
Количество discrete/inputs для данного slave-устройства (1..65535)
- Начальные адреса
Начальный адрес для каждой области памяти Modbus, в случае получения запроса к регистру, адрес которого меньше, чем адрес начального регистра, контроллер вернет ошибку 02 ILLEGAL_DATA_ADDRESS
Holding регистры обозначаются как каналы типа ВХОДЫ
Input регистры обозначаются как каналы типа ВЫХОДЫ
В случае установки галочки ЗАПИСЬ значения переменных, привязанных к каналам Holding регистров и Coils, нельзя будет изменить из визуализации - потребуется объявить промежуточные переменные, которые будут записываться из визуализации, и генерировать в визуализации команду копирования значений промежуточных переменных в переменные, привязанные к каналам компонента. Это связано с тем, что обработка компонентов Modbus и визуализации выполняются в разных задачах проекта
В случае установки галочки ЗАПИСЬ значения каналов Holding регистров и Coils нельзя будет изменить в режиме онлайн-отладки в компоненте Modbus Serial Device - потребуется изменить значения переменных, привязанных к этим каналам (в POU, где объявлены переменные или в списке просмотра, открываемом через меню ВИД)
Адреса регистров могут быть определены по числу в квадратных скобках в столбце Канал (в случае использования начальных адресов по умолчанию). ПРИМЕР: Входы[3] - holding регистр с адресом 3, Выходы[4] - input регистр с адресом 4. Адреса бит регистров(в случае отсутствия галочки Дискретные битовые области) вычисляются по формуле: адрес бита = номер регистра 16 + номер бита в регистре
На вкладке Modbus Serial Slave Соотнесение входов/выходов осуществляется привязка переменных программы к регистрам slave-устройства. Стандарт Modbus определяет использование двух типов данных BOOL и WORD. Задача программиста привязать к каждому регистру канала переменную соответствующего типа, либо привязать непосредственно к каналу массив переменных соответствующего типа. К каждому из битов WORD переменной можно привязать BOOL переменную( для Holding регистров эта привязка не исключает привязку WORD переменной, для Input регистров - исключает)
Для корректного обновления данных во вкладке Всегда обновлять переменные следует установить Включено 2 (Всегда в задаче цикла шины)
Для привязки переменных следует два раза кликнуть на ячейку столбца Переменная, после чего выбрать необходимую переменную проекта с помощью Ассистента ввода или ввести ее имя вручную.
Настройка контроллера в режиме Modbus TCP Master
Для настройки контроллера в режиме Modbus TCP Master следует:
Нажать ПКМ на компонент Device и добавить компонент Ethernet, расположенный во вкладке Промышленные сети/Ethernet-адаптер.

Затем следует установить соединение с контроллером, не загружая в него проект (Device–Установка соединения –Сканировать сеть) и в компоненте Ethernet на вкладке Конфигурация Ethernet выбрать нужный интерфейс.

Нажать ПКМ на компонент Ethernet и добавить компонент Modbus TCP Master, расположенный во вкладке Промышленные сети/Modbus/Мастер Modbus TCP

Далее таким же образом добавляем устройство Modbus TCP Slave.

Настраиваем Modbus TCP мастер.

Настраиваем Modbus TCP Slave

Настройки компонента TCP мастер
Таймаут ответа
Время в мс., в течении которого master ожидает ответа slave-устройства. В случае отсутствия ответа по истечению этого времени master-устройство делает паузу на время между фреймами и переходит к опросу следующего канала slave-устройства. Значение, введенное здесь, распространяется по умолчанию на все slave-устройства. Можно для каждого устройства задать индивидуальный таймаут отклика.
Таймаут сокета
Время в мс., в течении которого master ожидает ответа slave-устройства на запрос установки ТСР соединения.
Автоподключение
В случае отсутствия галочки не ответившее slave-устройство исключается из дальнейшего опроса.
Настоятельно рекомендуем всегда включать эту опцию.
Настройки вкладки ОБЩЕЕ дублируются на вкладке Modbus TCP Slave Конфигурация. На данной вкладке также можно задать адрес Unit ID slave-устройства в тех случаях, когда производится опрос устройства через шлюз Modbus TCP/Modbus Serial или устройство не отвечает на запросы, в которых Unit ID имеет значение, предусмотренное спецификацией Modbus по умолчанию (16#FF). Выбор адресата 0 не поддерживается (в этом случае в запросе будет принудительно установлен адрес 16#FF).
Практический пример
В качестве примера будем использовать контроллер XINJE XSLH-24A8. Нередко в нашей практике случаются ситуации, когда имеется контроллер одного производителя, а настроить взаимодействие необходимо с устройствами других производителей.
В нашем примере мы будем использовать блоки расширения Овен.
Блок дискретного вывода МУ110-224.16К
Модуль дискретного ввода МВ110-224.16ДН
Работать будем в режиме Modbus RTU.
Открываем новый проект и добавляем необходимые компоненты.

Настраиваем Modbus COM

В контроллере XINJE XSLH-24A8 два последовательных порта:
RS232 — COM1 и RS485 — COM2
Данные устройства ОВЕН настроены были ранее следующим образом:
115200, NONE, 8,1;
Заносим все эти значения в конфигурацию последовательного порта.
Переходим во вкладку Modbus_Master_COM_Port

Далее переходим к настройке Modbus_Slave_COM_Port.
Сколько у нас устройств, столько и должно быть Slave-устройств.
Переименуем для нашего удобства Slave-компоненты.

Выделяем наше Slave-устройство, ПКМ — Рефакторинг

Аналогично поступаем со вторым устройством. В результате получаем:

Далее переходим во вкладку ОБЩЕЕ:
Адрес первого устройства: 32;
Адрес второго устройства: 36;
Cоздаём каналы

Запись в регистры осуществляется командой Write Multiple Registers 16(0х10).
Битовая маска значений всех выходов 0050.
Модуль дискретного вывода МУ110-224.16К (у модуля 16 дискретных выходов D01 … D016)

Cоздаём канал для второго устройства.
Модуль дискретного ввода МВ110-224.16ДН (у модуля 16 дискретных входов DI1 … DI16).
Адрес регистра битовой маски значений входов 0051;
Адреса регистров входов 0064 .. 0079;
Чтение осуществляется командами 03 (Read Holding Registers) или 04 (Read Inputs Registers);

Тестовая программа
Переходим в PLC_PRG и объявляем несколько переменных.
PROGRAM PLC_PRG
VAR
xDInputs :ARRAY[0..0] OF WORD;// MU110-16K
xDOutputs :ARRAY[0..0] OF WORD;//MV110-16DN
Gen :BLINK;
Count :WORD;
PULS :BOOL;
CTU_01 :CTU;
END_VAR
GEN(ENABLE:= TRUE, TIMELOW:= T#3S , TIMEHIGH:= T#3S );
PULS := GEN.OUT;
CTU_01(
CU:= PULS ,
RESET:= CTU_01.Q ,
PV:= 255 ,
Q=> ,
CV=> Count );
xDInputs[0] := Count;
xDOutputs[0] := xDInputs[0];
Соотнесение входов/выходов MU110-16K

Соотнесение входов/выходов MV110-16DN

Компилируем программу, убеждаемся, что ошибок нет. Устанавливаем соединение и загружаем программу в контроллер.

Пример 2. Группа FB (Параметры протокола RS485). Частотник CV900


Протокол MODBUS RTU
0: нет проверки на четность (N, 8, 1)
1: проверка на четность (E, 8, 1)
2: проверка на нечетность (0, 8, 1)
3: нет проверки на четность (N, 8, 2)
4: проверка на четность (E, 8, 2)
5: проверка на нечетность (0, 8, 2)
Протокол MODBUS ASCII не поддерживается.

0: Отвечать на операции записи
1: Не отвечать на операции записи
С помощью уставки данного параметра частотный преобразователь получает возможность отвечать на все команды считывания информации, но не отвечать на команды записи, поступающие от ведущего устройства. Таким образом, может быть повышена эффективность обмена данными.

Данный параметр используется для задания весового коэффициента для значения частоты, поступающей по протоколу RS-485, в случае, когда частотный преобразователь выступает в качестве ведомого устройства в сети. Действующее значение частоты представляет собой произведение корреляционного коэффициента и значения, поступающего по протоколу RS-485.
Создаем новый проект и настраиваем компоненты согласно ранее приведенных таблиц:


- Адреса регистров и коды команд
Поддерживаемые коды команд

- Адреса регистров

Входные данные
Давайте прочтем параметры действующих значений
Адреса регистров действующих значений — 0xD000(0x1D00)~0xD039(0x1D39)
Создаем переменную xDInputs
Адреса регистров находятся в диапазоне 0хD000 .. 0xD039;
Объявляем массив с количеством элементов равным разности D039 — D000; в десятичной
системе — это 57. Т.о. объявляем массив типа WORD из 57 элементов.
Создаем канал.

Переходим на вкладку Соотнесение входов/выходов

Устанавливаем соединение, загружаем программу в ПЛК. Значки у нас зеленого цвета, все нормально работает.
Мною выбран параметр xDInputs[11]. Т.е. одиннадцатый элемент массива. Это тот элемент, который отвечает за частоту. Мы можем вращать ручку потенциометра на приборе и наблюдать за изменением частоты, а также сравнить показания на панели прибора и значением в регистре.

PLC_PRG
PROGRAM PLC_PRG
VAR
xDInputs :ARRAY[0..56] OF WORD;
END_VAR
xDInputs[11];
Теперь давайте задавать частоту .
За эти параметры(согласно описанию) отвечают регистр 2001H.
Все нужно выполнять в одной программе, но для лучшего понятия все сделаем отдельно.
Создаем новый проект, добавляем и настраиваем необходимые компоненты(как указано выше).
Объявляем переменную
xDOutputs :ARRAY[0..0] OF WORD;
в частотнике в параметре F 0.07 устанавливаем значение 2: Набор 3 (Протокол обмена данными)
Два клика по элементу Modbus_Slave_COM_PORT, вкладка Канал Modbus Slave. Добавить канал.
Адрес регистра для установки частоты 0х2001(согласно описанию).
Команда записи в регистр Write Single Register(код функции 6).
Два клика по элементу Modbus_Slave_COM_PORT, вкладка Канал Modbus Slave. Добавить канал.

Вкладка Соотнесение входов/выходов.

Пишем программу. В нашей программе для большей наглядности значение будет меняться автоматически.
PROGRAM PLC_PRG
VAR
xDOutputs :ARRAY[0..0] OF WORD;
wdFreq :WORD;
Count :WORD;
TRAFO :LIN_TRAFO;
Sign :BLINK;
Puls :BOOL;
CTU_01 :CTU;//______________________________________________
END_VAR
Sign(ENABLE:= TRUE , TIMELOW:= T#500MS , TIMEHIGH:= T#500MS );
Puls := Sign.OUT;
CTU_01(
CU:= Puls ,
RESET:= CTU_01.Q ,
PV:= 100 ,
Q=> ,
CV=> );
TRAFO(
IN:= CTU_01.CV ,
IN_MIN:=0 ,
IN_MAX:=100 ,
OUT_MIN:= 0,
OUT_MAX:= 10000,
OUT=> ,
ERROR=> );
wdFreq := REAL_TO_WORD(TRAFO.OUT);
xDOutputs[0] := wdFreq;

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