• Для опроса ведомых устройств Modbus используется библиотека Modb_l05.lib и модули последовательных интерфейсов с настраиваемыми параметрами
• Коммуникационные модули нужно предварительно настроить, для чего обязательно требуется утилита WAGO-I/O-CHECK
• Модули с предустановленными параметрами тоже можно конфигурировать, особым образом изменив конфигурационные файлы WAGO-I/O-CHECK
• Прилагается пример программы для проверки работы Modbus
Контроллер WAGO обычно выступает ведомым (Slave) в сетях Modbus. Однако можно сделать его и ведущим (Master). Для этого используется библиотека Modb_l05.lib .
В этой библиотеке вы найдете функциональный блок MODBUS_MASTER_RTU, с помощью которого можно опрашивать по Modbus ведомые устройства. Блок предназначен для работы с любыми контроллерами, кроме контроллеров со встроенной поддержкой Modbus (750-812, 750-814, 750-815 и 750-816).
Иллюстрация 1: Пример использования MODBUS_MASTER_RTU
Этот функциональный блок может использоваться с коммуникационными модулями 750-65x, со встроенным портом RS-232 контроллера 750-873 и с портом для программирования контроллеров. Но как правило, протокол Modbus применяется для обмена по интерфейсу RS-485, для работы с которым используется модуль 750-653 или 753-653.
Коммуникационные модули WAGO обычно обладают предустановленными настройками скорости, количества стоповых битов, проверки четности и количества битов в байте. Вариант настроек модуля необходимо указывать при заказе. Сделано это для того, чтобы упростить обслуживание систем автоматизации: чтобы заменить вышедший из строя модуль, достаточно заказать модуль с такими же настройками. Настройки соответствуют части заказного номера, которая указывается после косой черты. Так, например, модуль 750-653 доступен в следующих вариантах:
Заказной номер |
Интерфейс |
Скорость |
Проверка четности |
Кол-во битов данных |
Кол-во стоповых битов |
Количество байтов в образе процесса |
750-653 |
RS-485 |
9600 |
Нет |
8 |
1 |
3 |
750-653/000-001 |
RS-485 |
9600 |
Четн. |
7 |
2 |
3 |
750-653/000-002 |
RS-485 |
9600 |
Четн. |
8 |
1 |
3 |
750-653/000-006 |
RS-485 |
19200 |
Нет |
8 |
1 |
5 |
750-653/000-007 |
RS-485 |
2400 |
Нет |
8 |
1 |
3 |
750-653/003-000 |
Конфигурируемый |
750-653/025-000 |
Конфигурируемый, с расширенным температурным диапазоном (-20..+60°C) |
Если попробовать запустить приведенную на рисунке 1 программу с модулем 750-653 с «жестко» заданными настройками на двухпроводной линии RS-485, мы увидим, что блок MODBUS_MASTER_RTU выдает ошибку контрольной суммы. Почему так происходит?
Дело в том, что при полудуплексном режиме обмена и прием, и передача осуществляется по одной и той же паре проводов, к которой подключается и приемник, и передатчик. Узел RS-485 при передаче сообщения должен отключать приемник, иначе он примет «эхо» - тот же сигнал, что он сам и передал. Поэтому модуль RS-485 имеет специальную настройку для работы с полудуплексной линией связи. Эту настройку можно задать с помощью программы WAGO-I/O-CHECK.
Иллюстрация 2: Настройка модуля последовательного интерфейса в WAGO-I/O-CHECK
Для работы с двухпроводной линией нужно задать параметру Duplex Mode значение Halfduplex (полудуплекс). Однако, как вы догадываетесь, это можно сделать только для настраиваемых модулей. Что же делать, если у нас обычный 750-653 с «жестко» заданными параметрами?
На самом деле, возможностью настройки параметров обладают все коммуникационные модули. Ограничения для модулей с «жесткой» конфигурацией сделаны на программном уровне. Так, программа WAGO-I/O-CHECK проверяет тип модуля в контроллере, и, обнаружив модуль с «жесткой» конфигурацией, запрещает вызывать диалог настройки параметров. К счастью, есть способ обмануть эту программу.
WAGO-I/O-CHECK хранит информацию о всех возможных модулях в настроечных файлах. Эти файлы находятся в папке %InstallPath%\Config\Terminal, где %InstallPath% - каталог, в который установлена программа. Например, у меня на компьютере это C:\Program Files (x86)\WAGO Software\WAGO-IO-Check 3\Config\Terminal. Рассмотрим содержимое настроечного файла 07500653_00030000.wdd для конфигурируемого модуля 750-653/003-000:
---------------------------------------------------------- File : 07500653_00030000.wdd Module: 0750-0653/0003-0000 Date : 2007-08-03 ---------------------------------------------------------- [Common] Article-NO = 0750-0653/0003-0000 Article-ID = 50054539 DescriptionDE = RS485 Interface (Adjustable) DescriptionEN = RS485 Interface (Adjustable) DescriptionFR = RS485 Interface (Adjustable) ModuleType = 13 ModuleIcon = 13 Adjustable = 1 Consumption = 50 Voltage = 0 LK1 = 0 LK2 = 0 PE = 0
[LED] LEDMAX = 4 LEDROWS = 2 LEDCOLS = 2
LED_00 = 1, 0, -1 LED_01 = 0, 0, -1 LED_02 = 1, 0, -1 LED_03 = 1, 0, -1
[Default] R32 = 0x0006 ; Baudrate R33 = 0x0003 ; Datenrahmen R34 = 0x0002 ; Feature-Register R35 = 0x0003 ; Datenbytes
Нас интересуют выделенные желтым цветом параметры. Очевидно, что параметр Adjustable как раз и определяет возможность настройки модуля. В секции [Default] указано содержимое регистров модуля по умолчанию. Сравним с конфигурационным файлом для обычного модуля:
---------------------------------------------------------- File : 07500653.wdd Module: 0750-0653 Date : 2007-08-03 ---------------------------------------------------------- [Common] Article-NO = 0750-0653 Article-ID = 07500653 DescriptionDE = RS485 Interface DescriptionEN = RS485 Interface DescriptionFR = RS485 Interface ModuleType = 13 ModuleIcon = 13 Consumption = 50 Voltage = 0 LK1 = 0 LK2 = 0 PE = 0
[LED] LEDMAX = 4 LEDROWS = 2 LEDCOLS = 2
LED_00 = 1, 0, -1 LED_01 = 0, 0, -1 LED_02 = 1, 0, -1 LED_03 = 1, 0, -1
Как видим, таких же строк, как у настраиваемого модуля, и которые мы обозначили желтым цветом, в этом файле нет. Что если скопировать их сюда с помощью текстового редактора (например, Notepad)? Попробуем это сделать и убедимся: теперь окошко конфигурации стало доступным и для этого модуля!
Небольшой момент, возникающий при использовании Windows 7: система не позволяет сохранить отредактированный файл в каталог, где он должен храниться. Нужно сначала скопировать его в другое место (например, на рабочий стол), отредактировать, а затем переместить обратно.
Как быть, если мы хотим указывать параметры обмена в нашей программе, а не настраивать их предварительно в WAGO-I/O-CHECK? К сожалению, определение типа модуля встроено в программное обеспечение и библиотеки контроллера. Поэтому задать новые параметры так же, как для настраиваемых модулей, не получится. Необходимо использовать WAGO-I/O-CHECK, а соответствующие входы блока просто оставить неприсоединенными, или же задать им значения по умолчанию:
VAR MASTER: MODBUS_MASTER_RTU; COM_PORT: BYTE := 2; COM_BAUDRATE: COM_BAUDRATE := BAUDRATE_TERMINAL_DEFAULT; COM_PARITY: COM_PARITY := PARITY_TERMINAL_DEFAULT; COM_STOPBITS: COM_STOPBITS := STOPBITS_TERMINAL_DEFAULT; COM_BYTESIZE: COM_BYTESIZE := BYTESIZE_TERMINAL_DEFAULT; COM_FLOW_CONTROL: COM_FLOW_CONTROL := FLOW_CONTROL_TERMINAL_DEFAULT; ...
Есть и еще одна причина, по которой мы не сможем обойтись без WAGO-I/O-CHECK. Дело в том, что только с её помощью можно изменить значение параметра Continuous Send (см. рисунок 2). Если этот параметр имеет значение «ON», байты для передачи по последовательному интерфейсу берутся из внутреннего буфера модуля, имеющего размер 16 байт. Если же эту настройку отключить, то данные для передачи берутся напрямую из образа процесса, в котором для этого отводится от 3 до 5 байт, в зависимости от настроек модуля (по умолчанию 3 байта). Один байт соответствует 10 битам (стартовый + 8 битов данных + 1 стоповый). Получается, что при скорости обмена 9600 бит/с нам нужно передавать в модуль 960 байт в секунду, а для этого циклы сканирования нашей программы, включая обмен по внутренней шине контроллера, должны выполняться не реже чем 320 раз в секунду. То есть, все вместе должно занимать не более чем 3,125 миллисекунд. К сожалению, так бывает только в самых идеальных случаях. На практике же данные в модуль передаются реже, что приводит к задержкам между передачей отдельных байтов по последовательному интерфейсу. Если такая задержка превысит определенную величину, это будет рассматриваться удаленным устройством Modbus как ошибка. Согласно протоколу обмена Modbus, на ошибочные запросы ведомые устройства не отвечают. В итоге мы получим тайм-аут при приеме ответа от устройства.
Как вы уже, наверно, догадались, по умолчанию параметр Continuous Send в модулях отключен! А включить его можно только с помощью WAGO-I/O-CHECK. После изменения этой настройки, новое значение будет сохранено в энергонезависимой памяти модуля ввода-вывода.
Для того, чтобы протестировать работу с протоколом Modbus, я написал очень простой примерчик. Собственно, вся программа уместилась на рисунке 1. Для управления программой используется встроенная визуализация CoDeSys. Чтобы протестировать обмен, нужно загрузить в контроллер прилагаемый файл и открыть окно визуализации.
Иллюстрация 3: Работа с примером программы
Настроив параметры в верхней части экрана визуализации (номер порта и настройки обмена), запустите программу на выполнение. Затем задайте значения, необходимые для запроса к устройству: адрес устройства (Slave address), код функции (Function), а также адрес регистра для данной функции (Register address) и количество регистров (Quantity), если эти параметры требуются для данной функции. Код функции может быть следующим:
- 0x01 Read Coil Status — читать значения дискретных выходов или битов в памяти
- 0x02 Read Input Status — читать значения дискретных входов
- 0x03 Read Holding Register — читать значения аналоговых выходов или регистров в памяти
- 0x04 Read Input Registers — читать значения аналоговых входов
- 0x05 Force Single Coil — установить значение дискретного выхода или бита в памяти
- 0x06 Preset Single Registers — установить значение аналогового выхода или регистра в памяти
- 0x0B Fetch Comm Event Ctr — получить значение счетчика событий
- 0x0F Force Multiple Coils — установить значения нескольких дискретных выходов или битов в памяти
- 0x10 Preset Multiple Registers — установить значение нескольких аналоговых выходов или регистров в памяти
В табличке DATA нужно задать данные, если они требуются для данной функции, и затем нажать кнопку SEND. После этого, при получении ответа от ведомого устройства, его поля будут показаны в правой части экрана. Если же произойдет коммуникационная ошибка, она отобразится в нижней части.
|