---
title: "Руководство пользователя Библиотека paModbus"
product: "Полигон"
document_number: "№ 1-RU-134025-1.2"
version: "1.2"
language: "ru"
source: "https://docs.owen.ru/product/poligon/doc/1205"
pdf: "https://docs.owen.ru/download/pdf/DwNmI.rp_biblioteka+pamodbus_1-ru-134025-1.2.pdf"
generated: "2026-10-09"
---

# Руководство пользователя Библиотека paModbus

## Содержание

- [Используемые термины и сокращения](#topic-94782)
- [Введение](#topic-94783)
- [Общие сведения](#topic-94784)
  - [Основные сведения об интерфейсе RS-485](#topic-94785)
  - [Основные сведения о протоколе Modbus](#topic-94786)
- [Функциональные блоки настройки интерфейсов](#topic-94787)
  - [Функциональные блоки настройки COM-портов](#topic-94788)
    - [Порт RS-485 (210-RS485)](#topic-94789)
    - [Порт RS-232 (210-RS232)](#topic-94790)
  - [Функциональные блоки настройки TCP-соединений](#topic-94791)
    - [TCP/IP-сервер (TcpIpSrA)](#topic-94792)
    - [TCP/IP-клиент (TcpIpClA)](#topic-94793)
- [Библиотека paModbus](#topic-94794)
  - [Modbus RTU](#topic-94795)
    - [Блок Modbus RTU Master](#topic-94796)
    - [Блок Modbus RTU Slave](#topic-94797)
  - [Modbus TCP](#topic-94798)
    - [Блок Modbus TCP Master](#topic-94799)
    - [Блок Modbus TCP Slave](#topic-94800)
  - [Команды чтения](#topic-94801)
    - [Команда чтения флагов 0x01 (ModbusCoilIn)](#topic-94802)
    - [Команда чтения дискретных входов 0x02 (ModbusDInputIn)](#topic-94803)
    - [Команда чтения регистров хранения 0x03 (ModbusRegIn)](#topic-94804)
    - [Команда чтения входных регистров 0x04 (ModbusAInputIn)](#topic-94805)
    - [Команда чтения вещественного числа 0x03/0x04 (ModbusFltIn)](#topic-94806)
    - [Команда чтения результатов измерения аналогового входа (OwenFltIn)](#topic-94807)
  - [Команды записи](#topic-94808)
    - [Команда записи одного флага 0x05 (ModbusCoilOut)](#topic-94809)
    - [Команда записи одного регистра хранения 0x06 (ModbusRegOut)](#topic-94810)
    - [Команда записи нескольких флагов 0x0F (ModbusCoilsOut)](#topic-94811)
    - [Команда записи нескольких регистров хранения 0x10 (ModbusRegsOut)](#topic-94812)
    - [Команда записи вещественного числа 0x10 (ModbusFltOut)](#topic-94813)
  - [Буфер чтения/записи уставок с плавающей точкой (BufSupFltEx)](#topic-94814)
  - [Диагностика и управление обменом](#topic-94815)
- [Методика настройки обмена по протоколу Modbus](#topic-94816)
  - [Общая методика конфигурирования интерфейсов](#topic-94817)
  - [Настройка ПЛК в режиме Modbus RTU Master](#topic-94818)
  - [Настройка ПЛК в режиме Modbus RTU Slave](#topic-94819)
  - [Настройка ПЛК в режиме Modbus TCP Master](#topic-94820)
  - [Настройка ПЛК в режиме Modbus TCP Slave](#topic-94821)
- [Запись уставок по протоколу Modbus](#topic-94822)
  - [Запись целочисленных уставок по протоколу Modbus (BufSupEx)](#topic-94823)
  - [Запись уставок с плавающей точкой по протоколу Modbus (BufSupFltEx)](#topic-94824)
- [Примеры настройки обмена по протоколу Modbus](#topic-94825)
  - [ПЛК210 (Modbus RTU Master) и модули Мх110](#topic-94826)
  - [ПЛК210 (Modbus RTU Slave) и Owen OPC Server](#topic-94827)
  - [ПЛК210 (Modbus TCP Master) и модули Мх210](#topic-94828)
  - [ПЛК210 (Modbus TCP Slave) и Owen OPC Server](#topic-94829)
- [Коды ошибок Modbus (Modbus Exception Codes)](#topic-94830)

<a id="topic-94782"></a>

## Используемые термины и сокращения

**ПК** – персональный компьютер.

**ПЛК** – программируемый логический контроллер.

**ШИМ** – широтно-импульсная модуляция.

**OPC UA (Open Platform Communications, Unified Architecture)** – протокол для обмена данными с ПЛК и для управления ими.

**SQL** (**Structured Query Language**) – язык программирования для хранения и обработки информации в реляционной базе данных.

<a id="topic-94783"></a>

## Введение

Настоящее руководство описывает настройку обмена данными по протоколам **Modbus** **RTU** и **Modbus** **TCP** для контроллеров ОВЕН, программируемых в среде **Полигон**. Подразумевается, что читатель обладает базовыми навыками работы с **Полигон**, поэтому общие вопросы (например, создание и загрузка проектов) в данном документе не рассматриваются – они подробно описаны в документах [Руководство по программированию. Библиотека paCore](https://owen.ru/product/polygon/documentation) и [Быстрый старт](https://owen.ru/product/polygon/documentation).

Настройка обмена по протоколу **Modbus** в среде **Полигон** осуществляется с помощью функциональных блоков из библиотеки <b>*paModbus*</b>.

Примеры в документе актуальны для среды **Полигон** версии **1994** и для библиотеки **paModbus** версии **117** и выше.

<a id="topic-94784"></a>

## Общие сведения

<a id="topic-94785"></a>

### Основные сведения об интерфейсе RS-485

Интерфейс [RS-485](https://ru.wikipedia.org/wiki/RS-485) подразумевает использование исключительно топологии типа «шина» (топологии типа «звезда» и «кольцо» не описаны в стандарте).

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

Число Slave-устройств в сегменте сети не должно превышать **32**. Сегменты могут быть соединены повторителями (например, [ОВЕН АС5](https://owen.ru/product/owen_as5)), но следует учитывать, что так как опрос всех устройств происходит последовательно, то время одного полного цикла опроса может значительно увеличиться. Общее ограничение числа Slave-устройств в сети для протокола **Modbus** – **247**.

На первом и последнем устройстве в сети рекомендуется устанавливать согласующий резистор (терминатор) с сопротивлением **120 Ом**.

Для линий связи RS-485 необходимо использовать экранированный кабель с витой парой, предназначенный для промышленного интерфейса RS-485 с волновым сопротивлением **120 Ом** (например, КИПЭВ). Экран кабеля должен быть соединен с функциональной землей **только в одной точке**.

Некоторые устройства имеют встроенные резисторы подтяжки интерфейса RS-485. Информация и рекомендации по их использованию приведены в руководстве по эксплуатации на соответствующие приборы.

<a id="topic-94786"></a>

### Основные сведения о протоколе Modbus

[Modbus](https://ru.wikipedia.org/wiki/Modbus) – открытый коммуникационный протокол, основанный на архитектуре Master-Slave (ведущий-ведомый). Спецификация протокола доступна на сайте [Modbus Organization](https://www.modbus.org/specs.php).

**Master** (мастер, ведущее устройство) является инициатором обмена и может считывать и записывать данные в Slave-устройства.

**Slave** (слэйв, подчиненное устройство) отвечает на запросы Master-устройства, но не может самостоятельно инициировать обмен.

Существуют две основные реализации протокола:

- **Modbus** **Serial** для передачи данных с использованием последовательных интерфейсов [RS-232](https://ru.wikipedia.org/wiki/RS-232)/[RS-485](https://ru.wikipedia.org/wiki/RS-485)
- **Modbus** **TCP** для передачи данных через сети [TCP/IP](https://ru.wikipedia.org/wiki/TCP/IP).

Если для работы используют протокол **Modbus RTU** с интерфейсом **RS-232/RS-485**, то в сети может присутствовать **только одно** Master-устройство и несколько (до **247**) Slave-устройств. Адрес **0** используется для широковещательной рассылки (команд записи, которую получат все Slave-устройства).

У протокола **Modbus TCP** нет явного ограничения на количество Master- и Slave-устройств. Кроме того, устройство может одновременно выполнять функции Master и Slave.

Запрос Master-устройства к Slave-устройству содержит следующие данные:

- **Slave** **ID** (адрес Slave-устройства);
- **Код функции**, применяемой к Slave-устройству;
- **Данные** – адрес первого регистра и их количество (в случае записи – также записываемые значения);
- **Контрольная сумма**.

Ответ Slave-устройства имеет схожую структуру.

Запрос Master-устройства представляет собой обращение к одной из **областей памяти** Slave-устройства с помощью определенной функции. Область памяти характеризуется типом хранящихся в ней значений (биты/регистры) и типом доступа (только чтение/чтение и запись). Стандарт Modbus определяет четыре области памяти.

**Области данных протокола Modbus**

| Область данных | Обозначение | Тип данных | Тип доступа |
| --- | --- | --- | --- |
| <b>*Coils*</b> (Регистры флагов) | 0x | BOOL | Чтение/запись |
| <b>*Discrete Inputs*</b> (Дискретные входы) | 1x | BOOL | Только чтение |
| <b>*Input Registers*</b> (Регистры ввода) | 3x | WORD | Только чтение |
| <b>*Holding Registers*</b> (Регистры хранения) | 4x | WORD | Чтение/запись |

Каждая область памяти состоит из определенного (зависящего от конкретного устройства) количества ячеек. Каждая ячейка имеет уникальный адрес. Для конфигурируемых устройств (таких как ТРМ, ПЧВ и т. д.) производитель предоставляет **карту регистров**, в которой содержится информация об адресах и типах параметров устройства. Для программируемых устройств пользователь формирует такую карту самостоятельно с помощью среды разработки. Существуют устройства, в которых сочетаются оба рассмотренных случая – у их карты регистров есть фиксированная часть, которую пользователь может дополнить в соответствии со своей задачей (но адреса ячеек не должны пересекаться).

> [!NOTE]
> **Примечание.** В некоторых устройствах области памяти наложены друг на друга (например, **0x** и **4x**) – т. е. к одним и тем же ячейкам памяти можно обращаться разными функциями.

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

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

| Код функции | Имя функции | Команда |
| --- | --- | --- |
| 1 (0x01) | Read Coil Status | Чтение значений из регистров флагов |
| 2 (0x02) | Read Discrete Inputs | Чтение значений из дискретных входов |
| 3 (0x03) | Read Holding Registers | Чтение значений из регистров хранения |
| 4 (0x04) | Read Input Registers | Чтение значений из регистров ввода |
| 5 (0x05) | Write Single Coil | Запись значения в один регистр флага |
| 6 (0x06) | Write Single Register | Запись значения в один регистр хранения |
| 15 (0x0F) | Write Multiple Coils | Запись значений в несколько регистров флагов |
| 16 (0x10) | Write Multiple Registers | Запись значений в несколько регистров хранения |

> [!NOTE]
> **Примечание.** Нельзя смешивать понятия области памяти и функции. У начинающих пользователей часто возникают проблемы при работе с **Input** и **Holding** регистрами, поскольку область памяти **Holding** регистров имеет обозначение **4x**, а функция чтения **Holding** регистров – **0x03** (может интуитивно показаться, что идентификатор области памяти и код функции должны совпадать – но на практике это не так).

Запрос к Slave-устройству может быть **одиночным** или **групповым**.

При одиночном запросе Master-устройство считывает каждый из параметров Slave-устройства отдельной командой. При групповом опросе Master-устройство считывает одной командой сразу несколько параметров, адреса которых в карте регистров расположены строго последовательно и не имеют разрывов.

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

> [!NOTE]
> **Примечание.** Согласно стандарту Modbus объем данных кадра ответа не может превышать **125** регистров. Поэтому групповой запрос запрашивает ограниченное количество регистров. Для 4-байтовых переменных типа float количество аргументов не должно превышать **63**.

<a id="topic-94787"></a>

## Функциональные блоки настройки интерфейсов

<a id="topic-94788"></a>

### Функциональные блоки настройки COM-портов

В данном разделе описаны блоки настройки COM-портов контроллеров ОВЕН ПЛК210 из библиотеки <b>*paOwenIO*</b>.

<a id="topic-94789"></a>

#### Порт RS-485 (210-RS485)

Блок <b>*210-RS485*</b> предназначен для работы с портами ПЛК210 стандарта RS-485.

<a id="t1"></a>

**Назначение входов и выходов 210-RS485**

**Входы (константные)**

| Элемент | Описание |
| --- | --- |
| port | Порт |
| spd | Скорость в бодах – **1200**, **2400**, **4800**, **9600**, **19200**, **38400**, **57600**, **115200** |
| par | Контроль четности:<br>**0** – нет;<br>**1** – нечетный;<br>**3** – четный |
| stb | Количество стоповых бит – **7** или **8** |
| dtb | Количество бит данных – **1** или **2** |
| term | Включение/выключение терминальных резисторов |

**Выходы**

| Элемент | Описание |
| --- | --- |
| cnc | Связь с блоком протокола |
| stat | Статус:<br>**1** - соединение установлено;<br>**-1** - не удалось открыть указанный интерфейс;<br>**-2** - отсутствует соединение;<br>**-6** - ошибка настройки интерфейса |
| rcnt | Количество полученных байт |
| wcnt | Количество отправленных байт |
| diag | Диагностический – счетчик разности между количеством ошибок и принятыми (не может быть меньше нуля) |

![210-RS485](https://docs.owen.ru/book_img/1905/133845.png)

*Порт RS-485 (210-RS485)*

<a id="topic-94790"></a>

#### Порт RS-232 (210-RS232)

Блок <b>*210-RS232*</b> предназначен для работы с портом ПЛК210 стандарта RS-232.

<a id="topic-94790--t1"></a>

**Назначение входов и выходов 210-RS232**

**Входы (константные)**

| Элемент | Описание |
| --- | --- |
| spd | Скорость в бодах – **1200**, **2400**, **4800**, **9600**, **19200**, **38400**, **57600**, **115200** |
| par | Контроль четности:<br>**0** – нет;<br>**1** – нечетный;<br>**3** – четный |
| stb | Количество стоповых бит – **7** или **8** |
| dtb | Количество бит данных – **1** или **2** |

**Выходы**

| Элемент | Описание |
| --- | --- |
| cnc | Связь с блоком протокола |
| stat | Статус:<br>**1** - соединение установлено;<br>**-1** - не удалось открыть указанный интерфейс;<br>**-2** - отсутствует соединение |
| rcnt | Количество полученных байт |
| wcnt | Количество отправленных байт |
| diag | Диагностический – счетчик разности между количеством ошибок и принятыми (не может быть меньше нуля) |

![210-RS232](https://docs.owen.ru/book_img/1905/133844.png)

*Порт RS-232 (210-RS232)*

<a id="topic-94791"></a>

### Функциональные блоки настройки TCP-соединений

В данном разделе описаны блоки настройки TCP-соединений ПЛК210 из библиотеки <b>*paCore*</b>.

<a id="topic-94792"></a>

#### TCP/IP-сервер (TcpIpSrA)

Блок <b>*TcpIpSrA*</b> представляет собой TCP/IP-сервер для обеспечения работы протоколов (например, [Modbus TCP Slave](#topic-94800)). Сервер поддерживает одновременно не более **20** подключений.

**Назначение входов и выходов TcpIpSrA**

**Входы (константные)**

| Элемент | Описание |
| --- | --- |
| prt | Локальный порт |
| lip | Локальный IP адрес |
| sdr | Сетевой стек, для ПЛК ОВЕН **"/"** |
| wait | Время до закрытия пустого канала, мс. При установке **0** – никогда |

**Выходы**

| Элемент | Описание |
| --- | --- |
| cnc | Связь с блоком протокола |
| stat | Статус:<br>**0** – есть подключения;<br>**>0** – нет подключений |

![Tcp Ip Sr A](https://docs.owen.ru/book_img/1905/133843.png)

*TCP/IP-сервер (TcpIpSrA)*

При настройке блока <b>*TcpIpSrA*</b> удобно использовать технологию SQL-запросов. Это позволяет изменять IP-адрес и порт в одном месте и использовать эти значения в разных частях проекта.

Запрос IP-адреса (prop_ip):

```
"<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_ip"</sql>"
```

Запрос пользовательского свойства <b>*Пользовательское свойство 00*</b> (prop_0):

```
<sql> SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_0"</sql>
```

<a id="topic-94793"></a>

#### TCP/IP-клиент (TcpIpClA)

Блок <b>*TcpIpClA*</b> представляет собой TCP/IP-клиент для обеспечения работы протоколов (например, [Modbus TCP Master](#topic-94799)).

Так как работа блока занимает значительное время, может быть размещен только в <b>*Фоне*</b>.

**Назначение входов и выходов TcpIpClA**

**Входы (константные)**

| Элемент | Описание |
| --- | --- |
| lprt | Локальный порт |
| lip | Локальный IP адрес |
| sdr | Сетевой стек, для ПЛК ОВЕН **"/"** |
| rprt | Удаленный порт |
| ip | IP адрес удаленного сервера |

**Выходы**

| Элемент | Описание |
| --- | --- |
| cnc | Связь с блоком протокола |
| stat | Статус:<br>**0** – есть связь с TCP/IP-сервером;<br>**>0** – нет связи |

![Tcp Ip Cl A](https://docs.owen.ru/book_img/1905/133842.png)

*TCP/IP-клиент (TcpIpClA)*

При настройке блока <b>*TcpIpClA*</b> удобно использовать технологию SQL-запросов. Это позволяет изменять IP-адреса и порты в одном месте, и использовать эти значения в разных частях проекта.

Запрос IP-адреса (prop_ip):

```
"<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_ip"</sql>"
```

Запрос пользовательского свойства <b>*Пользовательское*</b> <b>*свойство*</b> <b>*00*</b> (prop_0):

```
<sql> SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_0"</sql>
```

<a id="topic-94794"></a>

## Библиотека paModbus

Библиотека <b>*paModbus*</b> содержит функциональные блоки для обмена по протоколам Modbus – блоки **Modbus** **Master** и **Modbus** **Slave**, а также блоки команд чтения и записи.

Для добавления библиотеки <b>*paModbus*</b> в проект следует:

1. Перейти в меню <b>*Окна/Проекты*</b>. В появившемся окне отобразится текущий проект и добавленные библиотеки.

   ![Доб Памодб](https://docs.owen.ru/book_img/1905/133841.png)

   *Добавление библиотеки paModbus в проект*

2. Нажать кнопку <b>*Открыть*</b> и перейти в папку с файлами библиотеки, которую необходимо добавить. Затем в выпадающем списке выбрать тип файла <b>*Библиотека Полигон 2 (\*.*</b><b>*ll*</b><b>*2)*</b>

   ![Доб Памодб 2](https://docs.owen.ru/book_img/1905/133840.png)

   *Добавление библиотеки paModbus в проект*

3. В окне появится файл библиотеки с расширением **.ll****2**. Необходимо выбрать его и нажать **Открыть**.

   ![Доб Памодб 3](https://docs.owen.ru/book_img/1905/133839.png)

   *Добавление библиотеки paModbus в проект*

   Добавленная библиотека отобразится в окне <b>*Проекты*</b>.

<a id="topic-94795"></a>

### Modbus RTU

<a id="topic-94796"></a>

#### Блок Modbus RTU Master

Блок <b>*Modbus*</b> <b>*RTU*</b> <b>*Master*</b> обеспечивает работу **Master**-устройства по протоколу **Modbus** **RTU**.

Так как работа блока занимает значительное время, его можно разместить только в **Фоне**.

**Назначение входов и выходов Modbus RTU Master**

**Входы**

| Элемент | Описание |
| --- | --- |
| cnc | Связь с блоком COM-порта ([210-RS485](#topic-94789), [210-RS232](#topic-94790)) |
| enbl | Разрешение работы |
| tmp | Время (в мс) между получением ответа от Slave-устройства и началом опроса следующего (константный) |
| wait | Время (в мс), в течение которого Master ожидает ответа Slave устройства (константный) |
| bo | Входы для связи с [блоками записи](#topic-94808) (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| itr | Связь с [блоками чтения](#topic-94801) |
| sts | Статус работы:<br>**0** – есть связь;<br>**>0** – нет связи или Slave не отвечает (в младшем байте: **1** –Slave не отвечает, **2** –неверная контрольная сумма) |

Команды, подключенные к блоку Master, опрашиваются последовательно с периодичностью **tmp**. Выключенные команды (вход **enb** блока команды, равный **0**) пропускаются.

> [!WARNING]
> **Внимание.** Для правильной инициализации необходимо разместить в программе блок Master после [блоков записи](#topic-94808) (см. свойства блоков <b>*Порядок*</b>).

Чтение осуществляется циклически, запись – по изменению.

![fb rtu mas](https://docs.owen.ru/book_img/1905/133838.png)

*Блок Modbus RTU Master*

<a id="topic-94797"></a>

#### Блок Modbus RTU Slave

Блок <b>*Modbus*</b> <b>*RTU*</b> <b>*Slave*</b> обеспечивает работу Slave-устройства по протоколу **Modbus** **RTU**.

Так как работа блока занимает значительное время, его можно разместить только в **Фоне**.

**Назначение входов и выходов Modbus RTU Slave**

**Входы**

| Элемент | Описание |
| --- | --- |
| cnc | Связь с блоком COM-порта ([210-RS485](#topic-94789), [210-RS232](#topic-94790)) |
| enbl | Разрешение работы |
| tmp | Периодичность обработки запросов, мс (константный) |
| wait | Время ожидания запроса от Master, мс (константный) |
| bo | Входы для связи с [блоками записи](#topic-94808) (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| itr | Связь с [блоками чтения](#topic-94801) |
| sts | Не используется |

Slave обрабатывает команды, полученные от Master, с периодичностью **tmp**. Если при обработке команды не обнаружен соответствующий блок команды, то Slave посылает мастеру соответствующую ошибку:

- <b>*0x80 | команда*</b> – нет блока с соответствующим кодом команды, код команды – в блоке не определен запрашиваемый адрес (например, при опросе Holding Register команда *0х03*, тогда ошибка: *0x80 | 0x03 = 0x83*);
- <b>*0x23*</b> – неверная контрольная сумма.

![fb rtu slave](https://docs.owen.ru/book_img/1905/133837.png)

<i>Блок **Modbus RTU Slave**</i>

<a id="topic-94798"></a>

### Modbus TCP

<a id="topic-94799"></a>

#### Блок Modbus TCP Master

Блок <b>*Modbus TCP Master*</b> обеспечивает работу Master-устройства по протоколу **Modbus** **TCP**.

Так как работа блока занимает значительное время, его можно разместить только в **Фоне**.

**Назначение входов и выходов Modbus TCP Master**

**Входы**

| Элемент | Описание |
| --- | --- |
| cnc | Связь с блоком [TcpIpClA](#topic-94793) |
| enbl | Разрешение работы |
| tmp | Время (в мс) между получением ответа от Slave-устройства и началом опроса следующего (константный) |
| wait | Время (в мс), в течение которого Master ожидает ответа Slave устройства (константный) |
| bo | Входы для связи с [блоками записи](#topic-94808) (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| itr | Связь с [блоками чтения](#topic-94801) |
| sts | Статус работы:<br>**0** – есть связь с сервером TCP/IP<br>**>0** – нет связи или Slave не отвечает |

Команды, подключенные к блоку Master, опрашиваются последовательно с периодичностью **tmp**. Выключенные команды (вход **enb** блока команды, равный **0**) пропускаются.

Чтение осуществляется циклически, запись – по изменению.

![fb tcp mas](https://docs.owen.ru/book_img/1905/133836.png)

<i>Блок **Modbus** **TCP** **Master**</i>

<a id="topic-94800"></a>

#### Блок Modbus TCP Slave

Блок <b>*Modbus*</b> <b>*TCP*</b> <b>*Slave*</b> обеспечивает работу Slave-устройства по протоколу **Modbus** **TCP**.

Так как работа блока занимает значительное время, его можно разместить только в **Фоне**.

**Назначение входов и выходов Modbus TCP Slave**

**Входы (константные)**

| Элемент | Описание |
| --- | --- |
| cnc | Связь с блоком [TcpIpSrA](#topic-94792) |
| enbl | Разрешение работы |
| tmp | Периодичность обработки запросов, мс (константный) |
| wait | Время ожидания запроса от Master, мс (константный) |
| bo | Входы для связи с [блоками записи](#topic-94808) (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| itr | Связь с [блоками чтения](#topic-94801) |
| sts | Статус работы:<br>**0** – есть связь с Master;<br>**>0** – нет связи или нет запросов от Master |

Slave обрабатывает команды, полученные от Master, с периодичностью **tmp**. Если при обработке команды не обнаружен соответствующий блок команды, то Slave посылает мастеру одну из ошибок:

- **1** – нет блока с соответствующим кодом команды;
- **2** – в блоке не определен запрашиваемый адрес.

![fb tcp slave](https://docs.owen.ru/book_img/1905/133865.png)

*Блок Modbus TCP Slave*

<a id="topic-94801"></a>

### Команды чтения

В данном разделе приведено описание блоков библиотеки <b>*paModbus*</b>, которые реализуют команды протокола **Modbus** на чтение параметров.

**paModbus. Команды чтения**

| Код функции | Имя функции | Команда | **Блоки** paModbus / Подключение к <b>*Modbus Master*</b> | **Блоки** paModbus / Подключение к <b>*Modbus*</b> <b>*Slave*</b> |
| --- | --- | --- | --- | --- |
| 1 (0x01) | Read Coil Status | Чтение значений из регистров флагов | [ModbusCoilIn](#topic-94802) | [ModbusCoilOut](#topic-94809)<br>[ModbusCoilsOut](#topic-94811) |
| 2 (0x02) | Read Discrete Inputs | Чтение значений из дискретных входов | [ModbusDInputIn](#topic-94803) | - |
| 3 (0x03) | Read Holding Registers | Чтение значений из регистров хранения | [ModbusRegIn](#topic-94804)<br>[ModbusFltIn](#topic-94806)<br>[OwenFltIn](#topic-94807) | [ModbusRegOut](#topic-94810)<br>[ModbusRegsOut](#topic-94812)<br>[ModbusFltOut](#topic-94813) |
| 4 (0x04) | Read Input Registers | Чтение значений из регистров ввода | [ModbusAInputIn](#topic-94805)<br>[ModbusFltIn](#topic-94806)<br>[OwenFltIn](#topic-94807) | - |

<a id="topic-94802"></a>

#### Команда чтения флагов 0x01 (ModbusCoilIn)

Блок **ModbusCoilIn** отправляет команду **Modbus** для чтения значений из регистров флагов (**Coil**).

При подключении к блоку **Master** блок **ModbusCoilIn** выполняет команду **0x01**, при подключении к **Slave** – **0x05**.

<b>Назначение входов и выходов **ModbusCoilIn**</b>

**Входы**

| Элемент | Описание |
| --- | --- |
| itr | Связь c блоком <b>*Modbus Master*</b>/<b>*Modbus Slave*</b> |
| enb | Разрешение работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>) |
| slv | Адрес ведомого устройства, с которого считывают данные |
| adr0 | Адрес, с которого начинается чтение |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bi | Указатель на блок, не используется |
| st | Статус работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>):<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, [код ошибки в старшем байте](#topic-94830) |
| o | Результаты чтения (циклический) |

Для инициализации следует подключить вход **itr** к выходу блока Master или Slave и задать верный адрес устройства.

![fb coilln](https://docs.owen.ru/book_img/1905/133864.png)

<i>Блок **ModbusCoilIn**</i>

<a id="topic-94803"></a>

#### Команда чтения дискретных входов 0x02 (ModbusDInputIn)

Блок <b>*ModbusDInputIn*</b> отправляет команды **Mod****b****us** на чтение дискретных входов (**Inputs**).

При подключении к блоку **Master** блок **ModbusDInputIn** выполняет команду **0x02**.

<b>Назначение входов и выходов **ModbusDInputIn**</b>

**Входы**

| Элемент | Описание |
| --- | --- |
| itr | Связь c блоком <b>*Modbus Master*</b> |
| enb | Разрешение работы |
| slv | Адрес ведомого устройства, с которого считывают данные |
| adr0 | Адрес, с которого начинается чтение |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bi | Указатель на блок, не используется |
| st | Статус работы:<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, [код ошибки в старшем байте](#topic-94830) |
| o | Результаты чтения (циклический) |

Для инициализации следует подключить вход **itr** к выходу блока Master и задать верный адрес устройства.

![fb DInput In](https://docs.owen.ru/book_img/1905/133863.png)

<i>Блок **ModbusDInputIn**</i>

<a id="topic-94804"></a>

#### Команда чтения регистров хранения 0x03 (ModbusRegIn)

Блок <b>*ModbusRegIn*</b> отправляет команды **Mod****b****us** на чтение регистров хранения (**Holding** **R****egisters**).

При подключении к блоку **Master** блок **ModbusRegIn** выполняет команду **0x03**, при подключении к **Slave** – **0x06**, **0x10**.

<b>Назначение входов и выходов **ModbusRegIn**</b>

**Входы (константные)**

| Элемент | Описание |
| --- | --- |
| itr | Связь c блоком <b>*Modbus Master*</b>/<b>*Modbus Slave*</b> |
| enb | Разрешение работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>) |
| slv | Адрес ведомого устройства, с которого считывают данные |
| adr0 | Адрес, с которого начинается чтение |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bi | Указатель на блок, не используется |
| st | Статус работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>):<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, [код ошибки в старшем байте](#topic-94830) |
| o | Результаты чтения (циклический) |

Для инициализации следует подключить вход **itr** к выходу блока Master или Slave и задать верный адрес устройства.

![fb Reg In](https://docs.owen.ru/book_img/1905/133862.png)

<i>Блок **ModbusRegIn**</i>

<a id="topic-94805"></a>

#### Команда чтения входных регистров 0x04 (ModbusAInputIn)

Блок <b>*ModbusAInputIn*</b> отправляет команды **Modbus** на чтение регистров ввода (**Input** **Registers**).

При подключении к блоку **Master** блок **ModbusAInputIn** выполняет команду **0x04**.

<b>Назначение входов и выходов **ModbusAInputIn**</b>

**Входы**

| Элемент | Описание |
| --- | --- |
| itr | Связь c блоком <b>*Modbus Master*</b> |
| enb | Разрешение работы |
| slv | Адрес ведомого устройства, с которого считывают данные |
| adr0 | Адрес, с которого начинается чтение |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bi | Указатель на блок, не используется |
| st | Статус работы:<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, [код ошибки в старшем байте](#topic-94830) |
| o | Результаты чтения (циклический) |

Для инициализации следует подключить вход **itr** к выходу блока Master и задать верный адрес устройства.

![fb AInput In](https://docs.owen.ru/book_img/1905/133861.png)

<i>Блок **ModbusAInputIn**</i>

<a id="topic-94806"></a>

#### Команда чтения вещественного числа 0x03/0x04 (ModbusFltIn)

Блок <b>*ModbusFltIn*</b> отправляет команды **Mod****b****us** на чтение вещественных чисел из регистров хранения (**Holding** **R****egisters**) или регистров ввода (**Input** **R****egisters**). Каждое число занимает два регистра.

При подключении к блоку **Master** блок **ModbusFltIn** выполняет команды **0x04** или **0x03**, при подключении к блоку **Slave** – **0****x****10** (для регистров хранения).

<b>Назначение входов и выходов **ModbusFltIn**</b>

**Входы**

| Элемент | Описание |
| --- | --- |
| itr | Связь c блоком <b>*Modbus Master*</b>/<b>*Modbus Slave*</b> |
| enb | Разрешение работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>) |
| slv | Адрес ведомого устройства, с которого считывают данные |
| adr0 | Адрес, с которого начинается чтение |
| hold/in | Выбор регистров для чтения – регистры хранения/регистры ввода (**0/1**) |
| ord_w | Порядок слов в числе – прямой/обратный (**0/1**) |
| ord_b | Порядок байт в числе – прямой/обратный (**0/1**) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bi | Указатель на блок, не используется |
| st | Статус работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>):<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, [код ошибки в старшем байте](#topic-94830) |
| o | Результаты чтения (циклический) |

**Порядок слов и байт**

| ord_w | ord_b | Порядок байт |
| --- | --- | --- |
| 0 | 0 | AB CD |
| 0 | 1 | BA DC |
| 1 | 0 | CD AB |
| 1 | 1 | DC BA |

Для инициализации следует подключить вход **itr** к выходу блока Master или Slave и задать верный адрес устройства.

![fb Flt In](https://docs.owen.ru/book_img/1905/133860.png)

<i>Блок **ModbusFltIn**</i>

<a id="topic-94807"></a>

#### Команда чтения результатов измерения аналогового входа (OwenFltIn)

Блок <b>*OwenFltIn*</b> отправляет команды **Mod****b****us** на чтение вещественных чисел из регистров хранения (**Holding** **R****egisters**) или регистров ввода (**Input** **R****egisters**) модулей аналогового ввода [ОВЕН МВ210-101](https://owen.ru/product/moduli_analogovogo_vvoda_s_universal_nimi_vhodami_ethernet_mv210).

При подключении к блоку **Master** блок **OwenFltIn** выполняет команды **0x04** или **0x03**.

<b>Назначение входов и выходов **OwenFltIn**</b>

**Входы**

| Элемент | Описание |
| --- | --- |
| itr | Связь c блоком <b>*Modbus Master*</b> |
| enb | Разрешение работы |
| slv | Адрес ведомого устройства, с которого считывают данные |
| adr0 | Адрес, с которого начинается чтение |
| hold/in | Выбор регистров для чтения – регистры хранения/регистры ввода (**0/1**) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bi | Указатель на блок, не используется |
| st | Статус работы:<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, ошибка |

**Циклические выходы**

| Элемент | Описание |
| --- | --- |
| rslt | Отображает результаты измерения |
| time | Время измерения |
| stsi | Код ошибки (см. [таблицу](#topic-94807--t1)) |
| vldi | Бит достоверности:<br>**1** – данные достоверны;<br>**0** – данные не достоверны |
| msk | Маска кода ошибки (см. [таблицу](#topic-94807--t1)) |

<a id="topic-94807--t1"></a>

**Коды ошибок**

| Код ошибки | Маска | Описание |
| --- | --- | --- |
| 0хF0 | 1 | Значение заведомо неверно |
| 0xF6 | 2 | Данные не готовы. Необходимо дождаться результатов первого измерения после включения модуля |
| 0xF7 | 4 | Датчик отключен |
| 0хF8 | 8 | Велика температура свободных концов ТП |
| 0хF9 | 16 | Мала температура свободных концов ТП |
| 0хFA | 32 | Измеренное значение слишком велико |
| 0хFB | 64 | Измеренное значение слишком мало |
| 0хFC | 128 | Короткое замыкание датчика |
| 0хFD | 256 | Обрыв датчика |
| 0хFE | 512 | Отсутствие связи с АЦП |
| 0хFF | 1024 | Некорректный калибровочный коэффициент |

Для инициализации следует подключить вход **itr** к выходу блока Master и задать верный адрес устройства.

![fb Flt In](https://docs.owen.ru/book_img/1905/133859.png)

<i>Блок **OwenFltIn**</i>

<a id="topic-94808"></a>

### Команды записи

В данном разделе приведено описание блоков библиотеки <b>*paModbus*</b>, которые реализуют команды протокола **Modbus** на запись параметров.

**paModbus. Команды записи**

| Код функции | Имя функции | Команда | **Блоки** paModbus<br>  / Подключение к <b>*Modbus Master*</b> | **Блоки** paModbus<br>  / Подключение к <b>*Modbus*</b> <b>*Slave*</b> |
| --- | --- | --- | --- | --- |
| 5 (0x05) | Write Single Coil | Запись значения в один регистр флага | [ModbusCoilOut](#topic-94809) | [ModbusCoilIn](#topic-94802) |
| 6 (0x06) | Write Single Register | Запись значения в один регистр хранения | [ModbusRegOut](#topic-94810) | [ModbusRegIn](#topic-94804) |
| 15 (0x0F) | Write Multiple Coils | Запись значений в несколько регистров флагов | [ModbusCoilsOut](#topic-94811) | - |
| 16 (0x10) | Write Multiple Registers | Запись значений в несколько регистров хранения | [ModbusRegsOut](#topic-94812)<br>[ModbusFltOut](#topic-94813) | [ModbusRegIn](#topic-94804),<br>[ModbusFltIn](#topic-94806) |

<a id="topic-94809"></a>

#### Команда записи одного флага 0x05 (ModbusCoilOut)

Блок **ModbusCoilOut** отправляет команды **Modbus** на запись в регистр флага (**Coil**) дискретного вывода.

При подключении к блоку **Master** блок **ModbusCoilOut** выполняет команду **0****x****05**, при подключении к **Slave** – **0****x****01**.

Для записи **1** в флаг на вход следует подать любое положительное число. Для записи **0** – подать **0**.

**Назначение входов и выходов ModbusCoilOut**

**Входы**

| Элемент | Описание |
| --- | --- |
| enb | Разрешение работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>) |
| slv | Адрес ведомого устройства, на который записывают данные |
| adr0 | Адрес, с которого начинается запись |
| in | Входы записи данных (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bo | Связь c блоком <b>*Modbus Master*</b>/<b>*Modbus Slave*</b> |
| st | Статус работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>):<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, [код ошибки в старшем байте](#topic-94830) |

Для инициализации следует подключить выход **bo** к входу блока Master или Slave и задать верный адрес устройства.

![fb Coil Out](https://docs.owen.ru/book_img/1905/133858.png)

<i>Блок **ModbusCoilOut**</i>

<a id="topic-94810"></a>

#### Команда записи одного регистра хранения 0x06 (ModbusRegOut)

Блок <b>*ModbusRegOut*</b> отправляет команды **Mod****b****us** на запись регистра хранения (**Holding** **R****egister**).

При подключении к блоку **Master** блок **ModbusRegOut** выполняет команду **0****x****06**, при подключении к **Slave** – **0****x****03**.

**Назначение входов и выходов ModbusRegOut**

**Входы**

| Элемент | Описание |
| --- | --- |
| enb | Разрешение работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>) |
| slv | Адрес ведомого устройства, на который записывают данные |
| adr0 | Адрес, с которого начинается запись |
| in | Входы записи данных (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bo | Связь c блоком <b>*Modbus Master*</b>/<b>*Modbus Slave*</b> |
| st | Статус работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>):<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, [код ошибки в старшем байте](#topic-94830) |

Для инициализации следует подключить выход **bo** к входу блока Master или Slave и задать верный адрес устройства.

![fb Reg Out](https://docs.owen.ru/book_img/1905/133857.png)

<i>Блок **ModbusRegOut**</i>

<a id="topic-94811"></a>

#### Команда записи нескольких флагов 0x0F (ModbusCoilsOut)

Блок <b>*ModbusCoilsOut*</b> отправляет команды **Mod****b****us** на запись нескольких флагов (**Coils**).

При подключении к блоку **Master** блок **ModbusCoilsOut** выполняет команду **0****x****0****F**, при подключении к **Slave** – **0****x****01**.

<b>Назначение входов и выходов **ModbusCoilsOut**</b>

**Входы**

| Элемент | Описание |
| --- | --- |
| enb | Разрешение работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>) |
| slv | Адрес ведомого устройства, на который записывают данные |
| adr0 | Адрес, с которого начинается запись |
| in | Входы записи данных (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bo | Связь c блоком <b>*Modbus Master*</b>/<b>*Modbus Slave*</b> |
| st | Статус работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>):<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, [код ошибки в старшем байте](#topic-94830) |

Для инициализации следует подключить выход **bo** к входу блока Master или Slave и задать верный адрес устройства.

![fb modbus Coils Out](https://docs.owen.ru/book_img/1905/133856.png)

<i>Блок **ModbusCoilsOut**</i>

<a id="topic-94812"></a>

#### Команда записи нескольких регистров хранения 0x10 (ModbusRegsOut)

Блок <b>*ModbusRegsOut*</b> отправляет команды **Mod****b****us** на запись нескольких регистров хранения (**Holding** **Registers**).

При подключении к блоку **Master** блок **ModbusRegsOut** выполняет команду **0****x****10**, при подключении к **Slave** – **0****x****03**.

**Назначение входов и выходов ModbusRegsOut**

**Входы**

| Элемент | Описание |
| --- | --- |
| enb | Разрешение работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>) |
| slv | Адрес ведомого устройства, на который записывают данные |
| adr0 | Адрес, с которого начинается запись |
| in | Входы записи данных (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bo | Связь c блоком <b>*Modbus Master*</b>/<b>*Modbus Slave*</b> |
| st | Статус работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>):<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, [код ошибки в старшем байте](#topic-94830) |

Для инициализации следует подключить выход **bo** к входу блока **Master** или **Slave** и задать верный адрес устройства.

![fb Regs Out](https://docs.owen.ru/book_img/1905/133885.png)

<i>Блок **ModbusRegsOut**</i>

<a id="topic-94813"></a>

#### Команда записи вещественного числа 0x10 (ModbusFltOut)

Блок <b>*ModbusFltOut*</b> отправляет команды **Mod****b****us** на запись вещественных чисел в регистры хранения (**Holding** **R****egisters**). Каждое число занимает два регистра.

При подключении к блоку **Master** блок **ModbusFltOut** выполняет команду **0x10**, при подключении к блоку **Slave** – **0****x****03**.

<b>Назначение входов и выходов **ModbusFltOut**</b>

**Входы**

| Элемент | Описание |
| --- | --- |
| enb | Разрешение работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>) |
| slv | Адрес ведомого устройства, на который записывают данные |
| adr0 | Адрес, с которого начинается запись |
| ord_w | Порядок слов в числе – прямой/обратный (**0/1**) |
| ord_b | Порядок байт в числе – прямой/обратный (**0/1**) |
| in | Входы записи данных (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| bo | Связь c блоком <b>*Modbus Master*</b>/<b>*Modbus Slave*</b> |
| st | Статус работы (при подключении к <b>*Modbus*</b> <b>*Master*</b>):<br>**0** – нет связи;<br>**1** – есть связь, ошибок нет;<br>**>1** – есть связь, [код ошибки в старшем байте](#topic-94830) |

**Порядок слов и байт**

| ord_w | ord_b | Порядок байт |
| --- | --- | --- |
| 0 | 0 | AB CD |
| 0 | 1 | BA DC |
| 1 | 0 | CD AB |
| 1 | 1 | DC BA |

Для инициализации следует подключить выход **bo** к входу блока Master или Slave и задать верный адрес устройства.

![fb Modbus Flt Out](https://docs.owen.ru/book_img/1905/133884.png)

*Блок ModbusFltOut*

<a id="topic-94814"></a>

### Буфер чтения/записи уставок с плавающей точкой (BufSupFltEx)

Блок **BufSupFltEx** представляет собой двунаправленный буфер данных интерфейса. Блок сохраняет данные в бинарном файле на диске контроллера (так же, как блок **SaverEx** из библиотеки **paCore**).

Отличие блока <b>*BufSupFltEx*</b> от блока <b>*BufSupEx*</b> из библиотеки <b>*paCore*</b> заключается в том, что он позволяет записывать по протоколу Modbus уставки в формате с плавающей точкой. Пример работы с блоком приведен в [разделе](#topic-94824).

Поскольку операции файлового ввода/вывода занимают значительное время, данный блок следует размещать только в <b>*Фоне*</b>.

<b>Назначение входов и выходов BufSupFlt**Ex**</b>

**Входы**

| Элемент | Описание |
| --- | --- |
| inter | Cвязь от интерфейса, к которому принадлежит данный буфер |
| group | Номер группы (константный) |
| fnm | Абсолютный путь и имя файла (может быть пустым – задается автоматически), расширение игнорируется. При сохранении данных на внешнем накопителе следует использовать путь, указанный на выходе блока <b>*210-*</b><b>*SD*</b><b>*-*</b><b>*USB*</b> из библиотеки <b>*paOwenIO*</b> (константный) |
| mask | Не используется |
| rst | Сброс ошибок записи |
| wr | Запись на диск |

**Циклические входы**

| Элемент | Описание |
| --- | --- |
| dan | Значение, которое записывается в буфер при **czap** = 1 |
| czap | Запись значения **dan** |
| typ | Тип параметра: **AI**, **AO** – вещественное значение (константный) |
| adr | Адрес параметра (константный) |
| ini | Значение для инициализации (константный) |
| min | Минимум, если принятое значение меньше **min**, то оно игнорируется |
| max | Максимум, если принятое значение больше **max**, то оно игнорируется |

**Выходы**

| Элемент | Описание |
| --- | --- |
| pkt | Подключение к блокам <b>*OpcUAClient*</b>, <b>*UABufSups*</b> из библиотеки <b>*paOpcUA*</b> |
| next | Имя следующего файла |
| enb | Запись разрешена |
| sts | Статус:<br>**0** – после сброса;<br>**1** – записан;<br>**2** – прочитан;<br>**<0** – ошибка |
| good | Количество удачных записей |
| bad | Количество ошибок записи |
| rej | Количество отклоненных записей |

**Циклические выходы**

| Элемент | Описание |
| --- | --- |
| dan | Значение параметра, полученное по интерфейсу или на вход **dan** (после проверки на **min** и **max**) |
| chn | Признак изменения, выставляется в **1** на один цикл выполнения программы, если значение **dan** изменилось |
| zap | Признак записи, выставляется в **1** на один цикл выполнения программы, если значение с входа **dan** было записано |

Номер группы **group** используется в качестве Slave ID при подключении к блоку интерфейса Modbus Slave.

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

Адрес переменной **adr** зависит от интерфейса, к которому подключен буфер, например, адрес регистра Modbus.

Если файл существует на диске, выходы инициализируются сохраненными значениями. Если файла не существует – выходы инициализируются значениями инициализации **ini**.

Запись в файл производится при изменении значений на входах **dan** или по интерфейсу. Если файла на диске не существует и выходы **dan** приняли значения **ini**, то можно записать их на диск принудительно с помощью команды **wr**.

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

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

Файл, на котором произошел сбой, остается на диске под тем же именем с добавленным к нему суффиксом, равным метке времени сбоя (в мс от 1 января 1970 г). Удалять его не следует, чтобы повторно не использовать потенциально сбойный сектор. Если происходит повторный сбой записи, то блок блокируется (выход **enb** = 0) и больше не производит попыток переименований файлов и записи до тех пор, пока ошибки не будут сброшены фронтом на входе **rst**.

> [!WARNING]
> **Внимание.** При изменении числа входов блока <b>*BufSupFltEx*</b> файлы на диске перезаписываются.

![fb Buf Sup Flt Ex](https://docs.owen.ru/book_img/1905/133883.png)

<i>Буфер чтения/записи уставок с плавающей точкой (BufSupFlt**Ex)**</i>

<a id="topic-94815"></a>

### Диагностика и управление обменом

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

**Статусы блоков обмена по протоколу Modbus RTU**

**[Функциональные блоки настройки COM-портов](#topic-94788)**

| Блок | Имя переменной | Значение | Описание |
| --- | --- | --- | --- |
| Порт RS-485 | stat | <0 | [Ошибка](#t1) |
| Порт RS-485 | stat | 1 | Корректная работа |
| Порт RS-232 | stat | <0 | [Ошибка](#topic-94790--t1) |
| Порт RS-232 | stat | 1 | Корректная работа |

**[Modbus RTU](#topic-94796)**

| Блок | Имя переменной | Значение | Описание |
| --- | --- | --- | --- |
| Modbus RTU Master | sts | 0 | Корректная работа |
| Modbus RTU Master | sts | 1 | Slave не отвечает |
| Modbus RTU Master | sts | 2 | Неверная контрольная сумма |
| Modbus RTU Slave | sts | - | Не используется |

**Статусы блоков обмена по протоколу Modbus TCP**

**[Функциональные блоки настройки TCP-соединений](#topic-94791)**

| Блок | Имя переменной | Значение | Описание |
| --- | --- | --- | --- |
| TcpIpSrA | stat | 0 | Есть подключения |
| TcpIpSrA | stat | >0 | Нет подключений |
| TcpIpClA | stat | 0 | Есть связь с TCP/IP-сервером |
| TcpIpClA | stat | >0 | Нет связи с TCP/IP-сервером |

**[Modbus TCP](#topic-94799)**

| Блок | Имя переменной | Значение | Описание |
| --- | --- | --- | --- |
| Modbus TCP Master | sts | 0 | Есть связь с TCP/IP-сервером |
| Modbus TCP Master | sts | >0 | Нет связи или Slave не отвечает |
| Modbus TCP Slave | sts | 0 | Есть связь с Master |
| Modbus TCP Slave | sts | >0 | Нет связи или нет запросов от Master |

**Статусы блоков чтения/записи при подключении к Modbus RTU/TCP Master**

**[Команды чтения](#topic-94801)**

| Блок | Имя переменной | Значение | Описание |
| --- | --- | --- | --- |
| ModbusCoilIn | st | 0 | Нет связи |
| ModbusCoilIn | st | 1 | Есть связь, нет ошибок |
| ModbusCoilIn | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |
| ModbusDInputIn | st | 0 | Нет связи |
| ModbusDInputIn | st | 1 | Есть связь, нет ошибок |
| ModbusDInputIn | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |
| ModbusRegIn | st | 0 | Нет связи |
| ModbusRegIn | st | 1 | Есть связь, нет ошибок |
| ModbusRegIn | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |
| ModbusAInputIn | st | 0 | Нет связи |
| ModbusAInputIn | st | 1 | Есть связь, нет ошибок |
| ModbusAInputIn | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |
| ModbusFltIn | st | 0 | Нет связи |
| ModbusFltIn | st | 1 | Есть связь, нет ошибок |
| ModbusFltIn | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |
| OwenFltIn | st | 0 | Нет связи |
| OwenFltIn | st | 1 | Есть связь, нет ошибок |
| OwenFltIn | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |

**[Команды записи](#topic-94808)**

| Блок | Имя переменной | Значение | Описание |
| --- | --- | --- | --- |
| ModbusCoilOut | st | 0 | Нет связи |
| ModbusCoilOut | st | 1 | Есть связь, нет ошибок |
| ModbusCoilOut | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |
| ModbusRegOut | st | 0 | Нет связи |
| ModbusRegOut | st | 1 | Есть связь, нет ошибок |
| ModbusRegOut | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |
| ModbusCoilsOut | st | 0 | Нет связи |
| ModbusCoilsOut | st | 1 | Есть связь, нет ошибок |
| ModbusCoilsOut | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |
| ModbusRegsOut | st | 0 | Нет связи |
| ModbusRegsOut | st | 1 | Есть связь, нет ошибок |
| ModbusRegsOut | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |
| ModbusFltOut | st | 0 | Нет связи |
| ModbusFltOut | st | 1 | Есть связь, нет ошибок |
| ModbusFltOut | st | >1 | Есть связь, [код ошибки в старшем байте](#topic-94830) |

Блоки <b>*Modbus RTU Slave*</b>, <b>*Modbus TCP Slave*</b>, <b>*Modbus RTU Master*</b> и <b>*Modbus TCP Master*</b> имеют вход **enbl** для разрешения работы блока. Если задать на входе значение:

- **1**, то блок реализует протокол обмена;
- **0** – блок не работает, в выходе статуса **sts** устанавливается 0.

Блоки чтения/записи имеют входы **enb** для разрешения работы блоков. Вход **enb** не используется при подключении к блокам <b>*Modbus RTU*</b>/<b>*TCP Slave*</b>. Если задать на входе значение:

- **1**, то блок читает/записывает регистры подключенного устройства;
- **0** – блок не работает, в выходе статуса **st** при этом устанавливается **0**.

<a id="topic-94816"></a>

## Методика настройки обмена по протоколу Modbus

<a id="topic-94817"></a>

### Общая методика конфигурирования интерфейсов

Настройка обмена по протоколу **Modbus** в **Полигон** состоит из следующих действий:

![Посл Конф Модб](https://docs.owen.ru/book_img/1905/133882.png)

*Последовательность конфигурирования Modbus в Полигон*

Сначала необходимо выбрать интерфейс для обмена – COM-порт или Ethernet. Для COM-порта нужно выбрать и настроить блок [COM-порта](#topic-94788). Для Ethernet нужно добавить и настроить [TCP/IP-сервер](#topic-94792) или [TCP/IP-клиент](#topic-94793).

Затем необходимо выбрать режим работы интерфейса –Master или Slave, добавить соответствующий блок протокола и соединить с блоком COM-порта/TCP-соединения.

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

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

<a id="topic-94818"></a>

### Настройка ПЛК в режиме Modbus RTU Master

Для настройки ПЛК в режиме <b>*Modbus*</b> <b>*RTU*</b> <b>*Master*</b> следует выполнить следующие действия:

1. Создать новую <b>*Программу*</b> в проекте в месте работы <b>*Фон*</b> (блок [Modbus RTU Master](#topic-94796) рекомендуется размещать в фоне). В свойствах созданной программы задать <b>*Имя*</b> – *Modbus* (или любое другое).

2. Создать внутри программы <b>*Страницу*</b>. Добавить свойство <b>*Комментарии*</b> и задать *Modbus* *RTU* *Master* (или любой другой).

   ![Созд Стр RTU m](https://docs.owen.ru/book_img/1905/133881.png)

   <i>Создание страницы для настройки опроса в режиме **Modbus** **RTU** **Master**</i>

3. Создать на странице блок настройки [COM-порта](#topic-94788) из библиотеки <b>*paOwenIO*</b>. Задать номер используемого COM-порта (для <b>*210-*</b><b>*RS*</b><b>*485*</b>), задать сетевые настройки интерфейса.

   ![Созд ПЛК rtu m 02](https://docs.owen.ru/book_img/1905/133880.png)

   <i>Добавление блока настройки **COM****-порта**</i>

4. Создать на странице блок [Modbus RTU Master](#topic-94796) из библиотеки <b>*paModbus*</b>. Задать настройки Master-устройства.

   ![Созд ПЛК rtu m 03](https://docs.owen.ru/book_img/1905/133879.png)

   *Добавление блока Modbus RTU Master*

5. Соединить выход блока COM-порта **cnc** с соответствующим входом блока <b>*Modbus*</b> <b>*RTU*</b> <b>*Master*</b>.

   ![Созд ПЛК rtu m 04](https://docs.owen.ru/book_img/1905/133878.png)

   *Связь блока настройки COM-порта с Modbus RTU Master*

6. Создать на странице блоки [команд на чтение](#topic-94801) данных из Slave-устройств. Задать адреса Slave-устройств. Задать адреса опрашиваемых регистров.

   ![Созд ПЛК rtu m 05](https://docs.owen.ru/book_img/1905/133877.png)

   *Добавление и настройка блоков команд на чтение*

7. Соединить выходы блока <b>*Modbus*</b> <b>*RTU*</b> <b>*Master*</b> **itr** с соответствующими входами блоков команд чтения регистров.

   ![Созд ПЛК rtu m 06](https://docs.owen.ru/book_img/1905/133876.png)

   <i>Связь блоков команд чтения с **Modbus** **RTU** **Master**</i>

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

9. Создать блоки [команд на запись](#topic-94808) данных в Slave-устройства. Задать адреса Slave-устройств. Задать адреса записываемых регистров.

   ![Созд ПЛК rtu m 07](https://docs.owen.ru/book_img/1905/133905.png)

   *Добавление и настройка блоков команд на запись*

10. Создать у блока <b>*Modbus* *RTU*</b> <b>*Master*</b> входы типа **bfo** количеством, соответствующим количеству добавленных команд на запись. Затем соединить выходы блоков записи с добавленными входами **bo** <b></b>блока <b>*Modbus*</b> <b>*RTU*</b> <b>*Master*</b>.

    ![Созд ПЛК rtu m 08](https://docs.owen.ru/book_img/1905/133904.png)

    *Связь блоков команд записи с Modbus RTU Master*

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

12. Задать порядок выполнения блоков <b>*По потоку данных*</b>.

Таким образом, получится следующий вид страницы *Modbus* *RTU* *Master*:

![Созд ПЛК rtu m 09](https://docs.owen.ru/book_img/1905/133903.png)

<i>Настройка **Modbus** **RTU** **Master**</i>

Пример настройки ПЛК в режиме Modbus RTU Master для опроса модулей Мх110 приведен в [разделе](#topic-94826).

<a id="topic-94819"></a>

### Настройка ПЛК в режиме Modbus RTU Slave

Для настройки ПЛК в режиме <b>*Modbus*</b> <b>*RTU*</b> <b>*Slave*</b> следует:

1. Создать новую <b>*Программу*</b> в проекте в месте работы <b>*Фон*</b> (блок [Modbus RTU Slave](#topic-94797) рекомендуется размещать в фоне). В свойствах созданной программы задать <b>*Имя*</b> – *Modbus* (или любое другое).

2. Создать внутри программы <b>*Страницу*</b>. Добавить свойство <b>*Комментарии*</b> и задать *Modbus* *RTU* *Slave* (или любой другой).

   ![Созд ПЛК rtu s 01](https://docs.owen.ru/book_img/1905/133902.png)

   <i>Создание страницы для настройки опроса в режиме **Modbus** **RTU** **Slave**</i>

3. Создать на странице блок настройки [COM-порта](#topic-94788) из библиотеки <b>*paOwenIO*</b>. Задать номер используемого COM-порта (для <b>*210-*</b><b>*RS*</b><b>*485*</b>), задать сетевые настройки интерфейса.

   ![Созд ПЛК rtu s 02](https://docs.owen.ru/book_img/1905/133901.png)

   *Добавление блока настройки COM-порта*

4. Создать на странице блок [Modbus RTU Slave](#topic-94797) из библиотеки <b>*paModbus*</b>. Задать настройки Slave-устройства.

   ![Созд ПЛК rtu s 03](https://docs.owen.ru/book_img/1905/133900.png)

   *Добавление блока Modbus RTU Slave*

5. Соединить выход блока COM-порта **cnc** с соответствующим входом блока <b>*Modbus*</b> <b>*RTU*</b> <b>*Slave*</b>.

   ![Созд ПЛК rtu s 04](https://docs.owen.ru/book_img/1905/133899.png)

   <i>Связь блока настройки **COM****-порта с** **Modbus** **RTU** **Slave**</i>

6. Создать на странице блоки команд на [чтение](#topic-94801)/[запись](#topic-94808) данных Slave-устройства. Задать адрес Slave-устройства. Задать адреса выделяемых регистров. Если необходимо и записывать, и считывать один и тот же регистр, то необходимо соединить выход блока записи со сходом блока чтения.

7. Соединить выходы блока <b>*Modbus*</b> <b>*RTU*</b> <b>*Slave*</b> **itr** с соответствующими входами блоков команд записи регистров.

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

9. Создать у блока <b>*Modbus*</b> <b>*RTU*</b> <b>*Slave*</b> входы типа **bfo** количеством, соответствующим количеству добавленных команд на чтение. Затем соединить выходы блоков чтения с добавленными входами **bo** блока <b>*Modbus*</b> <b>*RTU*</b> <b>*Slave*</b>.

10. При необходимости соединить входы **in** блоков чтения с выходами других блоков в проекте.

11. Задать порядок выполнения блоков <b>*По потоку данных*</b>.

Таким образом, получится следующий вид страницы *Modbus* *RTU* *Slave*:

![Созд ПЛК rtu s 05](https://docs.owen.ru/book_img/1905/133898.png)

*Настройка Modbus RTU Slave*

Пример настройки ПЛК в режиме Modbus RTU Slave для опроса [Owen OPC Server](https://owen.ru/product/new_opc_server) приведен в [разделе](#topic-94827).

<a id="topic-94820"></a>

### Настройка ПЛК в режиме Modbus TCP Master

Для настройки ПЛК в режиме <b>*Modbus*</b> <b>*TCP*</b> <b>*Master*</b> следует:

1. Создать новую <b>*Программу*</b> в проекте в месте работы <b>*Фон*</b> (блоки [TcpIpClA](#topic-94793) и [Modbus TCP Master](#topic-94799) рекомендуется размещать в фоне). В свойствах созданной программы задать <b>*Имя*</b> – *Modbus* (или любое другое).

2. Создать внутри программы <b>*Страницу*</b>. Добавить свойство <b>*Комментарии*</b> и задать *Modbus* *TCP* *Master* (или любой другой).

   ![Созд ПЛК tcp m 01](https://docs.owen.ru/book_img/1905/133897.png)

   *Создание страницы для настройки опроса в режиме Modbus TCP Master*

3. Создать на странице блок TCP/IP-клиента [TcpIpClA](#topic-94793) из библиотеки <b>*paCore*</b>. Задать локальные порт и IP адрес TCP-клиента и удаленные порт и адрес TCP-сервера.

   При настройке блока <b>*TcpIpClA*</b> удобно использовать некоторые свойства модуля. Для этого можно использовать технологию SQL-запросов. Это позволяет изменять IP адреса и порты в одном месте, и использовать эти значения в разных частях проекта.

   Запрос IP адреса (prop_ip):

   ```
   "<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_ip"</sql>"
   ```

   Запрос пользовательского свойства <b>*Пользовательское*</b> <b>*свойство*</b> <b>*00*</b> (prop_0):

   ```
   <sql> SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_0"</sql>
   ```

   Для каждого опрашиваемого прибора необходимо добавлять свой блок TCP/IP-клиента.

   ![Созд ПЛК tcp m 02](https://docs.owen.ru/book_img/1905/133896.png)

   *Добавление блока TCP/IP-клиента*

4. Создать на странице блок [Modbus TCP Master](#topic-94799) из библиотеки <b>*paModbus*</b>. Задать настройки Master-устройства.

   ![Созд ПЛК tcp m 03](https://docs.owen.ru/book_img/1905/133915.png)

   <i>Добавление блока **Modbus** **TCP** **Master**</i>

5. Соединить выход блока <b>*TcpIpClA*</b> **cnc** с соответствующим входом блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Master*</b>.

   ![Созд ПЛК tcp m 04](https://docs.owen.ru/book_img/1905/133914.png)

   <i>Связь блока TCP/IP-клиента с **Modbus** **TCP** **Master**</i>

6. Создать на странице блоки [команд на чтение](#topic-94801) данных из Slave-устройства. Задать ID Slave-устройства. Задать адреса опрашиваемых регистров.

   ![Созд ПЛК tcp m 05](https://docs.owen.ru/book_img/1905/133913.png)

   *Добавление и настройка блоков команд на чтение*

7. Соединить выходы блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Master*</b> **itr** с соответствующими входами блоков команд чтения регистров.

   ![Созд ПЛК tcp m 06](https://docs.owen.ru/book_img/1905/133912.png)

   *Связь блоков команд чтения с Modbus TCP Master*

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

9. Создать блоки [команд на запись](#topic-94808) данных в Slave-устройства. Задать ID Slave-устройства. Задать адреса записываемых регистров.

   ![Созд ПЛК tcp m 07](https://docs.owen.ru/book_img/1905/133911.png)

   *Добавление и настройка блоков команд на запись*

10. Создать у блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Master*</b> входы типа **bfo** количеством, соответствующим количеству добавленных команд на запись. Затем соединить выходы блоков записи с добавленными входами **bo** блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Master*</b>.

    ![Созд ПЛК tcp m 08](https://docs.owen.ru/book_img/1905/133910.png)

    <i>Связь блоков команд записи с **Modbus** **TCP** **Master**</i>

11. При необходимости соединить входы **in** блоков записи с выходами других блоков в проекте.

12. Задать порядок выполнения блоков <b>*По потоку данных*</b>.

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

![Созд ПЛК tcp m 09](https://docs.owen.ru/book_img/1905/133909.png)

*Настройка Modbus TCP Master*

Пример настройки ПЛК в режиме Modbus TCP Master для опроса модулей Мх210 приведен в [разделе](#topic-94828).

<a id="topic-94821"></a>

### Настройка ПЛК в режиме Modbus TCP Slave

Для настройки ПЛК в режиме <b>*Modbus*</b> <b>*TCP*</b> <b>*Slave*</b> следует выполнить следующие действия:

1. Создать новую <b>*Программу*</b> в проекте в месте работы <b>*Фон*</b> (блоки [TcpIpSrA](#topic-94792) и [Modbus TCP Slave](#topic-94800) рекомендуется размещать в фоне). В свойствах созданной программы задать <b>*Имя*</b> – *Modbus* (или любое другое).

2. Создать внутри программы <b>*Страницу*</b>. Добавить свойство <b>*Комментарии*</b> и задать *Modbus* *TCP* *Slave* (или любой другой).

   ![Созд ПЛК tcp s 01](https://docs.owen.ru/book_img/1905/133908.png)

   <i>Создание страницы для настройки опроса в режиме **Modbus** **TCP** **Slave**</i>

3. Создать на странице блок TCP/IP-сервера [TcpIpSrA](#topic-94792) из библиотеки <b>*paCore*</b>. Задать локальные порт и IP-адрес TCP-сервера.

   К блоку TCP-сервера можно подключить до **20** клиентов.

   ![Созд ПЛК tcp s 02](https://docs.owen.ru/book_img/1905/133907.png)

   *Добавление блока TCP/IP-сервера*

   При настройке блока <b>*TcpIp*</b><b>*SrA*</b> удобно использовать некоторые свойства модуля. Для этого можно использовать технологию SQL-запросов. Это позволяет изменять IP адрес и порт в одном месте, и использовать эти значения в разных частях проекта.

   Запрос IP адреса (prop_ip):

   ```
   "<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_ip"</sql>"
   ```

   Запрос пользовательского свойства <b>*Пользовательское*</b> <b>*свойство*</b> <b>*00*</b> (prop_0):

   ```
   <sql> SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_0"</sql>
   ```

4. Создать на странице блок [Modbus TCP Slave](#topic-94800) из библиотеки <b>*paModbus*</b>. Задать настройки Slave-устройства.

   ![Созд ПЛК tcp s 03](https://docs.owen.ru/book_img/1905/133906.png)

   *Добавление блока Modbus TCP Slave*

5. Соединить выход блока <b>*TcpIpSrA*</b> **cnc** с соответствующим входом блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Slave*</b>.

   ![Созд ПЛК tcp s 04](https://docs.owen.ru/book_img/1905/133925.png)

   *Связь блока TCP/IP-сервера с Modbus TCP Slave*

6. Создать на странице блоки команд на [чтение](#topic-94801)/[запись](#topic-94808) данных Slave-устройства. Задать Slave ID-устройства. Задать адреса выделяемых регистров. Если необходимо и записывать, и считывать один и тот же регистр, то необходимо соединить выход блока записи с сходом блока чтения.

7. Соединить выходы блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Slave*</b> **itr** с соответствующими входами блоков команд записи регистров.

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

9. Создать у блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Slave*</b> входы типа **bfo** количеством, соответствующим количеству добавленных команд на чтение. Затем соединить выходы блоков чтения с добавленными входами **bo** блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Slave*</b>.

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

11. Задать порядок выполнения блоков <b>*По потоку данных*</b>.

Таким образом, получится следующий вид страницы *Modbus* *TCP* *Slave*:

![Созд ПЛК tcp s 05](https://docs.owen.ru/book_img/1905/133924.png)

*Настройка Modbus TCP Slave*

Пример настройки ПЛК в режиме Modbus TCP Slave для опроса [Owen OPC Server](https://owen.ru/product/new_opc_server) приведен в [разделе](#topic-94829).

<a id="topic-94822"></a>

## Запись уставок по протоколу Modbus

<a id="topic-94823"></a>

### Запись целочисленных уставок по протоколу Modbus (BufSupEx)

Для записи уставок по протоколу Modbus используются блоки <b>*BufSupEx*</b> из библиотеки <b>*paCore*</b>.

Вход **inter** блока <b>*BufSupEx*</b> подключается к выходу блока протокола [Modbus TCP Slave](#topic-94800) или [Modbus RTU Slave](#topic-94797).

Мастер в сети Modbus может читать и записывать данные на диск. Для чтения блок <b>*BufSupEx*</b> реализует функцию **0х03**, для записи – **0х06** и **0х10**.

Вход **group** определяет Slave ID устройства (ID = **1** соответствует значение входа **0x100**).

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

Входы **typ** определяют тип данных **dan**, при работе по Modbus могут принимать только значения **II**, **IO** (16-ти битный регистр), так как Modbus работает с целочисленными регистрами.

Про сохранение уставок с плавающей точкой по протоколу Modbus можно подробнее прочитать в [разделе](#topic-94824).

Входы **adr** определяют адреса выделяемых регистров Modbus.

Входы **min** и **max** задают минимальное и максимальное возможное значение **dan**. Если программа или мастер сети изменяет значение, то оно проверяется на условие соответствия этому диапазону.

Выходы **dan** отображают текущие значения уставок, сохраненные на диске.

Параметры на диске сохраняются в бинарных файлах с расширениями **.da1** и **<b>.</b>da2**.

> [!WARNING]
> **Внимание.** При изменении числа входов блока <b>*BufSupEx*</b> файлы на диске перезаписываются.

Подробнее о возможностях и работе блока <b>*BufSupEx*</b> в документе [Архивирование и сохранение уставок](https://owen.ru/product/polygon/documentation).

![w int 01](https://docs.owen.ru/book_img/1905/133923.png)

<i>Подключение BufSupEx к **Modbus** **TCP** **Slave**</i>

![w int 02](https://docs.owen.ru/book_img/1905/133922.png)

*Запись уставки мастером сети Modbus*

![w int 03](https://docs.owen.ru/book_img/1905/133921.png)

*Запись уставки из программы контроллера*

<a id="topic-94824"></a>

### Запись уставок с плавающей точкой по протоколу Modbus (BufSupFltEx)

Для записи уставок по протоколу Modbus используются блоки <b>*BufSup*</b><b>*Flt*</b><b>*Ex*</b>.

Вход **inter** блока <b>*BufSup*</b><b>*Flt*</b><b>*Ex*</b> подключается к выходу блока протокола [Modbus TCP Slave](#topic-94800) или [Modbus RTU Slave](#topic-94797).

Мастер в сети Modbus может читать и записывать данные на диск. Для чтения блок <b>*BufSup*</b><b>*Flt*</b><b>*Ex*</b> реализует функцию **0х03**, для записи – **0х10**.

Вход **group** определяет Slave ID устройства (ID = **1** соответствует значение входа **0x100**).

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

Входы **typ** определяют тип данных **dan**, могут принимать только значения **AI**, **AO** (вещественное число).

Входы **adr** определяют адреса выделяемых регистров Modbus. Для опроса каждого значения **dan** выделяется два регистра Modbus.

Входы **min** и **max** задают минимальное и максимальное возможное значение **dan**. Если программа или мастер сети изменяет значение, то оно проверяется на условие соответствия этому диапазону.

Выходы **dan** отображают текущие значения уставок, сохраненные на диске.

Параметры на диске сохраняются в бинарных файлах с расширениями **.da1** и **.da2**.

> [!WARNING]
> **Внимание.** При изменении числа входов блока <b>*BufSupFltEx*</b> файлы на диске перезаписываются.

Подробнее о работе блока <b>*BufSup*</b><b>*Flt*</b><b>*Ex*</b> в [разделе](#topic-94814).

![w fp 01](https://docs.owen.ru/book_img/1905/133920.png)

<i>Подключение **BufSup****Flt****Ex** **к** **Modbus** **TCP** **Slave**</i>

![w fp 03](https://docs.owen.ru/book_img/1905/133919.png)

*Запись уставки мастером сети Modbus*

![w fp 02](https://docs.owen.ru/book_img/1905/133918.png)

*Запись уставки из программы контроллера*

<a id="topic-94825"></a>

## Примеры настройки обмена по протоколу Modbus

<a id="topic-94826"></a>

### ПЛК210 (Modbus RTU Master) и модули Мх110

В качестве примера будет рассмотрена настройка обмена с модулями [Mx110](https://owen.ru/catalog/moduli_vvoda_vivoda/info/general_information_Mx110) (МВ110-8А, МВ110-16Д и МУ110-8Р).

**Реализуемый алгоритм:** если значение первого аналогового входа модуля МВ110-8А превышает 30 и при этом первый дискретный вход модуля МВ110-16Д замкнут, то первый дискретный выход МУ110-8Р замыкается с задержкой 3 секунды. Во всех остальных случаях дискретный выход МУ110-8Р разомкнут.

<a id="sh_pr1"></a>

![Стр Сх пример Пл К210 rtu m Mx110](https://docs.owen.ru/book_img/1905/133917.png)

*Структурная схема примера*

Пример создан в среде **Полигон** и подразумевает запуск на **ПЛК210** с прошивкой **3.х**.

Если требуется запустить проект на другом устройстве, следует изменить свойства <b>*ОС*</b> и <b>*Тип процессорной платы*</b> в окне <b>*Свойства*</b> модуля *MB_RTU_master_Mx110* на необходимые.

Пример доступен для скачивания по [ссылке](https://owen.ru/product/polygon/documentation). Пароль для доступа к отладчику – **1**.

<a id="t1_pr1"></a>

**Сетевые параметры устройств в примере**

| Параметр | МВ110-16Д | МВ110-8А | МУ110-8Р |
| --- | --- | --- | --- |
| COM-порт ПЛК, к которому подключен модуль | A1B1 | A1B1 | A1B1 |
| Адрес модуля | 1 | 16 | 17 |
| Скорость обмена | 9600 | 9600 | 9600 |
| Количество бит данных | 8 | 8 | 8 |
| Контроль четности | Нет | Нет | Нет |
| Количество стоп-бит | 1 | 1 | 1 |

<a id="t2_pr1"></a>

**Регистры модулей в примере**

| Модуль | Номер регистра DEC | Тип в устройстве | Функция Modbus | Описание |
| --- | --- | --- | --- | --- |
| МВ110-8А | 4, 5 | FLOAT 32 | 0x03 | Значение температуры со входа 1 |
| МВ110-16Д | 51 | UINT 16 | 0x03 | Битовая маска входов |
| МУ110-8Р | 50 | UINT 16 | 0x10 | Битовая маска выходов |

Для настройки обмена следует:

1. Настроить модули **Mx110** с помощью программы **ОВЕН Конфигуратор/Конфигуратор М110** в соответствии с [таблицей](#t1_pr1). Подключить модули к контроллеру в соответствии с [рисунком](#sh_pr1).

2. Создать новый проект **Полигон** (в примере — файл с именем *MB\_**RTU**\_master_Mx110*). Добавить в проект библиотеку <b>*paModbus*</b>.

3. Добавить в место работы <b>*Фон*</b> программу с именем *Modbus**\_**RTU**\_**Master*.

4. Внутри программы добавить четыре <b>*Страницы*</b>, в свойстве <b>*Комментарии*</b> которых указать соответственно *COM**-порт*, *МВ110-8А*, *МВ110-16Д* и *МУ110-8Р*.

   ![pr1 01](https://docs.owen.ru/book_img/1905/133916.png)

   *Дерево проекта*

5. Внутри страницы *COM**-порт* создать блок [210-RS485](#topic-94789) из библиотеки <b>*paOwenIO*</b>. На входах блока задать значения в соответствии с [таблицей](#t1_pr1).

   ![pr1 02](https://docs.owen.ru/book_img/1905/133935.png)

   *Настройка блока COM-порт*

6. Далее создать блок [Modbus RTU Master](#topic-94796). Соединить вход  с соответствующим выходом блока <b>*210-*</b><b>*RS*</b><b>*485*</b>.

   ![pr1 03](https://docs.owen.ru/book_img/1905/133934.png)

   <i>Настройка блока **Modbus** **RTU** **Master**</i>

7. Внутри страницы *МВ110-8А* создать блок чтения значений с плавающей запятой [ModbusFltIn](#topic-94806). На входах блока задать значения в соответствии с [таблицами](#t1_pr1) [и](#t2_pr1).

   ![pr1 04](https://docs.owen.ru/book_img/1905/133933.png)

   *Настройка блока ModbusFltIn*

8. Внутри страницы *МВ110-16Д* создать блок для чтения значений с дискретных входов <b>*ModbusRegIn*</b>. На входах блока задать значения [таблицами](#t1_pr1) [и](#t2_pr1).

9. Создать блок выбора 16 битов из регистра <b>*FromReg*</b><b>*16*</b> из библиотеки <b>*paCore*</b> и соединить выход блока <b>*ModbusRegIn*</b> **o0** с входом **reg** блока <b>*FromReg*</b><b>*8*</b>. Добавить к первому выходу блока <b>*FromReg*</b><b>*8*</b> комментарий – *Вход МВ110-16Д*.

   ![pr1 05](https://docs.owen.ru/book_img/1905/133932.png)

   *Страница МВ110-16Д*

10. Поставить на странице порядки <b>*По потоку данных*</b>.

11. Внутри страницы *МУ110-8Р* создать блок для записи значений на дискретные выходы <b>*ModbusRegsOut*</b>. На входах блока задать значения в соответствии с [таблицами](#t1_pr1) [и](#t2_pr1).

12. Создать блок объединения 8 битов в регистр <b>*ToReg*</b><b>*8*</b> из библиотеки <b>*paCore*</b> и соединить вход блока <b>*ModbusRegsOut*</b>**in0** с входом **reg** блока <b>*ToReg*</b><b>*8*</b>. Добавить к первому входу блока <b>*ToReg*</b><b>*8*</b> комментарий – *Выход МУ110-8Р*.

    ![pr1 06](https://docs.owen.ru/book_img/1905/133931.png)

    *Страница МУ110-8Р*

13. Поставить на странице порядки <b>*По потоку данных*</b>.

14. Соединить выход блока <b>*Modbus*</b><b>*RTU*</b> <b>*Master*</b> **itr** с соответствующими входами блоков чтения на страницах *МВ110-8А* и *МВ110-16Д*.

15. Создать вход у блока <b>*Modbus*</b> <b>*RTU*</b> <b>*Master*</b> **bo0**, соединить его с соответствующим выходом блока записи на странице *МУ110-8Р*.

16. Создать в месте работы <b>*Таймер*</b> программу с названием *Mx**110*.

17. Внутри программы создать страницы с комментариями *Значения с модулей* и *Обработка значений*.

    ![pr1 07](https://docs.owen.ru/book_img/1905/133930.png)

    *Дерево программы*

18. На странице *Значения с модулей* создать блоки <b>*TransBit*</b> и <b>*TransFlt*</b> из библиотеки <b>*paCore*</b>.

    ![pr1 08](https://docs.owen.ru/book_img/1905/133929.png)

    *Блоки TransBit и TransFlt*

19. Соединить входы блоков со страницы *Значения с модулей* с выходами блоков со страниц *МВ110-8А* и *МВ110-16Д*, как показано на рисунках ниже.

    ![pr1 09](https://docs.owen.ru/book_img/1905/133928.png)

    *Соединение блоков (Значения с модулей)*

    ![pr1 10](https://docs.owen.ru/book_img/1905/133927.png)

    *Соединение блоков (МВ110-8А)*

    ![pr1 11](https://docs.owen.ru/book_img/1905/133926.png)

    *Соединение блоков (МВ110-16Д)*

20. Соединить выход блока со страницы *Значения с модулей* с входами блоков со страницы *МУ110-8Р*, как показано на рисунках ниже.

    ![pr1 12](https://docs.owen.ru/book_img/1905/133945.png)

    <i>Соединение блоков (**Значения с модулей)**</i>

    ![pr1 13](https://docs.owen.ru/book_img/1905/133944.png)

    <i>Соединение блоков (**МУ110-8А)**</i>

21. На странице *Обработка значений* создать блоки <b>*Cmpr*</b>, <b>*AND*</b> и <b>*DelayOn*</b> из библиотеки <b>*paCore*</b>. Соединить их и настроить в соответствии с рисунком ниже.

    ![pr1 14](https://docs.owen.ru/book_img/1905/133943.png)

    *Страница Обработка значений*

22. Соединить входы блоков <b>*Cmpr*</b> и <b>*AND*</b> с выходами блоков со страницы *Значения с модулей*, как показано на рисунках ниже.

    ![pr1 15](https://docs.owen.ru/book_img/1905/133942.png)

    <i>Соединение блоков (**Значения с модулей) с блоками Cmpr и** **AND**</i>

    ![pr1 16](https://docs.owen.ru/book_img/1905/133941.png)

    *Соединение блоков (Обработка значений)*

23. Соединить выход блока <b>*DelayOn*</b> с входом блока со страницы *Значения с модулей*, как показано на рисунках ниже.

    ![pr1 17](https://docs.owen.ru/book_img/1905/133940.png)

    <i>Соединение блока (**Значения с модулей) с блоком DelayOn**</i>

    ![pr1 18](https://docs.owen.ru/book_img/1905/133939.png)

    <i>Соединение блока (**Обработка значений)**</i>

    Для наладки работы собранной системы в примере используется окно представления <b>*График*</b>. Для настройки графика необходимо сделать следующее.

24. Создать в модуле <b>*Раздел*</b> с именем *График*.

25. Добавить в раздел <b>*График*</b> выходы блоков <b>*TransBit*</b> и <b>*TransFlt*</b> – *Температура*, Вход МВ110-16Д и *Выход МУ110-8Р*. На странице *Значения с модулей* данные выходы должны подсветиться желтым.

    ![pr1 19](https://docs.owen.ru/book_img/1905/133938.png)

    *Дерево проекта*

    ![pr1 20](https://docs.owen.ru/book_img/1905/133937.png)

    *Блоки TransBit и TransFlt с подсвеченными выходами*

26. Открыть окно представления <b>*График*</b> и перетащить созданный раздел в верхнее поле окна.

    ![pr1 21](https://docs.owen.ru/book_img/1905/133936.png)

    *Окно представления график*

27. Запустить проект на контроллере, запустить отладчик и открыть график. Корректная работа системы показана на рисунке ниже.

    ![pr1 22](https://docs.owen.ru/book_img/1905/133955.png)

    *Работа программы*

<a id="topic-94827"></a>

### ПЛК210 (Modbus RTU Slave) и Owen OPC Server

В качестве примера будет рассмотрена настройка обмена с [Owen OPC Server](https://owen.ru/product/new_opc_server), который будет использоваться в режиме **Modbus** **RTU** **Master**.

<a id="sh_pr2"></a>

![Стр Сх пример ПЛК210 rtu s OPC](https://docs.owen.ru/book_img/1905/133954.png)

*Структурная схема примера*

Пример создан в среде **Полигон** и подразумевает запуск на **ПЛК210** с прошивкой **3.х**.

Если требуется запустить проект на другом устройстве, следует изменить свойства <b>*ОС*</b> и <b>*Тип процессорной платы*</b> в окне <b>*Свойства*</b> модуля *MB\_**RTU**\_**slave**\_**Owen**\_**OPC**\_**server* на необходимые.

Пример доступен для скачивания по [ссылке](https://owen.ru/product/polygon/documentation). Пароль для доступа к отладчику – **1**.

<a id="t1_pr2"></a>

**Сетевые параметры устройств в примере**

| Параметр | ПЛК210 | Owen OPC Server |
| --- | --- | --- |
| Режим работы | Slave | Master |
| COM-порт | A2B2 | COM13 |
| Slave ID | 1 | - |
| Скорость обмена | 115200 | 115200 |
| Количество бит данных | 8 | 8 |
| Контроль четности | Нет | Нет |
| Количество стоп-бит | 1 | 1 |

<a id="t2_pr2"></a>

**Регистры/флаги ПЛК в примере**

| Адрес регистра/флага | Тип в устройстве | Область памяти |
| --- | --- | --- |
| 0 | WORD | Holding Registers |
| 0 | BOOL | Coils |
| 1, 2 | REAL | Holding Registers |

Для настройки обмена следует:

1. Подключить контроллер и ПК в соответствии с [рисунком](#sh_pr2).

2. Создать новый проект **Полигон** (в примере с именем *MB\_**RTU**\_**slave**\_**Owen**\_**OPC**\_**server*). Добавить в проект библиотеку <b>*paModbus*</b>.

3. Добавить в место работы <b>*Фон*</b> программу с именем *Modbus**\_**RTU**\_**Slave*.

4. Внутри программы добавить две <b>*Страницы*</b>, в свойстве <b>*Комментарии*</b> которых указать соответственно *Modbus* *RTU* *Slave* и *Регистры* *Modbus*.

   ![pr2 01](https://docs.owen.ru/book_img/1905/133953.png)

   *Дерево проекта*

5. Внутри страницы *Modbus* *RTU* *Slave* создать блок [210-RS485](#topic-94789) из библиотеки <b>*paOwenIO*</b>. На входах блока задать значения в соответствии с [таблицей](#t1_pr2).

   ![pr2 02](https://docs.owen.ru/book_img/1905/133952.png)

   <i>Настройка блока **COM****-порта**</i>

6. Далее создать блок [Modbus RTU Slave](#topic-94797). Соединить вход **cnc** с соответствующим выходом блока <b>*210-*</b><b>*RS*</b><b>*485*</b>.

   ![pr2 03](https://docs.owen.ru/book_img/1905/133951.png)

   <i>Настройка блока **Modbus** **RTU** **Slave**</i>

7. Затем создать [блоки записи](#topic-94808) регистров в ПЛК (в соответствии с [таблицей](#t2_pr2)). Соединить входы блоков **itr** с советствующим выходом блока <b>*Modbus*</b> <b>*RTU*</b> <b>*Slave*</b>.

   ![pr2 04](https://docs.owen.ru/book_img/1905/133950.png)

   *Настройка блоков записи*

8. Создать [блоки чтения](#topic-94801) регистров из ПЛК (в соответствии с [таблицей](#t2_pr2)). Создать три входа **bo** у блока <b>*Modbus*</b> <b>*RTU*</b> <b>*Slave*</b>. Соединить их с соответствующими выходами блоков чтения.

   ![pr2 05](https://docs.owen.ru/book_img/1905/133949.png)

   *Настройка блоков чтения*

9. Для того, чтобы одновременно читать и записывать одни и те же значения мастером сети, следует соединить выходы блоков записи **o** со входами блоков чтения **in**. Для удобства в примере используются скрытые связи.

   Для создания скрытой связи следует в свойствах выхода **o** добавить свойства <b>*Полный алиас*</b> и <b>*Глобальная константа*</b>. В свойстве <b>*Полный алиас*</b> задать имя новой константы.

   Повторить те же действия для всех блоков записи на странице.

   ![pr2 06](https://docs.owen.ru/book_img/1905/133948.png)

   *Создание скрытой связи*

   ![pr2 07](https://docs.owen.ru/book_img/1905/133947.png)

   *Блок записи с константным выходом*

10. У соответствующих входов блоков чтения **in** правой кнопкой мыши задать созданные глобальные константы.

    ![pr2 08](https://docs.owen.ru/book_img/1905/133946.png)

    *Создание скрытой связи*

11. Поставить на странице порядки <b>*По потоку данных*</b>.

    Таким образом, вид страницы *Modbus* *RTU* *Slave* примет вид как на рисунке ниже.

    ![pr2 09](https://docs.owen.ru/book_img/1905/133965.png)

    *Вид страницы Modbus RTU Slave*

12. Для удобства можно вынести значения созданных регистров ПЛК на отдельную страницу *Регистры* *Modbus*.

    Для этого следует на странице *Регистры* *Modbus* создать блоки <b>*TransBit*</b>, <b>*TransInt*</b> и <b>*TransFlt*</b> из библиотеки <b>*paCore*</b>.

    На входы созданных блоков **l** задать созданные ранее константы. Выходы блоков **o** при необходимости соединить с другими блоками в проекте.

    ![pr2 10](https://docs.owen.ru/book_img/1905/133964.png)

    *Терминальные блоки*

13. Установить и запустить [Owen OPC Server](https://owen.ru/product/new_opc_server).

14. Нажать правой кнопкой мыши на компонент <b>*Сервер*</b> и добавить узел.

    ![pr2 11](https://docs.owen.ru/book_img/1905/133963.png)

    *Добавление узла*

15. В свойствах добавленного узла задать протокол <b>*Modbus*</b> <b>*RTU*</b> и настройки интерфейса в соответствии с [таблицей](#t1_pr2).

    ![pr2 12](https://docs.owen.ru/book_img/1905/133962.png)

    *Свойства узла*

16. Добавить в узел <b>*Устройство*</b>.

    ![pr2 13](https://docs.owen.ru/book_img/1905/133961.png)

    *Добавление устройства*

17. Задать в устройстве свойства в соответствии с [таблицей](#t1_pr2).

    ![pr2 14](https://docs.owen.ru/book_img/1905/133960.png)

    *Свойства устройства*

18. Добавить в устройстве три <b>*Тега*</b>.

    ![pr2 15](https://docs.owen.ru/book_img/1905/133959.png)

    *Добавление тега*

19. Задать созданным тегам свойства в соответствии с [таблицей](#t2_pr2).

    ![pr2 16](https://docs.owen.ru/book_img/1905/133958.png)

    *Тег Coil*

    ![pr2 17](https://docs.owen.ru/book_img/1905/133957.png)

    <i>Тег **Word**</i>

    ![pr2 18](https://docs.owen.ru/book_img/1905/133956.png)

    <i>Тег **Real**</i>

20. Загрузить и открыть программу в ПЛК, запустить отладчик. Запустить опрос Owen OPC Server.

21. Корректный обмен данными показан на рисунках ниже.

    ![pr2 19](https://docs.owen.ru/book_img/1905/133975.png)

    *Работа программы ПЛК*

    ![pr2 20](https://docs.owen.ru/book_img/1905/133974.png)

    *Работа Owen OPC Server*

<a id="topic-94828"></a>

### ПЛК210 (Modbus TCP Master) и модули Мх210

В качестве примера будет рассмотрена настройка обмена с модулями [Mx210](https://owen.ru/catalog/moduli_vvoda_vivoda/info/general_information_Mx210) (МВ210-101 и МК210-301).

**Реализуемый алгоритм:** если значение первого аналогового входа модуля МВ210-101 превышает 30 градусов, то на первом выходе модуля МК210-301 включается ШИМ-генератор. В любом другом случае выход находится в режиме переключения логического сигнала.

Первый выход МК210-301 соединяют с первым входом для отслеживания поступающих сигналов.

![Стр Сх пример ПЛК210 tcp m Mx210](https://docs.owen.ru/book_img/1905/133973.png)

*Структурная схема примера*

Пример создан в среде **Полигон** и подразумевает запуск на **ПЛК210** с прошивкой **3.х**.

Если требуется запустить проект на другом устройстве, следует изменить свойства <b>*ОС*</b> и <b>*Тип процессорной платы*</b> в окне <b>*Свойства*</b> модуля *MB_TCP_master_Mx210* на необходимые.

Пример доступен для скачивания по [ссылке](https://owen.ru/product/polygon/documentation). Пароль для доступа к отладчику – **1**.

<a id="t1_pr3"></a>

**Сетевые параметры устройств в примере**

| Параметр | ПЛК210 | МВ210-101 | МК210-301 |
| --- | --- | --- | --- |
| Режим работы | Master | Slave | Slave |
| IP адрес | 10.2.7.77 | 10.2.11.68 | 10.2.4.5 |
| Маска подсети | 255.255.0.0 | 255.255.0.0 | 255.255.0.0 |
| IP адрес шлюза | 10.2.1.1 | 10.2.1.1 | 10.2.1.1 |
| Порт | 502 | 502 | 502 |
| Slave ID | - | 1 | 1 |

<a id="t2_pr3"></a>

**Регистры модулей в примере**

| Модуль | Номер регистра DEC | Тип в устройстве | Функция Modbus | Описание |
| --- | --- | --- | --- | --- |
| МВ210-101 | 4000…4002 | FLOAT 32 и UINT 16 | 0x03 | Значение входа 1 и время измерения входа 1 |
| МВ210-101 | 4003…4005 | FLOAT 32 и UINT 16 | 0x03 | Значение входа 2 и время измерения входа 2 |
| МВ210-101 | 4005…4008 | FLOAT 32 и UINT 16 | 0x03 | Значение входа 3 и время измерения входа 3 |
| МК210-301 | 51 | UINT 8 | 0x03 | Битовая маска входов DI1…DI6 |
| МК210-301 | 272 | UINT 16 | 0x06 | Режим работы выхода DO1:<br>0 – переключение лог. сигнала;<br>1 – ШИМ |
| МК210-301 | 308 | UINT 16 | 0x06 | Период ШИМ DO1:<br>1000…60000 (мс) |
| МК210-301 | 340 | UINT 16 | 0x06 | Коэффициент заполнения ШИМ DO1:<br>0…1000 (0.1 %) |
| МК210-301 | 470 | UINT 8 | 0x06 | Битовая маска установки состояния выходов DO1…DO8 |

Для настройки обмена следует:

1. Настроить модули **Mx210** с помощью программы **ОВЕН Конфигуратор** в соответствии с [таблицей](#t1_pr3) (см. руководство **Mx210. Примеры настройки обмена**). Подключить модули к контроллеру в соответствии с [рисунком](#t1_pr3).

2. Создать новый проект **Полигон** (в примере с именем *MB_TCP_master_Mx210*). Добавить в проект библиотеку <b>*paModbus*</b>.

3. Добавить в место работы <b>*Фон*</b> программу с именем *Modbus**\_**TCP**\_**Client*.

4. Внутри программы добавить две <b>*Страницы*</b>, в свойстве <b>*Комментарии*</b> которых указать соответственно *MВ210-101* и *МК210-301*.

   ![pr3 01](https://docs.owen.ru/book_img/1905/133972.png)

   *Дерево проекта*

5. <a id="p5"></a>

   Внутри страницы *МВ210-101* создать блок [TcpIpClA](#topic-94793) из библиотеки <b>*paCore*</b>. На входах блока задать значения в соответствии с [таблицей](#t1_pr3).

   В примере локальный IP-адрес контроллера взят по SQL-запросу – обращение к соответствующему свойству модуля *MB_TCP_master_Mx210*.

   Запрос IP-адреса:

   ```
   "<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_ip"</sql>"
   ```

   ![pr3 02](https://docs.owen.ru/book_img/1905/133971.png)

   *Настройка блока TCP/IP-клиента*

6. Далее создать блок [Modbus TCP Master](#topic-94799). Соединить вход **cnc** с соответствующим выходом блока <b>*TcpIpClA*</b>.

   ![pr3 03](https://docs.owen.ru/book_img/1905/133970.png)

   <i>Настройка блока **Modbus** **TCP** **Master**</i>

7. Затем создать блок чтения результатов измерения с аналоговых входов [OwenFltIn](#topic-94807). Добавить к блоку два выхода. В комментариях к выходам **rslt** прописать, к каким входам МВ210-101 они относятся. Соединить вход блока **itr** с соответствующим выходом блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Master*</b>.

   ![pr3 04](https://docs.owen.ru/book_img/1905/133969.png)

   *Настройка блока OwenFltIn*

8. Поставить на странице порядки <b>*По потоку данных*</b>.

9. Повторить п. [5…6](#p5) на странице *МК210-301*.

   ![pr3 05](https://docs.owen.ru/book_img/1905/133968.png)

   <i>Настройка блоков **TCP****/****IP****-клиента и** **Modbus** **TCP** **Master**</i>

10. <a id="p10"></a>

    Создать блок для чтения значений с дискретных входов <b>*ModbusRegIn*</b>. Задать на входе **slv** значение 1, на входе **adr0** – 51 (см. [таблицу](#t2_pr3)). Соединить вход блока **itr** с соответствующим выходом блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Master*</b>.

    ![pr3 06](https://docs.owen.ru/book_img/1905/133967.png)

    <i>Настройка блока **ModbusRegIn**</i>

11. <a id="p11"></a>

    Создать блок выбора 8 битов из регистра <b>*FromReg*</b><b>*8*</b> из библиотеки <b>*paCore*</b> и соединить выход блока <b>*ModbusRegIn*</b> **o0** с входом **reg** блока <b>*FromReg*</b><b>*8*</b>. Добавить к первому выходу блока <b>*FromReg*</b><b>*8*</b> комментарий – *Вход 1*.

    ![pr3 07](https://docs.owen.ru/book_img/1905/133966.png)

    <i>Настройка блока **FromReg****8**</i>

12. Аналогично [п. 10](#p10) создать блоки записи <b>*ModbusRegOut*</b> регистров **470**, **272**, **308**, **340** (см. [таблицу](#t2_pr3)). В качестве начальных значений периода и коэффициента заполнения ШИМ указать соответственно, 2000 и 500.

    ![pr3 08](https://docs.owen.ru/book_img/1905/133985.png)

    <i>Настройка блоков **ModbusRegOut**</i>

13. Создать блок объединения 8 битов в регистр <b>*ToReg*</b><b>*8*</b> из библиотеки <b>*paCore*</b> аналогично [п. 11](#p11).

    ![pr3 09](https://docs.owen.ru/book_img/1905/133984.png)

    <i>Настройка блока **ToReg****8**</i>

14. Поставить на странице порядки <b>*По потоку данных*</b>.

    Итоговый вид страниц *МВ210-101* и *МК210-301* показан на рисунках ниже.

    ![pr3 10](https://docs.owen.ru/book_img/1905/133983.png)

    *Вид страницы МВ210-101*

    ![pr3 11](https://docs.owen.ru/book_img/1905/133982.png)

    *Вид страницы МК210-101*

    Перейти к обработке значений входов/выходов.

15. Создать в месте работы <b>*Таймер*</b> программу с названием *Mx**210*.

16. Внутри программы создать страницы с комментариями *Значения с модулей* и *Обработка значения температуры*.

    ![pr3 12](https://docs.owen.ru/book_img/1905/133981.png)

    *Дерево программы*

17. На странице *Значения с модулей* создать блоки <b>*TransBit*</b> и <b>*TransFlt*</b> из библиотеки <b>*paCore*</b> с тремя входами.

    ![pr3 13](https://docs.owen.ru/book_img/1905/133980.png)

    *Блоки TransBit и TransFlt*

18. Соединить входы блоков со страницы *Значения с модулей* с выходами блоков со страниц *МВ210-101* и *МК210-301*, как показано на рисунках ниже.

    ![pr3 14](https://docs.owen.ru/book_img/1905/133979.png)

    *Соединение блоков (Значения с модулей)*

    ![pr3 15](https://docs.owen.ru/book_img/1905/133978.png)

    <i>Соединение блоков (**МВ210-101)**</i>

    ![pr3 16](https://docs.owen.ru/book_img/1905/133977.png)

    *Соединение блоков (МК210-301)*

19. Соединить выходы блоков со страницы *Значения с модулей* с выходами блоков со страницы *МВ210-101*, как показано на рисунках ниже.

    ![pr3 17](https://docs.owen.ru/book_img/1905/133976.png)

    <i>Соединение блоков (**Значения с модулей)**</i>

    ![pr3 18](https://docs.owen.ru/book_img/1905/133995.png)

    *Соединение блоков (МК210-301)*

20. На странице *Обработка значения температуры* создать блоки <b>*Cmpr*</b> из библиотеки <b>*paCore*</b>.

    ![pr3 19](https://docs.owen.ru/book_img/1905/133994.png)

    *Блок Cmpr*

21. Соединить вход и выход блока <b>*Cmpr*</b> с выходом и входом блоков со страницы *Значения с модулей*, как показано на рисунках ниже.

    ![pr3 20](https://docs.owen.ru/book_img/1905/133993.png)

    *Соединение блоков (Значения с модуля МК210–301) с блоком Cmpr*

    ![pr3 21](https://docs.owen.ru/book_img/1905/133992.png)

    <i>Соединение блоков (**Значения с модуля МВ210–101) с блоком Cmpr**</i>

    Для наладки работы собранной системы в примере используется окно представления <b>*График*</b>.

22. Создать в модуле <b>*Раздел*</b> с именем *График*.

23. Добавить в раздел <b>*График*</b> выходы блоков <b>*TransBit*</b> и <b>*TransFlt*</b> – *Выход* и *Температура*. На странице *Значения с модулей* данные выходы должны подсветиться желтым.

    ![pr3 22](https://docs.owen.ru/book_img/1905/133991.png)

    *Дерево проекта*

    ![pr3 23](https://docs.owen.ru/book_img/1905/133990.png)

    *Блоки TransBit и TransFlt с подсвеченными выходами*

24. Открыть окно представления <b>*График*</b> и перетащить созданный раздел в верхнее поле окна.

    ![pr3 24](https://docs.owen.ru/book_img/1905/133989.png)

    *Окно представления график*

25. Запустить проект на контроллере, запустить отладчик и открыть график. Пронаблюдать корректную работу системы.

    ![pr3 25](https://docs.owen.ru/book_img/1905/133988.png)

    *Работа программы*

<a id="topic-94829"></a>

### ПЛК210 (Modbus TCP Slave) и Owen OPC Server

В качестве примера будет рассмотрена настройка обмена с [Owen OPC Server](https://owen.ru/product/new_opc_server), который будет использоваться в режиме **Modbus** **TCP** **Master**.

![Стр Сх пример ПЛК210 tcp s OPC](https://docs.owen.ru/book_img/1905/133987.png)

*Структурная схема примера*

Пример создан в среде **Полигон** и подразумевает запуск на **ПЛК210** с прошивкой **3.х**.

Если требуется запустить проект на другом устройстве, следует изменить свойства <b>*ОС*</b> и <b>*Тип процессорной платы*</b> в окне <b>*Свойства*</b> модуля *MB_TCP\_**slave**\_**Owen**\_**OPC**\_**server* на необходимые.

Пример доступен для скачивания по [ссылке](https://owen.ru/product/polygon/documentation). Пароль для доступа к отладчику – **1**.

<a id="t1_pr4"></a>

**Сетевые параметры устройств в примере**

| Параметр | ПЛК210 | Owen OPC Server |
| --- | --- | --- |
| Режим работы | Slave | Master |
| IP адрес | 10.2.7.77 | 10.2.3.179 |
| Порт | 502 | 502 |
| Slave ID | 1 | - |

<a id="t2_pr4"></a>

**Регистры/флаги ПЛК в примере**

| Адрес регистра/флага | Тип в устройстве | Область памяти |
| --- | --- | --- |
| 0 | WORD | Holding Registers |
| 0 | BOOL | Coils |
| 1, 2 | REAL | Holding Registers |

Для настройки обмена следует:

1. Подключить контроллер и ПК к общей локальной сети (сетевые настройки ПЛК и ПК в примере см. [таблицу](#t1_pr4)).

2. Создать новый проект **Полигон** (в примере с именем *MB_TCP\_**slave**\_**Owen**\_**OPC**\_**server*). Добавить в проект библиотеку <b>*paModbus*</b>.

3. Добавить в место работы <b>*Фон*</b> программу с именем *Modbus**\_**TCP**\_**Server*.

4. Внутри программы добавить две <b>*Страницы*</b>, в свойстве <b>*Комментарии*</b> которых указать соответственно *Modbus* *TCP* *Server* и *Регистры* *Modbus*.

   ![pr4 01](https://docs.owen.ru/book_img/1905/133986.png)

   *Дерево проекта*

5. Внутри страницы *Modbus* *TCP* *Server* создать блок [TcpIpSrA](#topic-94792) из библиотеки <b>*paCore*</b>. На входах блока задать значения в соответствии с [таблицей](#t1_pr4).

   В примере локальный IP-адрес контроллера взят по SQL-запросу – обращение к соответствующему свойству модуля *MB_TCP\_**slave**\_**Owen**\_**OPC**\_**server*.

   Запрос IP-адреса:

   ```
   "<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_ip"</sql>"
   ```

   ![pr4 02](https://docs.owen.ru/book_img/1905/134005.png)

   <i>Настройка блока **TCP****/****IP****-сервера**</i>

6. Далее создать блок [Modbus TCP Slave](#topic-94800). Соединить вход **cnc** с соответствующим выходом блока <b>*TcpIp*</b><b>*SrA*</b>.

   ![pr4 03](https://docs.owen.ru/book_img/1905/134004.png)

   <i>Настройка блока **Modbus** **TCP** **Slave**</i>

7. Затем создать [блоки записи](#topic-94808) регистров в ПЛК (в соответствии с [таблицей](#t2_pr4)). Соединить входы блоков **itr** с сооветствующим выходом блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Slave*</b>.

   ![pr4 04](https://docs.owen.ru/book_img/1905/134003.png)

   *Настройка блоков записи*

8. Создать [блоки чтения](#topic-94801) регистров из ПЛК (в соответствии с [таблицей](#t2_pr4)). Создать три входа **bo** у блока <b>*Modbus*</b> <b>*TCP*</b> <b>*Slave*</b>. Соединить их с соответствующими выходами блоков чтения.

   ![pr4 05](https://docs.owen.ru/book_img/1905/134002.png)

   *Настройка блоков чтения*

9. Для того, чтобы одновременно читать и записывать одни и те же значения мастером сети, следует соединить выходы блоков записи **o** со входами блоков чтения **in**.

   Для создания скрытой связи следует в свойствах выхода **o** добавить свойства <b>*Полный алиас*</b> и <b>*Глобальная константа*</b>. В свойстве <b>*Полный алиас*</b> задать имя новой константы. Эти действия следует повторить для всех блоков записи на странице.

   ![pr2 06](https://docs.owen.ru/book_img/1905/133948.png)

   *Создание скрытой связи*

   ![pr2 07](https://docs.owen.ru/book_img/1905/133947.png)

   *Блок записи с константным выходом*

10. У соответствующих входов блоков чтения **in** правой кнопкой мыши задать созданные глобальные константы.

    ![pr2 08](https://docs.owen.ru/book_img/1905/133946.png)

    *Создание скрытой связи*

11. Поставить на странице порядки <b>*По потоку данных*</b>.

    Итоговый вид страницы *Modbus TCP Server* показан на рисунке ниже.

    ![pr4 06](https://docs.owen.ru/book_img/1905/134001.png)

    *Вид страницы Modbus TCP Server*

12. Для удобства можно вынести значения созданных регистров ПЛК на отдельную страницу *Регистры* *Modbus*.

    Для этого на странице *Регистры* *Modbus* следует создать блоки <b>*TransBit*</b>, <b>*TransInt*</b> и <b>*TransFlt*</b> из библиотеки <b>*paCore*</b>.

    На входы созданных блоков **l** задать созданные ранее константы. Выходы блоков **o** при необходимости соединить с другими блоками в проекте.

    ![pr2 10](https://docs.owen.ru/book_img/1905/133964.png)

    *Терминальные блоки*

13. Установить и запустить [Owen OPC Server](https://owen.ru/product/new_opc_server).

14. Нажать правой кнопкой мыши на компонент **Сервер** и добавить узел.

    ![pr2 11](https://docs.owen.ru/book_img/1905/133963.png)

    *Добавление узла*

15. В свойствах добавленного узла задать протокол <b>*Modbus*</b> <b>*TCP*</b><b>*/*</b><b>*IP*</b>.

    ![pr4 07](https://docs.owen.ru/book_img/1905/134000.png)

    *Свойства узла*

16. Добавить в узел <b>*Устройство*</b>.

    ![pr2 13](https://docs.owen.ru/book_img/1905/133961.png)

    *Добавление устройства*

17. Задать в устройстве свойства в соответствии с [таблицей](#t1_pr4).

    ![pr4 08](https://docs.owen.ru/book_img/1905/133999.png)

    *Свойства устройства*

18. Добавить в устройстве три <b>*Тега*</b>.

    ![pr4 09](https://docs.owen.ru/book_img/1905/133998.png)

    *Добавление тега*

19. Задать созданным тегам свойства в соответствии с [таблицей](#t2_pr4).

    ![pr2 16](https://docs.owen.ru/book_img/1905/133958.png)

    *Тег Coil*

    ![pr2 17](https://docs.owen.ru/book_img/1905/133957.png)

    *Тег Word*

    ![pr2 18](https://docs.owen.ru/book_img/1905/133956.png)

    <i>Тег **Real**</i>

20. Загрузить и открыть программу в ПЛК, запустить отладчик. Запустить опрос Owen OPC Server.

21. Корректный обмен данными показан на рисунках ниже.

    ![pr2 19](https://docs.owen.ru/book_img/1905/133975.png)

    *Работа программы ПЛК*

    ![pr2 20](https://docs.owen.ru/book_img/1905/133974.png)

    *Работа Owen OPC Server*

<a id="topic-94830"></a>

## Коды ошибок Modbus (Modbus Exception Codes)

**Коды ошибок Modbus (Modbus Exception Codes)**

| Код | Имя | Описание |
| --- | --- | --- |
| 1 (0x01) | ILLEGAL FUNCTION | Код функции в запросе не поддерживается сервером |
| 2 (0x02) | ILLEGAL DATA ADDRESS | Адрес параметра в запросе не поддерживается сервером |
| 3 (0x03) | ILLEGAL DATA VALUE | Недопустимое значение данных для сервера |
| 4 (0x04) | SERVER DEVICE FAILURE | Сбой устройства сервера |
| 5 (0x05) | ACKNOWLEDGE | Сервер принял запрос, но ему требуется много времени для его обработки (предотвращение ошибки тайм-аута) |
| 6 (0x06) | SERVER DEVICE BUSY | Сервер занят обработкой другого запроса. Клиент должен повторить запрос позже, когда сервер освободится |
| 08 (0x08) | MEMORY PARITY ERROR | Произошла ошибка во время использования функции Modbus 20 или 21 |
| 10 (0x0A) | GATEWAY PATH UNAVAILABLE | Шлюз перегружен или неправильно настроен – невозможно построить маршрут к серверу |
| 11 (0x0B) | GATEWAY TARGET DEVICE<br>FAILED TO RESPOND | Нет ответа от сервера или он не в сети |
