2. Начало работы
Чтобы начать работу со средой разработки CODESYS, необходимо скачать и установить среду разработки CODESYS V3.5 SP16 Patch 4, а также установить таргет-файл RealLab с шаблонами модулей ввода и вывода и библиотеками для взаимодействия с ними. Последнюю версию таргет-файла можно загрузить с нашего сайта. Установите загруженный пакет, создайте проект и подключитесь к ПЛК. На данном этапе все подготовлено для начала разработки в CODESYS 3.5. Все инструкции по установке и настройке CODESYS находятся в разделе 3 данного документа.
2.1. Установка среды разработки CODESYS 3.5
2.1.1. Системные требования
Для корректной работы среды разработки CODESYS 3.5 требуется:
- операционная система Windows 7 или выше;
- 4 Гб оперативной памяти;
- 3 Гб свободного места на HDD;
- процессор: Pentium V, Centrino > 3,0 GHz, Pentium M > 1,5GHz.
Для установки среды разработки CODESYS V3.5 SP16 Patch 4, скачайте установщик с нашего сайта и запустите его. В процессе установки CODESYS V3.5 предоставляется возможность выбора основных компонентов для установки. Рекомендуется установить все доступные компоненты.
Установка CODESYS 3.5
2.2. Установка таргет-файла RealLab
Для упрощенной работы с ПЛК и модулями ввода и вывода RealLab! имеются таргет-файл с шаблонами, облегчающие процесс их добавления и настройки в среде CODESYS 3.5.
Все дополнительные компоненты устанавливаются отдельно. Скачайте с нашего сайта или с сайта CODESYS необходимые пакеты установки и запустите CODESYS.
Если вы используете версию CODESYS 3.5.16.40 – из верхнего меню выберите “Инструменты – Менеджер пакетов”.
Пример выбора пакета в CODESYS 3.5.16.40
Откроется окно менеджера пакетов. Нажмите “Установить”, выберите нужный package-файл и следуйте инструкциям установщика.
Начало установки пакета шаблонов модулей
Если вы используете версию CODESYS 3.5.17.0 и выше, в верхнем меню выберите “Инструменты – CODESYS Installer”. Откроется окно со списком компонентов, установленных в CODESYS этой версии.
CODESYS Installer
Нажмите Install и выберите ваш пакет в формате “.package” для установки. Закройте все окна среды разработки CODESYS, кроме CODESYS Installer. Следуйте инструкциям установщика. По окончании процесса откройте CODESYS и проверьте работоспособность установленных пакетов. После установки пакета с шаблонами, таргет-файлами и библиотеками, при создании проекта можно выбрать ПЛК из списка:
Выбор ПЛК из списка
Выбрать наш модуль и добавить его в проект можно из меню выбора ведомого устройства (сначала добавьте в проект Master-устройство, а к нему можно добавить Slave).
Добавление модулей в проект
Для установки библиотек из верхнего меню CODESYS выберите “Инструменты – Репозиторий библиотек”. Откроется окно репозитория библиотек. Чтобы установить необходимую библиотеку в формате “.library” или “.compiled-library” нажмите “Установить”, выберите библиотеку, которую необходимо установить и следуйте инструкциям установщика. Для удаления/экспортирования библиотек используйте соответствующие кнопки.
Репозиторий библиотек.
Для установки таргет-файла какого-либо устройства, из верхнего меню выберите “Инструменты – Репозиторий устройств”. Откроется окно репозитория устройств. Нажмите “Установить”, выберите таргет-файл для установки и следуйте инструкциям установщика.
Репозиторий устройств
2.3. Первый запуск CODESYS
2.3.1. Создание проекта
Запустите среду разработки CODESYS. Для создания нового проекта, кликните на “Новый проект…”. Укажите расположение проекта и его имя, нажмите “ОК”.
Создание проекта
В следующем окне выберите устройство и язык, на котором будет разрабатываться программа.
Выбор устройства и языка программирования
2.3.2. Менеджер библиотек
Если в проекте сразу появились ошибки библиотек – перейдите в “Менеджер библиотек” (в дереве устройств кликните по нему дважды) и нажмите “Download Missing Libraries”.
Загрузка недостающих библиотек
Если Вы используете ПЛК NLScon-RSB с доступом к GPIO, в “Менеджер библиотек – Placeholders” установите версию библиотеки Raspberry Pi Peripherals 4.0.0.0.
Изменение версии библиотеки в Placeholders
2.3.3. Добавление устройств
Чтобы добавить устройство (например, модуль Modbus RTU), щелкните правой кнопкой мыши по названию устройства в дереве устройств – “Добавить устройство”. Выберите из перечня необходимое устройство и добавьте его в проект.
Дважды кликните по устройству, чтобы добавить
Чтобы открыть параметры добавленного устройства, дважды кликните по нему в дереве устройств.
Кроме устройств можно добавлять различные объекты (например, менеджер визуализации, POU и т.д.). Для этого кликните правой кнопкой мыши по “Application” в дереве устройств и выберите “Добавление объекта”.
2.3.4. Редактор кода
Код пишется в созданном по умолчанию файле “PLC_PRG”. Кликните по нему дважды в дереве устройств, чтобы изменить его. Редактор кода состоит из двух частей. В верхней части переменные объявляются, а в нижней – пишется код, который циклически выполняется на ПЛК.
Редактор кода
Чтобы создать новый файл для написания кода, кликните правой кнопкой по “Application – Добавление объекта” в дереве устройств и выберите POU.
2.3.5. Создание визуализации в CODESYS
Запустите среду разработки CODESYS. Создайте стандартный проект или откройте существующий и кликните правой кнопкой мыши по “Application” в дереве устройств. Выберите “Добавление объекта – Визуализация”.
Добавление визуализации в проект
Появится окно с просьбой ввести имя визуализации – по умолчанию в строку имени записывается “Visualization”. В дереве устройств появится сама визуализация и менеджер визуализаций, где можно настроить параметры визуализации: стиль визуализации, использование переменных Unicode, параметры шрифта, объем памяти для визуализации и т. д.. В дереве устройств у элемента “Менеджер визуализации” есть подпункт “Web-визуализация” и “таргет-визуализация”. Там можно выбрать стартовую визуализацию, если их несколько, а также настроить масштабирование визуализации, частоту обновления и ее размер. Веб-визуализация транслируется по IP-адресу, ее можно открыть в браузере. Таргет-визуализация отображается на весь экран в отдельном окне ПЛК.
Параметры Web-визуализации
Элементы добавляются на экран визуализации перетаскиванием из панели инструментов визуализации, где можно выбрать категорию элементов.
Пример визуализации
Свойства элементов можно настраивать – нажмите левой кнопкой мыши на элемент, который нужно настроить. Пример: на экране визуализации нажимаю на один из переключателей левой кнопкой мыши – с правой части экрана панель инструментов визуализации заменяется на вкладку свойств выбранного объекта. В зависимости от выбранного элемента настраиваются разные свойства. Для переключателя это размеры, переменная, которая меняет значение при его переключении и цвет.
Элемент-переключатель
2.4. Подключение к ПЛК в среде CODESYS
2.4.1. Настройка связи между контроллером и ПК
По умолчанию сетевые настройки интерфейсов Ethernet-контроллеров RealLab – динамические.
Варианты взаимного сетевого расположения контроллера и компьютера:
- Контроллер и компьютер находятся в одной локальной сети.
- Контроллер и компьютер находятся в разных локальных сетях, связанных с помощью соответствующих сетевых устройств (маршрутизаторов).
- Контроллер и компьютер соединены напрямую с помощью кабеля RJ45-RJ45.
В локальных сетях не должно возникать конфликта IP-адресов, т. е. разные устройства не должны обладать совпадающими адресами.
После настройки сетевых параметров контроллера и компьютера следует установить связь между ними в среде CODESYS.
Компонент Device (который определяется соответствующим таргет-файлом) должен соответствовать модели контроллера. В случае необходимости тип устройства можно изменить, выбрав в дереве проекта компонент Device (всегда находится в верхней части дерева), и, нажав на него ПКМ, открыть окно “Обновить устройство”:
Дважды кликните на ПЛК в дереве устройств – откроются “Установки соединения”. Нажмите “Сканировать сеть” и дважды кликните по названию устройства, к которому нужно подключиться.
Подключение к ПЛК
В случае успешной установки связи индикаторы шлюза и контроллера загорятся зеленым.
Для загрузки проекта в ПЛК нажмите значок: .
2.5. Разработка компонентов CODESYS на ПЛК RealLab
Компонент CmpPowerFail контролирует состояние GPIO и по его изменению останавливает МЭК-программу и сохраняет retain-переменные в файл.
Компонент CmpRunStopCtl контролирует состояние переключателя Run-Stop (GPIO) и по его изменению останавливает/запускает МЭК-программу.
2.5.1. Связь компонентов с физической составляющей ПЛК RealLab
- Переключатель Run-Stop, останавливает/запускает МЭК программу.
- При запуске МЭК программы светодиод горит зленым цветом и при остановке светодиод горит красным цветом.
- При запуске ПЛК МЭК-программа проверяет состояние переключателя. Если переключатель в положении Stop, то МЭК-программа останавливается, а если в переключатель в положении Run, то запускается.
- При отключения основного питания ПЛК, ПЛК продолжает работать с аккумулятором X секунд, если в Х секунд возвращается основного питания, то ПЛК продолжается работать в штатном режиме, иначе сохраняет retain-переменные и отправляет команду выключения ПЛК.
- При заводском сбросе устройства через среду разработку, среда исполнения переходит в состояние остановки и на ПЛК загорается красный светодиод, пока не загрузим проект в ПЛК через среду разработки.
Вид на лицевую панель ПЛК NLScon-RSB-L-RS
|
Вид на лицевую панель ПЛК NLScon-A40-L-RS
|
3. Основные функции программирования
3.1. Обмен данными по протоколу CANOpen
Создайте стандартный проект в среде разработки CODESYS и добавьте в него ПЛК RealLab. В дереве устройств кликните правой кнопкой мыши на устройства и добавьте устройство CANbus.
Добавление CANbus
Во вкладке CANbus “Общее” укажите номер CAN-порта и скорость передачи (Кбит/с). После CANbus добавьте компонент CANopen Manager.
Настройки компонента CANopen Manager оставьте по умолчанию. После СANopen Manager добавьте необходимое slave-устройство. Например, NLS-16DO-CAN.
В настройках slave-устройства на вкладке “Общее” укажите ID узла. Поставьте галочку на “Экспертные установки”, чтобы получить доступ к дополнительным параметрам. Если обмен данными не происходит, установите галочку “Опц. устройство”.
Настройки устройства CAN
3.2. Настройка ПЛК в режиме CANOpen Slave
Запустите CODESYS, создайте стандартный проект. В дереве устройств кликните правой кнопкой мыши на ПЛК и добавьте устройство CANbus. К CANbus добавьте устройство CANopen_Device.
Добавление устройства в проект
Во вкладке CANbus – “Общее” – укажите номер используемой CAN-сети и скорость передачи (Кбит/с).
Параметры CANbus
Откройте общие параметры CANopen_Device и настройте область I/O, а также область SDO, если это необходимо. Если планируется использовать несколько ведомых CAN-устройств, ID их узлов не должны совпадать. Значение профиля устройства – 401.
Настройка I/O заключается в создании объектов для обмена данными. Возможно создать области, которые отвечают за передачу или принятие данных.
Настройка параметров CANOpen Device
По окончании настройки нажмите “установить в репозиторий устройств”, чтобы была возможность быстро добавить устройство с такими параметрами в проект. Во вкладке соотнесения входов/выходов при необходимости настройте соотнесение переменных.
Подключитесь к ПЛК и загрузите проект в память устройства. Результат: ПЛК выполняет роль ведомого устройства по протоколу CANOpen.
Схема подключения ПЛК
Чтобы организовать обмен данными с ведомым ПЛК, создайте новый проект CODESYS, подключитесь к ПЛК, который является ведущим по отношению к ведомому. Добавьте в дерево устройств CANbus, CANOpen Manager. К CANOpen Manager добавьте ведомое устройство, которое вы добавляли в репозиторий в прошлом проекте. Установите параметры скорости и номера сети, а также ID узла ведомого устройства, как в проекте, который относится к ведомому устройству. Загрузите проект в память ПЛК и запустите его. На рисунке представлена работа созданного проекта:
Работа проекта
3.3. Настройка ПЛК в режиме Modbus RTU Master
В дереве устройств выбрать Device (CODESYS Control NIL AP) и добавить устройство Modbus COM.
Во вкладке “Общее” Modbus COM необходимо указать номер COM-порта, используемого ПЛК, скорость передачи (по умолчанию 9600 бод), а также четность – NONE. Все остальные настройки без изменений.
После Modbus COM следует добавить Modbus Master. Во вкладке “Общее” Modbus Master COM Port – установить галочку “Автоперезапуск соединения”.
После Modbus Master следует добавить Modbus Slave COM Port. Во вкладке Общее Modbus Slave COM Port установить адрес Slave-устройства. Также можно указать индивидуальный Таймаут-ответа и ID устройства.
Добавление Modbus Slave COM Port
Во вкладке Канал Modbus Slave COM Port необходимо установить параметры опрашиваемого Slave-устройства (Тип доступа, Сдвиг регистра, Длина регистра).
Параметры канала Modbus Slave COM Port
В настройках каждого Modbus Slave на вкладке ModbusGenericSerialSlave “Соотнесение входов/выходов” для необходимых каналов задать с помощью Ассистента ввода переменные, которые должны использоваться в коде прикладной программы, а также установить параметр “всегда обновлять переменные” (установить Вкл.2).
Создание переменной для Slave-устройства
Соотнесение каналов и переменных Slave-устройства.
В результате запуска ПЛК в режиме Modbus RTU Master созданные компоненты в дереве устройств будут отображаться зеленой пиктограммой.
3.4. Настройка ПЛК в режиме Modbus RTU Slave
В дереве устройств выбрать Device (CODESYS Control NIL AP) и добавить устройство Modbus COM. Укажите номер COM-порта и установите необходимые Вам параметры.
После Modbus COM следует добавить Modbus Serial Device. Во вкладке Modbus Serial Device установить ID-адрес, который будет назначен данному COM-порту ПЛК, а также количество Регистров хранения (Holding registers 2–500) и Входных регистров. Регистры хранения (Holding registers) – Тип доступа: чтение/запись. Входные регистры (Inputs registers) – Тип доступа: только чтение.
Настройки Modbus Serial Device
В настройках на вкладке Modbus Serial Device Соотнесение входов /выходов для необходимых каналов задать с помощью Ассистента ввода переменные, которые должны использоваться в коде прикладной программы, а также установить параметр “Всегда обновлять переменные” (установить Вкл.2).
Создание переменных для Slave-устройства
В результате запуска ПЛК в режиме Modbus RTU Slave созданные компоненты в дереве устройств будут отображаться зеленой пиктограммой.
3.5. Настройка ПЛК в режиме Modbus TCP Master
В дереве устройств выбрать Device (CODESYS Control NIL AP) и добавить устройство Ethernet.
Установить соединение с ПЛК в устройстве Device чтобы узнать IP-адрес. Во вкладке “Конфигурация ethernet-устройства” – Ethernet выбрать интерфейс текущего ПЛК.
Настройки Ethernet
После Ethernet следует добавить Modbus TCP Master. Во вкладке “Общее” Modbus TCP Master установить галочку “Автоподключение”.
После Modbus TCP Master добавьте Modbus TCP Slave. Во вкладке Общее Modbus TCP Slave установите адрес TCP Slave-устройства.
Во вкладке Канал Modbus TCP Slave необходимо установить параметры опрашиваемого Slave-устройства (Тип доступа, Сдвиг регистра, Длина регистра).
В настройках каждого Modbus TCP Slave на вкладке “ModbusGenericSerialSlave Соотнесение входов/выходов” для необходимых каналов задать с помощью Ассистента ввода переменные, которые должны использоваться в коде прикладной программы, а также установить параметр “Всегда обновлять переменные” (установить Вкл.2).
Созданная переменной
Соотнесение входов/выходов
В результате запуска ПЛК в режиме Modbus TCP Master созданные компоненты в дереве устройств будут отображаться зеленой пиктограммой.
3.6. Настройка ПЛК в режиме Modbus TCP Slave
В дереве устройств выбрать Device (CODESYS Control NIL AP) и добавить устройство Ethernet.
Установить соединение с ПЛК в устройстве Device чтобы узнать IP-адрес. Во вкладке “Конфигурация ethernet” устройства Ethernet выбрать интерфейс текущего ПЛК.
Выбор интерфейса Ethernet
После Ethernet следует добавить Modbus TCP Slave Device. Во вкладке Modbus TCP Slave Device ID-адрес по умолчанию 255, который будет назначен данному Slave-устройству, а также количество регистров хранения (Holding registers 2-500) и Входных регистров (Inputs registers 2-500). Регистры хранения (Holding registers) – Тип доступа: чтение/запись. Входные регистры (Inputs registers) – Тип доступа: только чтение.
Настройка регистров TCP Slave
В настройках на вкладке “Modbus TCP Slave Device Соотнесение входов/выходов” для необходимых каналов задать с помощью Ассистента ввода переменные, которые должны использоваться в коде прикладной программы, а также установить параметр “Всегда обновлять переменные” (установить Вкл.2).
Создание переменных
Соотнесение переменных
В результате запуска ПЛК в режиме Modbus TCP Slave созданные компоненты в дереве устройств будут отображаться зеленой пиктограммой.
3.7. Работа с OPCUA-сервером
CODESYS OPC Server V3 – самый простой с точки зрения настройки OPC-сервер для организации обмена с контроллером, так как он интегрирован в среду разработки и позволяет автоматически импортировать переменные проекта.
Создайте стандартный проект CODESYS. Добавьте в проект Символьную конфигурацию – Нажмите правой кнопкой мыши на “Application” в дереве устройств – “Добавить” – “Символьная конфигурация”.
При добавлении компонента пользователь может выбрать следующие настройки:
- Включить комментарии в XML – если установлена галочка, то в файл символьной конфигурации будут включены комментарии к переменным;
- Поддержка функций OPC UA – если установлена галочка, то в файл символьной конфигурации добавляется дополнительная информация, необходимая для поддержки функций OPC UA сервера.
- Размещение данных клиента – пользователь может выбрать структуру файла символьной конфигурации – совместимую со старыми версиями или оптимизированную. После добавления компонента Символьная конфигурация следует выполнить компиляцию проекта.
Добавление символьной конфигурации в проект
Объявите в программе переменные.
Переменные
Отметьте галочками переменные, которые будут считываться/изменяться OPC-сервером и указать для каждой из них права доступа (со стороны OPC-сервера). После этого настройка контроллера считается завершенной.
Символьная конфигурация
3.7.1. Настройка OPC-сервера
Запустите приложение OPC Configurator из меню Пуск или папки CODESYS OPC Server V3, расположенной в директории установки CODESYS.
OPC Configurator в меню Пуск
Нажмите на узел “Server” и в контекстном меню выберите “Append PLC”. Нажмите на узел “Connection” – “Edit” для настройки IP ПЛК и его порта.
Настройка IP-адреса и порта ПЛК
3.7.2. Создание сертификата для сервера CODESYS OPC UA
Для шифрования данных и безопасного обмена ими с клиентом серверу необходим сертификат, который клиент должен классифицировать как доверенный при первом установлении соединения.
Требование: Задан активный путь к контроллеру.
- Установите дополнение CODESYS Security Agent.
- Щелкните Вид ‣ Экран безопасности.
- Выберите вкладку «Устройства».
- Выберите контроллер в левом представлении.
⇒ В правом представлении отображаются все службы контроллера, для которых требуется сертификат.
- Выберите службу сервера OPC UA.
- Создайте новый сертификат для устройства. Для этого щелкните значок.
⇒ Откроется диалоговое окно «Настройки сертификата».
- Определите параметры сертификата и нажмите OK, чтобы закрыть диалоговое окно.
⇒ Сертификат создан на контроллере (на рисунке).
- Перезапустите систему выполнения.
Сертификат создан
3.7.3. Настройка зашифрованного соединения с клиентом UaExpert
Клиент OPC UA «UaExpert» представляет собой свободное доступное ПО, которое можно загрузить из Интернета. Этот клиент можно использовать для подключения к серверу CODESYS OPC UA. Следующее описание относится к этой программе. Другие клиенты OPC UA работают аналогичным образом.
- Запустите программу UaExpert.
- Щелкните Сервер «Добавить» и откроется диалоговое окно «Добавить сервер».
- Разверните Локальный ‣ OPUAServer@… в древовидном представлении.
- Выберите тип подключения Basic256Sha256 — Sign & Encrypt (uatcp-uasc-uabinary) и нажмите «OK», чтобы закрыть диалоговое окно.
Выбор типа подключения
- Щелкните Сервер «Подключить» и откроется диалоговое окно проверки сертификата с сообщением об ошибке.
- Выберите параметр «Временно принять сертификат сервера для этого сеанса» и нажмите «Продолжить».
- В среде разработки CODESYS щелкните символ и изображение обновится.
- Выберите папку «Сертификаты на карантине». Сертификат клиента UaExpert@… отображается справа.
Сертификаты на карантине
- Перетащите сертификат в папку «Доверенные сертификаты». Теперь сертификат клиента классифицируется сервером как доверенный.
- Щелкните Сервер «Подключить в клиенте UaExpert». Откроется диалоговое окно проверки сертификата с сообщением об ошибке.
- Выберите параметр «Временно принять сертификат сервера для этого сеанса» и нажмите «Продолжить». Соединение установлено, и объекты отображаются в представлении «Адресное пространство».
3.7.4. Использование клиента OPC UA Server для изменения переменной
- Разверните объект Objects ‣ DeviceSet ‣ CODESYS OPC UA ‣ Application ‣ Global Vars ‣ GVL в клиенте UaExpert представления Address Space. Переменные списка глобальных переменных видны.
- Выберите переменные и перетащите их в представление доступа к данным. Отображаются переменные и их текущие значения.
Переменные в UaExpert
- Измените значения переменных, дважды щелкнув поле «Значение».
3.8. Терминальные команды
Чтобы разрешить выполнение терминальных команд из среды исполнения CODESYS, требуется внести изменения в файл /usr/bin/CODESYS/CODESYSControl.cfg, а именно добавить в конец файла перечень необходимых команд в следующем формате:
[SysProcess]
Command.0=ls
Command.1=blkid
…
Command.Х=…
Здесь X – это номер последней указанной команды. Количество X команд не ограничено. Если требуется разрешить выполнение любых команд, отсылаемых из исполнительной системы CODESYS, то в файл CODESYSControl.cfg нужно внести следующий текст:
[SysProcess]
Command=AllowAll
Однако стоит помнить, что в этом случае в терминал ПЛК будут направлены любые команды, формируемые в проекте CODESYS.
Внести изменения в конфигурационном файле CODESYSControl.cfg можно через командую строку и удаленно подключение по SSH с использованием программы Bitvise Client / PuTTY или RealVNC.
После внесения изменений в файл CODESYSControl.cfg из среды исполнения CODESYS станет возможно отправлять терминальные команды. В проекте для этого используется функция SysProcessExecuteCommand2 библиотеки SysProcess Implementation2, позволяющая выполнить указанную в ее параметрах команду и записать текстовый вывод (результат) этой команды. В данном примере в функции Run_Command() выполняется терминальная команда blkid , используемая для получения информации об идентификаторах блочных устройств. После выполнения текстовый вывод данной команды возвращается функцией Run_Command. В качестве примера в функции Run_Command() по результату выполнения blkid определяется UUID блочного устройства: test_string:= MID (Command_Output, 16, FIND (Command_Output, 'UUID'));
Результат выполнения терминальной команды blkid для ПЛК NLScon-RSB
3.9. Сетевые переменные
Сетевые переменные позволяют достаточно просто организовать обмен данными между несколькими ПЛК, поддерживающими программирование в CODESYS, по протоколу UDP с использованием сети Ethernet. Все ПЛК в этом случае должны находиться в одной локальной сети.
Для организации обмена сетевыми переменными требуется в одном проекте CODESYS разработать программы для всех ПЛК, участвующих в обмене. Загружать разработанные программы в нужные ПЛК можно также из одного проекта.
Конфигурация дерева устройств
Далее для каждого ПЛК потребуется добавить Списки сетевых переменных (Network Variable List), сначала список отправителя (Sender), затем список получателя (Receiver).
Добавление списков сетевых переменных
При добавлении списка отправителя (Sender) появятся окна для настройки параметров списка. Настраиваемыми являются следующие параметры: имя списка (Name), тип сети (Network Type), идентификатор списка (List identifier), а также по нажатию кнопки Settings – порт ПЛК (Port) и адрес широковещательной рассылки (Broadcast adr). Подробную информацию о настройках списка отправителя можно найти на сайте CODESYS Online Help.
В данном примере спискам присвоены имена Sender1 (для Device1) и Sender2 (для Device2), тип сети — UDP, порт ПЛК — 1202 (по умолчанию). Маска для широковещательной рассылки — 192.168.0.255; данный адрес позволит контроллерам рассылать UDP-пакеты данных любым устройствам в сети с IP-адресом 192.168.0.х.
Идентификатор списка не должен повторяться внутри одного проекта, поэтому для Sender1 задан List identifier=1, для Sender2 задан List identifier=2.
Настройка списка Sender1 сетевых переменных для отправителя
Далее оба списка отправителей можно наполнить переменными. Как видно, в проекте сетевые переменные являются глобальными переменными. Теперь устройство Device1 может отправлять переменные из списка Sender1, а устройство Device2 – из списка Sender2.
Переменные списков Sender 1 и Sender 2
Для того чтобы устройства в сети могли обмениваться переменными из списков-отправителей, требуется добавить также списки-получатели. Далее приведен пример настройки имени и выбора списка отправителя при создании Network Variable List (Receiver) для одного из устройств.
Настройка списка-получателя сетевых переменных
После добавления в проект двух списков получателей NVL_getFrom_Sender2 (для Device1) и NVL_getFrom_Sender1 (для Device2) в них автоматически подтягиваются списки переменных из «своих» отправителей.
Списки-получатели сетевых переменных
Для проверки обмена требуется загрузить приложения в оба контроллера и в режиме онлайн наблюдать передачу переменных.
Обмен сетевыми переменными
Нужно отметить, что одно устройство (Device) может содержать несколько списков-получателей и списков-отправителей. При этом идентификаторы списков-отправителей переменных должны быть уникальными во избежание нарушений работоспособности. Максимальный размер сетевой переменной - 255 байт. Можно использовать неограниченное число сетевых переменных.
3.10. Менеджер задач (CmpIecTask)
Функции библиотеки CmpIecTask позволяют получить доступ к описанию МЭК-задач, выполняемых в ПЛК.
Для демонстрации возможностей библиотеки CmpIecTask в проекте на ПЛК выполняются две задачи MainTask и Task2 с приоритетом 1 и 5 соответственно.
Конфигурация дерева устройств
Для получения описания МЭК-задачи с помощью функций CmpIecTask требуется сначала получить обработчик этой задачи. Это можно сделать с помощью одной из следующих функций (см. табл. 1 – табл. 3):
- IecTaskGetFirst
- IecTaskGetNext
- IecTaskGetCurrent
IecTaskGetFirst – функция, возвращающая обработчик МЭК-задачи с приоритетом 1.
Табл. 1. Функция IecTaskGetFirst
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Input
|
pszAppName
|
POINTER TO STRING
|
Указатель на строку, содержащую название приложения ПЛК
|
pResult
|
POINTER TO RTS_IEC_RESULT
|
Указатель на тип RTS_IEC_RESULT, содержащий код ошибки как результат выполнения операции
|
Output
|
IecTaskGetFirst
|
RTS_IEC_HANDLE
|
Обработчик МЭК-задачи с приоритетом 1
|
IecTaskGetNext – функция, возвращающая обработчик МЭК-задачи с приоритетом более низким, чем приоритет задачи hPrevIecTask.
Табл. 2. Функция IecTaskGetNext
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Input
|
pszAppName
|
POINTER TO STRING
|
Указатель на строку, содержащую название приложения ПЛК
|
hPrevIecTask
|
RTS_IEC_HANDLE
|
Обработчик предыдущей МЭК-задачи (с более высоким приоритетом)
|
pResult
|
POINTER TO RTS_IEC_RESULT
|
Указатель на тип RTS_IEC_RESULT, содержащий код ошибки как результат выполнения операции
|
Output
|
IecTaskGetNext
|
RTS_IEC_HANDLE
|
Обработчик следующей по приоритету МЭК-задачи
|
IecTaskGetCurrent – функция, возвращающая обработчик текущей МЭК-задачи (из которой вызывается эта функция).
Табл. 3. Функция IecTaskGetCurrent
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Input
|
pResult
|
POINTER TO RTS_IEC_RESULT
|
Указатель на тип RTS_IEC_RESULT, содержащий код ошибки как результат выполнения операции
|
Output
|
IecTaskGetCurrent
|
RTS_IEC_HANDLE
|
Обработчик текущей МЭК-задачи
|
Использование любой из перечисленных функций предполагает создание объекта типа RTS_IEC_HANDLE и запись в него возвращаемого функцией значения. Для получения описания МЭК-задачи можно теперь использовать следующие функции (см. табл. 4 – табл. 5):
- IecTaskGetDesc
- IecTaskGetInfo3
IecTaskGetDesc – функция позволяет получить информацию о выбранной задаче в формате структуры Task_Desc2 (библиотека CmpIecTask).
Табл. 4. Функция IecTaskGetDesc
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Input
|
hIecTask
|
RTS_IEC_HANDLE
|
Обработчик МЭК-задачи, описание которой нужно получить
|
Output
|
IecTaskGetDesc
|
POINTER TO Task_Desc2
|
Указатель на структуру с описанием задачи
|
IecTaskGetInfo3 – функция позволяет получить информацию о выбранной задаче в формате структуры Task_Info2 (библиотека CmpIecTask).
Табл. 5. IecTaskGetInfo3
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Input
|
hIecTask
|
RTS_IEC_HANDLE
|
Обработчик МЭК-задачи, описание которой нужно получить
|
pResult
|
POINTER TO RTS_IEC_RESULT
|
Указатель на тип RTS_IEC_RESULT, содержащий код ошибки как результат выполнения операции
|
Output
|
IecTaskGetInfo3
|
POINTER TO Task_Info2
|
Указатель на структуру с описанием задачи
|
Структура Task_Info2 содержит поля, часть которых отображается на вкладке Monitor элемента Task Configuration дерева устройств.
Структура Task_Desc2 содержит в своем составе структуру Task_Info2, а также указатель на приложение, в котором вызывается данная задача, и некоторые другие поля с информацией.
3.11. Пример использования библиотеки CAA SerialCOM
Данный пример демонстрирует использование библиотеки CAA SerialCOM для реализации обмена данными с внешним устройством через последовательный порт ПЛК NLScon-RSB. В примере рассматривается возможность отправки запроса и приема ответа от устройства. В качестве подключенного к ПЛК устройства рассматривался модуль RealLab! NLS-16DI, настроенный для работы по протоколу DCON (9600, 8N1, адрес 09h).
Для работы в проект CODESYS понадобится добавить библиотеку CAA SerialCOM. Эта библиотека реализует 4 функциональных блока (см. табл. 6 – табл. 9), выполняющих основные функции с СОМ портом: открытие, запись, чтение и закрытие.
Библиотека CAA SerialCOM
Табл. 6. Функциональный блок COM.Open
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Input
|
xExecute
|
BOOL
|
Нарастающий фронт (перевод из FALSE в TRUE): ФБ начинает выполняться.
Падающий фронт (из TRUE в FALSE): сброс выходов в 0.
|
Output
|
xDone
|
BOOL
|
TRUE: ФБ успешно завершил работу
|
xBusy
|
BOOL
|
TRUE: ФБ в состоянии выполнения
|
xError
|
BOOL
|
TRUE: Произошла ошибка, ФБ прекращает выполняться FALSE: Ошибок не произошло
|
Input
|
usiListLength
|
USINT
|
Количество вхо ных параметров в массиве pParameterList
|
pParameterList
|
CAA.PVOID
|
Указатель на массив с параметрами СОМ порта
|
Output
|
eError
|
ERROR
|
Ошибка выполнения ФБ
|
hCom
|
CAA.HANDLE
|
Возвращаемый ФБ обработчик открытого СОМ порта
|
Табл. 7. Функциональный блок COM.Write
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Input
|
xExecute
|
BOOL
|
Нарастающий фронт (перевод из FALSE в TRUE): ФБ начинает выполняться
Падающий фронт (из TRUE в FALSE): сброс выходов в 0.
|
xAbort
|
BOOL
|
TRUE: ФБ сразу прерывает работу, все его выходы устанавливаются в значения по умолчанию.
|
udiTimeOut
|
UDINT
|
Определяет время (µs), по истечении которого ФБ прерывает работу из-за таймаута с сообщением об ошибке
|
Output
|
xDone
|
BOOL
|
TRUE: ФБ успешно завершил работу
|
xBusy
|
BOOL
|
TRUE: ФБ в состоянии выполнения
|
xError
|
BOOL
|
TRUE: Произошла ошибка, ФБ прекращает выполняться FALSE: Ошибок не произошло
|
xAborted
|
BOOL
|
TRUE : Работа ФБ прервана пользователем
|
Input
|
hCom
|
CAA.HANDLE
|
Обработчик открытого СОМ порта (предварительно получен как результат выполнения COM.Open)
|
pBuffer
|
CAA.PVOID
|
Указатель на буфер данных для отправки в СОМ порт
|
szSize
|
CAA.SIZE
|
Количество байт данных, подготовленных для отправки в СОМ порт
|
Output
|
eError
|
ERROR
|
Ошибка выполнения ФБ
|
Табл. 8. Функциональный блок COM.Read
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Input
|
xExecute
|
BOOL
|
Нарастающий фронт (перевод из FALSE в TRUE): ФБ начинает выполняться
Падающий фронт (из TRUE в FALSE): сброс выходов в 0.
|
xAbort
|
BOOL
|
TRUE: ФБ сразу прерывает работу, все его выходы устанавливаются в значения по умолчанию.
|
udiTimeOut
|
UDINT
|
Определяет время (µs), по истечении которого ФБ прерывает работу из-за таймаута с сообщением об ошибке
|
Output
|
xDone
|
BOOL
|
TRUE: ФБ успешно завершил работу
|
xBusy
|
BOOL
|
TRUE: ФБ в состоянии выполнения
|
xError
|
BOOL
|
TRUE: Произошла ошибка, ФБ прекращает выполняться FALSE: Ошибок не произошло
|
xAborted
|
BOOL
|
TRUE : Работа ФБ прервана пользователем
|
Inpt
|
hCom
|
CAA.HANDLE
|
Обработчик открытого СОМ порта (предварительно получен как результат выполнения COM.Open)
|
pBuffer
|
CAA.PVOID
|
Указатель на буфер для сохранения считанных данных из СОМ порта
|
szBuffer
|
CAA.SIZE
|
Максимальный размер в байтах буфера для считываемых данных
|
Output
|
eError
|
ERROR
|
Ошибка выполнения ФБ
|
szSize
|
CAA.SIZE
|
Возвращает количество принятых в pBuffer байт данных
|
Табл. 9. Функциональный блок COM.Close
Scope
|
Name
|
Type
|
Comment
|
Input
|
xExecute
|
BOOL
|
Нарастающий фронт (перевод из FALSE в TRUE): ФБ начинает выполняться
Падающий фронт (из TRUE в FALSE): сброс выходов в 0
|
Output
|
xDone
|
BOOL
|
TRUE: ФБ успешно завершил работу
|
xBusy
|
BOOL
|
TRUE: ФБ в состоянии выполнения
|
xError
|
BOOL
|
TRUE: Произошла ошибка, ФБ прекращает выполняться FALSE: Ошибок не произошло
|
Input
|
hCom
|
CAA.HANDLE
|
Обработчик открытого СОМ порта (предварительно получен как результат выполнения COM.Open)
|
Output
|
eError
|
ERROR
|
Ошибка выполнения ФБ
|
Работу с COM портом удобнее всего описать по шагам с использованием оператора CASE:
Содержание основной программы проекта
Шаг INIT отвечает за сброс используемых функциональных блоков и обнуление вспомогательных переменных. Остальные шаги соответствуют вызываемым ФБ библиотеки CAA SerialCOM.
Перед вызовом ФБ COM.Open нужно сформировать настройки COM порта, которые затем передаются на вход ФБ, — pParameterList.
Настройка параметров COM-порта
Вызов экземпляра ФБ COM.Open. В качестве входных параметров вызова указываются настройки порта pParameterList и количество настроечных параметров usiListLength.
Вызов ФБ открытия COM-порта
Результатом является обработчик открытого порта.
Для передачи данных в открытый СОМ-порт используем экземпляр ФБ COM.Write . Предварительно потребуется сформировать буфер данных для записи. Поскольку данные в нашем примере отправляются в NLS-16DI, работающий по протоколу DCON, сформируем в символьном виде команду чтения имени модуля:
^09Mcr → 5Eh 30h 39h 4Dh 0Dh
Здесь cr - возврат каретки (ASCII код 0Dh). Пример вызова ФБ для записи в порт приведен на рисунке.
Выбор ФБ записи в COM Port
При вызове экземпляра ФБ COM.Write требуется указывать обработчик открытого COM-порта, начальный адрес буфера данных для записи и количество байт данных для записи.
Чтобы прочитать ответ модуля, нужно выполнить вызов экземпляра ФБ COM.Read, указав во входных параметрах обработчик открытого порта, начальный адрес буфера, куда будут записаны считанные данные, и максимальный размер буфера.
Вызов ФБ чтения из COM-порта
В результате работы данного ФБ в массив byReadData был записан ответ модуля, что соответствует символам !09NL16DI2cr.
Результат работы ФБ чтения
Для завершения работы с портом используем экземпляр ФБ COM.Close. При вызове потребуется указать обработчик открытого порта.
Вызов ФБ COM.Close
В проекте используется функция _BUFFER_CLEAR() библиотеки OSCAT Basic 3.31 для очистки байтового массива для хранения считанных из СОМ порта данных.
3.12. Пример использования библиотеки SysSocket
Данный пример демонстрирует использование библиотеки SysSocket для реализации TCP-сокетов на ПЛК NLScon-RSB. В примере рассматривается возможность реализации сокета клиента и сокета сервера на ПЛК NLScon-RSB для обмена данными c виртуальным ПЛК CODESYS Control Win V3 по сети Ethernet.
Для работы с сокетами понадобятся следующие библиотеки CODESYS:
Для описания совместной работы серверного и клиентского TCP-сокетов удобно использовать схему. Указанная схема предполагает закрытие клиентского сокета каждый раз после получения ответа. Такая реализация работы сокетов не является эффективной, но в нашем случае она подходит для демонстрации работы TCP-сокетов сервера и одного клиента.
Схема работы серверного и клиентского TCP-сокетов
3.12.1. Реализация TCP-сокета сервера
Работу с сокетом проще всего описать последовательностью шагов: создание сокета сервера, настройка опций, привязка к IP-адресу и порту, включение режима прослушивания, прием запроса на соединение («звонка») от клиента, обмен данными, закрытие сокета клиента, закрытие сокета сервера.
Первые несколько шагов можно объединить в блок, отвечающий за инициализацию серверного сокета. Он будет включать использование следующих функций библиотеки SysSocket (см. табл. 10 – табл. 16):
- SysSockCreate – функция создания нового сокета. Возвращает дескриптор сокета.
- SysSockIoctl – функция, контролирующая режим работы сокета.
- SysSockSetOption – настройка сокета.
- SysSockInetAddr – конвертирует IP-адрес, заданный в строковой переменной, в 4-байтовый формат.
- SysSockHtons – конвертирует номер порта, возвращая номер с сетевым порядком байтов.
- SysSockBind – функция выполняет привязку сокета к адресу и порту, которые были предварительно заданы в структуре SOCKADDRESS.
- SysSockListen – функция «включает» прослушивание входящих клиентских соединений.
Табл. 10. Функция SysSockCreate
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockCreate
|
RTS_IEC_HANDLE
|
Дескриптор нового сокета.
|
Input
|
iAddressFamily
|
INT
|
Семейство адресов сокета (SOCKET_AF_INET)
|
diType
|
DINT
|
Тип сокета (SOCKET_STREAM)
|
diProtocol
|
DINT
|
Протокол сокета (SOCKET_IPPROTO_TCP)
|
pResult
|
POINTER TO RTS_IEC_RESULT
|
Указатель на код ошибки выполнения функции (см. CmpErrors.library)
|
Табл. 11. Функция SysSockIoctl
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockIoctl
|
RTS_IEC_RESULT
|
Код ошибки выполнения функции (см. CmpErrors.library)
|
Input
|
hSocket
|
RTS_IEC_HANDLE
|
Дескриптор сокета
|
diCommand
|
DINT
|
Команда (SOCKET_FIONBIO — это команда управления блокирующим режимом*)
|
pdiParameter
|
POINTER TO DINT
|
Значение параметра команды (16#1)
|
* Блокирующий (синхронный) режим работы сокета позволяет функциям типа SysSockAccept(), SysSockSend(), SysSockRecv() и некоторым другим выполняться, не возвращая управление программному коду, пока не будет получен результат функции. Например, при случайном обрыве связи по Ethernet блокирующий режим приведет к «зависанию» программного кода на выполнении одной из перечисленных функций. Чтобы исключить такую ситуацию, сокет переводят в неблокирующий режим (как в данном примере).
Табл. 12. Функция SysSockSetOption
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockSetOption
|
RTS_IEC_RESULT
|
Код ошибки выполнения функции (см. CmpErrors.library)
|
Input
|
hSocket
|
RTS_IEC_HANDLE
|
Дескриптор сокета
|
diLevel
|
DINT
|
Уровень сокета (SOCKET_SOL)
|
diOption
|
DINT
|
Опция (SOCKET_SO_REUSEADDR*)
|
pdiOptionValue
|
POINTER TO DINT
|
Указатель на значение опции (значение 16#1)
|
diOptionLen
|
DINT
|
Длина значения в байтах
|
* SOCKET_SO_REUSEADDR – опция, отвечающая за повторное использование локального адреса, уже используемого другим открытым сокетом. Эта опция позволяет исключить появление ошибки ERR_SOCK_ADDRINUSE = 16#207.
Табл. 13. Функция SysSockInetAddr
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockInetAddr
|
RTS_IEC_RESULT
|
Код ошибки выполнения функции (см. CmpErrors.library)
|
Input
|
szIPAddress
|
REFERENCE TO STRING
|
Строковая переменная с адресом
|
pInAddr
|
POINTER TO UDINT
|
Указатель на поле структуры SOCKADDRESS.sin_addr.ulAddr
|
Табл. 14. Функция SysSockHtons
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockHtons
|
WORD
|
Результат конвертирования
|
Input
|
usHost
|
WORD
|
Значение номера порта
|
Табл. 15. Функция SysSockBind
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockBind
|
RTS_IEC_RESULT
|
Код ошибки выполнения функции (см. CmpErrors.library)
|
Input
|
hSocket
|
RTS_IEC_HANDLE
|
Дескриптор сокета
|
pSockAddr
|
POINTER TO SOCKADDRESS
|
Адрес сокета (указатель на предварительно сформированную структуру SOCKADDRESS)
|
diSockAddrSize
|
DINT
|
Размер структуры адреса сокета
|
Табл. 16. Функция SysSockListen
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockListen
|
RTS_IEC_RESULT
|
Код ошибки выполнения функции (см. CmpErrors.library)
|
Input
|
hSocket
|
RTS_IEC_HANDLE
|
Дескриптор сокета
|
diMaxConnections
|
DINT
|
Максимальное количество клиентских подключений
|
Примеры использования перечисленных функций приведены ниже.
Функции для инициализации серверного сокета
Следующий шаг алгоритма – прием запроса на соединение от клиента. На этом этапе требуется одна основная функция:
SysSockAccept – функция принимает запрос на следующее входное клиентское соединение, формируя дескриптор для нового клиентского соединения.
Табл. 17. Функция SysSockAccept
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockAccept
|
RTS_IEC_HANDLE
|
Дескриптор «принятого» клиента или значение 16#FFFFFFFF при отсутствии принятого клиентского соединения.
|
Input
|
hSocket
|
RTS_IEC_HANDLE
|
Дескриптор серверного сокета
|
|
pSockAddr
|
POINTER TO SOCKADDRESS
|
Указатель на структуру адреса подлкюченного клиента
|
pdiSockAddrSize
|
POINTER TO DINT
|
Указатель на переменную,
|
pResult
|
POINTER TO RTS_IEC_RESULT
|
Указатель на код ошибки выполнения функции (см. CmpErrors.library)
|
Если функция SysSockAccept() возвращает значение, отличное от 16#FFFFFFFF, значит клиентское соединение успешно принято для обмена данными. Тогда следует включить неблокирующий режим для этого клиента с помощью функции SysSockIoctl(), указав в ее параметрах дескриптор клиента.
Следующий шаг выполняет непосредственно обмен данными. Для этого используются функции SysSockSend() и SysSockRecv().
SysSockSend – функция отправляет данные в TCP сокет.
Табл. 18. Функция SysSockSend
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockSend
|
XINT
|
Количество переданных байт. 0 в случае ошибки передачи
|
Input
|
hSocket
|
RTS_IEC_HANDLE
|
Дескриптор клиентского сокета
|
pbyBuffer
|
POINTER TO BYTE
|
Буфер данных, подготовленных для отправки
|
diBufferSize
|
XINT
|
Максимальный размер буфера
|
diFlags
|
DINT
|
Параметр, позволяющий задать дополнительные опции для функции (SOCKET_MSG_NONE – без доп. опций)
|
pResult
|
POINTER TO RTS_IEC_RESULT
|
Указатель на код ошибки выполнения функции (см. CmpErrors.library).
|
SysSockRecv – функция принимает данные из TCP сокета:
Табл. 19. Функция SysSockRecv
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockRecv
|
XINT
|
Количество принятых байт. 0 в случае ошибки передачи
|
Input
|
hSocket
|
RTS_IEC_HANDLE
|
Дескриптор клиентского сокета
|
pbyBuffer
|
POINTER TO BYTE
|
Буфер для приема данных
|
|
diBufferSize
|
XINT
|
Максимальный размер буфера
|
diFlags
|
DINT
|
Параметр, позволяющий задать дополнительные опции для функции (SOCKET_MSG_NONE – без доп. опций)
|
pResult
|
POINTER TO RTS_IEC_RESULT
|
Указатель на код ошибки выполнения функции (см. CmpErrors.library)
|
Если дальнейший обмен данными с клиентом не предусмотрен, то следует закрыть его сокет. На последнем шаге функция SysSockClose выполняет закрытие и может быть использована для закрытия как клиентского, так и серверного сокета.
Табл. 20. Функция SysSockClose
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockClose
|
RTS_IEC_RESULT
|
Код ошибки выполнения функции (см. CmpErrors.library)
|
Input
|
hSocket
|
RTS_IEC_HANDLE
|
Дескриптор сокета
|
3.12.2. Реализация TCP-сокета клиента
Работа клиентского сокета также может быть описана последовательностью шагов: инициализация сокета, подключение к серверу, обмен данными и закрытие сокета.
Настройка клиента в основном предполагает использование тех же функций, что и для сервера, но с декстриптором сокета клиента.
Настройка клиентского сокета
На втором шаге, подключении к серверу, со стороны клиента используется функция SysSockConnect(): подключиться к TCP-серверу как клиент. Функция отправляет запрос на подключение, который на сервере принимается функцией SysSockAccept().
Табл. 21. Функция SysSockConnect()
Входы/выходы
|
Имя
|
Тип
|
Описание
|
Return
|
SysSockConnect
|
RTS_IEC_RESULT
|
Код ошибки выполнения функции (см. CmpErrors.library)
|
Input
|
hSocket
|
RTS_IEC_HANDLE
|
Дескриптор клиентского сокета
|
pSockAddr
|
POINTER TO SOCKADDRESS
|
Указатель на структуру SOCKADDRESS, в которой содержится адрес сервера
|
diSockAddrSize
|
DINT
|
Размер структуры SOCKADDRESS
|
При обмене данными и закрытии клиентского сокета в программе TCP-клиента используются те же функции, что и у сервера, подобным образом.
В данном примере можно использовать ПЛК NLScon-RSB как TCP-сервер и как TCP- клиент. Если NLScon-RSB выполняет серверные функции, то клиентом может быть запущенный на ПК CODESYS Control Win V3, и наоборот, если NLScon-RSB – клиент, то сервер — виртуальный контроллер. При этом следует не забывать в серверной и клиентской программах менять IP-адрес на адрес сервера.
Настройка IP-адреса сервера в серверном и клиентском приложениях
3.13. Пример использования библиотеки SysCom
Данный проект демонстрирует пример использования библиотеки SysCOM для реализации обмена данными с внешним устройством через последовательный порт ПЛК NLScon-RSB (или NLScon-CE). В примере рассматривается возможность отправки запроса и приема ответа от устройства. В качестве подключенного к ПЛК устройства рассматривался модуль RealLab! NLS-16DI, настроенный для работы по протоколу DCON (57600, 8N1, адрес 09h).
Для работы в проект CODESYS понадобится добавить библиотеку SysCOM. Эта библиотека реализует функции, выполняющие основные операции с СОМ портом: открытие, установка параметров соединения, запись, чтение и закрытие.
Библиотека SysCOM
В данном примере работа с COM-портом включает четыре этапа: открытие порта (и последующее задание настроек соединения), запись в порт, чтение ответа модуля NLS-16DI и закрытие порта.
Для открытия порта используется функция SysComOpen и затем, если получен обработчик порта, для задания типовых параметров соединения – функция SysComSetSettings.
Открытие COM-порта
Таким образом, открытый порт настроен на передачу данных в COM порт №1 ПЛК со скоростью 57600 бит/с, формат 8N1.
Запись в порт производится с помощью функции SysComWrite. В функцию записи в качестве аргументов передается обработчик открытого порта, ссылка на начальный адрес подготовленных для записи данных, размер этих данных в байтах и количество миллисекунд (ulTimeout), отведенных на запись. Функция возвращает количество отправленных в порт байтов. При этом, если за отведенное в ulTimeout время были переданы не все подготовленные для передачи байты, то соответственно возвращаемое количество байт будет меньше, чем ulSize.
Запись в COM-порт
После выполнения функции в переменную dwWritten запишется количество байт, отправленных в порт. В данном примере в порт отправляется последовательность символов:
«^09Mcr» - команда чтения имени устройства по протоколу DCON.
Для чтения ответа модуля используется функция SysComRead. Аргументами для нее являются обработчик открытого COM-порта; ссылка на область данных для записи считанных байт; количество байт, которые предполагается считать; количество миллисекунд (ulTimeout), отведенных на чтение. Функция возвращает количество считанных за время ulTimeout байтов. При этом, если за отведенное в ulTimeout время были считаны не все байты, то соответственно возвращаемое количество байт будет меньше, чем ulSize.
Чтение из COM-порта
Функция SysComClose закрывает COM-порт. Аргументом функции является обработчик открытого порта.
Закрытие COM-порта
В проекте используется функция _BUFFER_CLEAR() библиотеки OSCAT Basic 3.31 для очистки байтового массива для хранения считанных из СОМ порта данных.
Кроме того, в проекте использованы:
- генератор импульсов и R_TRIG для циклического запуска работы с портом:
Генератор импульсов
- таймеры для реализации задержки в 50мс между этапами работы с портом:
Таймеры
3.14. Пример работы ПЛК в качестве MQTT клиента
Данный пример демонстрирует использование ПЛК NLScon-RSB в качестве MQTT-клиента для обмена данными по сети Ethernet.
Для работы проекта понадобятся:
- библиотека MQTT Client Library (Stefan Roßmann Engineering Solutions).
- MQTT-брокер HiveMQ Public Broker;
- приложение для MQTT-клиента, например, MQTTX Ссылка для скачивания: MQTTX Download;
Для использования ПЛК в качестве MQTT-клиента понадобится функциональный блок FB_MQTTClient библиотеки MQTT Client Library. Экземпляр данного ФБ в CFC-диаграммах CODESYS выглядит следующим образом:
Экземпляр FB_MQTTClient
Для обмена данными понадобится настроить несколько входов этого ФБ:
Табл. 22. Входы функционального блока FB_MQTTClient
Вход FB_MQTTClient
|
Тип переменной
|
Пояснение
|
Присвоенное значение
|
i_xEnable
|
BOOL
|
По нарастающему фронту происходит автоматическое подключение к MQTT- брокеру
|
TRUE
|
i_sBrokerAddress
|
STRING
|
IP или URL MQTT-брокера
|
broker.hivemq.com
|
i_uiPort
|
UINT
|
Порт MQTT-брокера
|
1883
|
i_xAutoReconnect
|
BOOL
|
TRUE – автоматическое переподключение после возникновения исключения
|
TRUE
|
i_sPayload
|
STRING
|
Сообщение для публикации
|
hello
|
i_sTopicPublish
|
STRING
|
Топик для публикации сообщений
|
mqttTest_pub
|
i_sTopicSubscribe
|
STRING
|
Топик для подписки
|
mqttTest_sub
|
i_xPublish
|
BOOL
|
Нарастающий фронт – публикация сообщения из i_sPayload в топик i_sTopicPublish.
|
|
i_xSubscribe
|
BOOL
|
Нарастающий фронт – подписка на топик топик i_sTopicSubscribe.
|
|
q_sLastReceivedMessage
|
STRING
|
Последнее сообщение, полученное от топика, на который подписался клиент.
|
|
q_sLastReceivedMessageTopic
|
STRING
|
Топик от которого пришло последнее полученное сообщение.
|
|
Вызов экземпляра FB_MQTTClient на ST выглядит следующим образом:
Вызов экземпляра FB_MQTTClient
Чтобы подключиться к MQTT-брокеру, нужно знать его IP (или URL) и номер порта. В данном проекте в качестве MQTT-брокера использован HiveMQ Dashboard.
Адрес и порт MQTT-брокера
После загрузки и запуска проекта на ПЛК с экрана визуализации можно будет отправлять и принимать сообщения. Для проверки работы можно выбрать один и тот же топик для подписки и для публикации. Тогда сообщение, опубликованное на вкладке Publish (нажать на кнопку «Опубликовать»), должно появиться в поле на вкладке Subscribe (Нажать на кнопку «Подписаться»).
Управление подпиской и публикацией с экрана визуализации на ПЛК
Для проверки работы с разными топиками подписки и публикации используется еще один MQTT-клиент - приложение MQTTX на ПК. Для подключения MQTT-клиента в приложении MQTTX требуется следующее:
- Создать новое подключение к брокеру;
Создание нового подключения в MQTTX
- Указать имя подключения (Name), адрес брокера (Host), номер порта (Port) и версию протокола, соответствующую используемой библиотеке (MQTT Version = 3.1.1). Затем в правом верхнем углу — подключение (Connect).
Настройка подключения к брокеру broker.hivemq.com
При успешном подключении появится уведомление и окно MQTTX примет вид:
Вид окна MQTTX при успешном подключении к брокеру
- Для подписки на топик нужно выбрать New Subscription и указать название топика, например, mqttTest_pub. Далее — подтвердить подписку (Confirm).
Выбор топика для подписки
- На экране визуализации во вкладке Publish сформировать сообщение для публикации и нажать кнопку Опубликовать. Сообщение должно появиться в MQTTX в области с очередью сообщений:
Прием сообщения в MQTTX
- Для отправки сообщения нужно использовать нижнюю часть окна MQTTX. Потребуется указать имя топика для публикации (mqttTest_sub), само сообщение и нажать на кнопку отправки. Отправленное сообщение должно появиться на экране визуализации ПЛК во вкладке Subscribe в поле Сообщение.
Отправка сообщения из MQTTX
Полученное сообщение с топиком mqttTest_sub
3.15. Энергонезависимые переменные
Реманентные переменные могут сохранять свои значения в течение обычного цикла программы. Вы можете объявлять реманентные переменные как RETAIN-переменные или даже как перманентные переменные в приложении. Для полной функциональности необходима достаточная память на ПЛК (NVRam, USV). При отсутствии подходящего диапазона памяти значения VAR RETAIN или VAR PERSISTENT будут потеряны в случае сбоя питания!
RETAIN-переменные объявляются с использованием ключевого слова RETAIN после ключевого слова типа переменной (VAR, VAR_GLOBAL и т.д.) в разделе объявления программного объекта. Они сохраняют свои значения после непредвиденного отключения (или онлайн-команды Сброс). При перезапуске программы система продолжает работу с сохраненными значениями. При этом CODESYS инициализирует ‘обычные’ переменные либо с заданными значениями, либо с начальными значениями по умолчанию.
Пример инициализации: В POU:
VAR RETAIN
counter:INT:=1;
END_VAR
В GVL:
VAR_GLOBAL RETAIN
gvarRem : INT;
END_VAR
PERSISTENT-переменные при загрузке нового проекта сохраняют свои значения, если список PERSISTENT-переменных в новом проекте не отличается от старого.
PERSISTENT-переменные удобно использовать в тех случаях, когда заранее известно, что проект будет дорабатываться – например, он длительное время будет находиться в опытной эксплуатации, за время которой обслуживающий персонал будет формулировать пожелания и замечания. В течение этого времени операторы могут задавать уставки, параметры рецептов и т. д.
Добавление списка перманентных переменных
Далее появляется вкладка, где вы можете перечислить все перманентные переменные.
Запись переменных
Если некоторые переменные объявлены в других структурах и POU, то необходимо указать все пути экземпляров, как показано на рисунке.
Добавление путей экземпляров
Итоговый результат
Примечание:
Начиная с CODESYS V3.3.0.1, объявление VAR_GLOBAL PERSISTENT имеет тот же действие, что и объявление VAR_GLOBAL PERSISTENT RETAIN или VAR_GLOBAL RETAIN PERSISTENT.
3.16. Работа с GPIO на NLScon-RSB
3.16.1. Работа с GPIO в проекте CODESYS
Для работы с GPIO у вас должен быть установлен пакет таргет-файлов RealLab версии 1.9. Скачать его можно с нашего сайта – reallab.ru.
Запустите CODESYS. Создайте стандартный проект CODESYS и выберите в роли устройства “CODESYS Control NIL AP (RealLab)”.
Выбор устройства для создания проекта
После создания проекта в его дереве появится место для подключения шаблона управления дискретными входами и выходами.
Дерево проекта
Чтобы получить возможность управления дискретными входами и выходами кликните правой кнопкой мыши по <Empty> в дереве устройств проекта и выберите “Подключить устройство”. В открывшемся окне дважды кликните по “Digital Inputs Outputs” – шаблон управления дискретными входам/выходами будет добавлен в проект.
При возникновении ошибки “Невозможно открыть библиотеку #Raspberry Pi Peripherals” выполните следующие действия:
Откройте менеджер библиотек – плейсхолдеры. Кликните по строке “Raspberry Pi Peripherals” и из выпадающего списка выберите библиотеку версии 4.0.0.0.
Добавление библиотеки
Дерево устройства с шаблоном
Откройте управление дискретными входами и выходами двойным кликом по компоненту “Digital_Inputs_Outputs” в дереве проекта. Во вкладке конфигурации содержится таблица, где каждому входу/выходу GPIO можно назначить роль (вход/выход/не использовать), а также значение по умолчанию. Назначение GPIO ПЛК представлено в Табл. 23.
Примечание. При добавлении шаблона управления дискретными входами/выходами в проект, изменится индикация состояния CODESYS на ПЛК. Если CODESYS работает (переключатель в положении Старт) – светодиод Старт не будет светиться. Если CODESYS будет остановлен (переключатель в положении Стоп) – светодиод Стоп будет светиться красным. Это обсуловлено особенностью взаимодействия среды CODESYS с GPIO ПЛК.
Табл. 23 Назначение GPIO.
GPIO
|
Описание
|
Функция
|
2
|
Дикретный вход Din1 на ПЛК серии
NLScon-RSB
|
Input
|
3
|
Дикретный вход Din0 на ПЛК серии
NLScon-RSB
|
Input
|
12
|
Дискретный выход Dout0 ПЛК серии NLScon-RSB
|
Output
|
13
|
Дискретный выход Dout1 ПЛК серии NLScon-RSB
|
Output
|
30
|
Отвечает за наличие питания от сети. True – питание от сети, False – питание от АКБ.
|
только
“not used”
|
Конфигурация GPIO
Во вкладке “Соотнесение входов/выходов” на каждый вход и выход можно назначить переменную для использования ее в программе. Для GPIO, назначенных на вход, соотносить переменную из канала digital input. Для GPIO, назначенных на выход – соотносить переменные из канала digital outputs.
Соотнесение переменных GPIO
После назначения соотнесения переменных c входами/выходами GPIO, можно использовать их в коде программы как логические (BOOL) переменные.
3.16.2. Настройка конфигурационного файла CODESYS RT
Для того, чтобы управление дискретными входами и выходами на ПЛК серии NLScon-RSB в CODESYS работало корректно, необходимо разрешить выполнение команд Linux в среде исполнения CODESYS. Если этого не сделать, то все входы/выходы будут отображаться как False:
Для разрешения вызова команд Linux добавьте строки в конфигурационный файл среды исполнения CODESYS. Для этого подключитесь к ПЛК через VNC и запустите Терминал.
Выполните команду, которая откроет конфиг:
sudo nano /usr/bin/codesys/CODESYSControl.cfg
Добавьте строки, указанные ниже.
[SysProcess]
BasePriority=Realtime
Command=AllowAll
Сохраните файл комбинацией клавиш Ctrl+O, Enter, Ctrl+X.
Перезагрузите ПЛК командой reboot.
3.17. Рекомендации по настройке визуализации
Если наблюдаются проблемы со скоростью работы визуализации на ПЛК NLScon-RSB и A40, пользователю следует корректно настроить следующие параметры:
Раздел TargetVisualization в Visualization Manager’е. Параметр “Частота обновления визуализации” установите равным 40 мс.
Параметры таргет-визуализации
Раздел WebVisualization в Visualization Manager’е. Параметр “Частота обновления визуализации” установите равным 40 мс.
Параметры веб-визуализации
Конфигурация задачи VISU_TASK, параметр “Частота обновления визуализации” установите равным 40 мс (или тому, который вы установили в таргет-визуализации или веб-визуализации).
Параметры задачи VISU_TASK
Если изменение выше указанных параметров не помогли, попробуйте установить Default стиль визуализации.
Параметры стиля визуализации
Также попробуйте снять галочку с опции “Сглаживания”.
Отключение сглаживания
3.18. Обмен по сети Modbus RTU с помощью библиотеки ModbusFB
3.18.1. ПЛК – Ведущий
Данный пример демонстрирует пример использования библиотеки ModbusFB для настройки ПЛК NLScon-RSB в качестве ведущего устройства, а модуль NLS-16DI — в качестве ведомого в сети Modbus RTU.
С помощью стандартного функционала CODESYS в дерево устройств добавлено устройство MasterDevice (NLScon-RSB).
Дерево устройств проекта
Для организации обмена с помощью функций библиотеки ModbusFB в Менеджере библиотек для ведущего и ведомого устройств добавлены библиотеки ModbusFB, SysCom и Standard.
Менеджер библиотек
Для настройки ПЛК NLScon-RSB в качестве Modbus-мастера с помощью функционала библиотеки Modbus FB в программе MasterMain выполнено следующее:
- Создан экземпляр функционального блока (ФБ) мастера (клиента) ModbusFB.ClientSerial;
client : ModbusFB.ClientSerial;
- Созданы экземпляры ФБ для отправки запросов мастером:
- чтение регистров хранения (ФБ ModbusFB.ClientRequestReadHoldingRegisters);
- чтение входных регистров (ФБ ModbusFB.ClientRequestReadInputRegisters);
clientRequestReadHoldingRegisters: ModbusFB.ClientRequestReadHoldingRegisters; clientRequestReadInputRegisters : ModbusFB.ClientRequestReadInputRegisters;
- Созданы массивы данных для подготовки значений, записываемых в регистры хранения слейва, и для хранения считанных из слейва значений регистров хранения и входных регистров;
aUINT_holding: ARRAY [0..1] OF UINT; aUINT_input: ARRAY [0..1] OF UINT;
- Настройка мастера: настройка номера COM-порта, к которому подключен опрашиваемый слейв; скорости и формата передачи данных; протокол (RTU или ASCII); настройки вывода сообщений о ходе обмена данными в лог ПЛК. Настройки применятся по переднему фронту переменной xConnect.
client(iPort:=SysCom.SYS_COM_PORTS.SYS_COMPORT2, dwBaudrate := SysCom.SYS_BR_57600, byDataBits:=byDataBits,
eRtuAscii:=eRtuAscii, udiLogOptions:=(ModbusFB.LoggingOptions.ClientConnectDisconnect OR
ModbusFB.LoggingOptions.ClientReceivedValidReplies)); client(xConnect:=TRUE);
- Настройка параметров запросов: привязка запроса к мастеру; адрес слейва; начальный адрес области данных; количество регистров; указатель на начало массива переменных мастера, куда будут записаны считанные из слейва данные или где находятся подготовленные для записи в слейв значения
clientRequestReadHoldingRegisters(rClient:=client,
uiUnitId:=9, uiStartItem:=16#0200, uiQuantity:=1, pData:=ADR(aUINT_holding[0]));
- После того, как мастер и запросы настроены, требуется циклически вызывать экземпляр client ФБ ModbusFB.ClientSerial и запускать запросы установкой их входных переменных xExecute в TRUE. Для проверки результатов работы запроса используются его выходные переменные xDone и xError. Выход xDone = TRUE в случае успешно выполненного запроса, иначе xDone = FALSE, а выход xError = TRUE. После проверки результатов работы запроса следует сбросить переменную xExecute в FALSE.
В данном примере используются два запроса: считать состояние дискретных входов (Modbus-функция 04, адрес 0h0000, 1 регистр) и считать адрес модуля (Modbus-функция 03, адрес 0h0200, 1 регистр).
В результате опроса модуля считанные данные записываются в соответствующие переменные в ПЛК: «входные регистры» - адрес 9, «регистры хранения» - состояние входов 4096 (0h1000 – 1 на входе Din12).
Результаты опроса NLS-16DI
3.18.2. ПЛК – Слейв
Данный пример демонстрирует использование библиотеки ModbusFB для настройки ПЛК NLScon-RSB в качестве ведомого устройства, а ПЛК CODESYS Control Win V3 — в качестве ведущего в сети Modbus RTU.
С помощью стандартного функционала CODESYS в дерево устройств добавлены устройства MasterDevice (CODESYS Control Win V3) и SlaveDevice (NLScon-RSB).
Конфигурация дерева устройств для обмена данными в сети Modbus RTU
Для организации обмена с помощью функций библиотеки ModbusFB в Менеджере библиотек для ведущего и ведомого устройств добавлены библиотеки ModbusFB, SysCom и Standard.
Менеджер библиотек
Для настройки виртуального ПЛК CODESYS Control Win V3 в качестве Modbus-мастера с помощью функционала библиотеки Modbus FB в программе MasterMain выполнено следующее:
- Создан экземпляр функционального блока (ФБ) мастера (клиента) ModbusFB.ClientSerial;
client: ModbusFB.ClientSerial;
- Созданы экземпляры ФБ для отправки запросов мастером:
- чтение регистров хранения (ФБ ModbusFB.ClientRequestReadHoldingRegisters);
- чтение входных регистров (ФБ ModbusFB.ClientRequestReadInputRegisters);
- запись регистров хранения (ФБ ModbusFB.ClientRequestWriteMultipleRegisters);
clientRequestReadHoldingRegisters : ModbusFB.ClientRequestReadHoldingRegisters; clientRequestReadInputRegisters : ModbusFB.ClientRequestReadInputRegisters; clientRequestWriteMultipleRegisters : ModbusFB.ClientRequestWriteMultipleRegisters
- Созданы массивы данных для подготовки значений, записываемых в регистры хранения слейва, и для хранения считанных из слейва значений регистров хранения и входных регистров;
aUINT_holding : ARRAY [0..10] OF UINT;
aUINT_input : ARRAY [0..10] OF UINT;
aUINT_multiple : ARRAY [0..10] OF UINT;
- Настройка мастера: настройка номера COM-порта, к которому подключен опрашиваемый слейв; скорости и формата передачи данных; протокол (RTU или ASCII); настройки вывода сообщений о ходе обмена данными в лог ПЛК. Настройки применятся по переднему фронту переменной xConnect.
client(iPort:=SysCom.SYS_COM_PORTS.SYS_COMPORT3, dwBaudrate := SysCom.SYS_BR_57600, byDataBits:=byDataBits,
eRtuAscii:=eRtuAscii, udiLogOptions:=(ModbusFB.LoggingOptions.ClientConnectDisconnect OR
ModbusFB.LoggingOptions.ClientReceivedValidReplies)); client(xConnect:=TRUE);
- Настройка параметров запросов: привязка запроса к мастеру; адрес слейва; начальный адрес области данных; количество регистров; указатель на начало массива переменных мастера, куда будут записаны считанные из слейва данные или где находятся подготовленные для записи в слейв значения.
clientRequestReadHoldingRegisters(rClient:=client,
uiUnitId:=1, uiStartItem:=5, uiQuantity:=2,
pData:=ADR(aUINT_holding[0]));
6) После того, как мастер и запросы настроены, требуется циклически вызывать экземпляр client ФБ ModbusFB.ClientSerial и запускать запросы установкой их входных переменных xExecute в TRUE. Для проверки результатов работы запроса используются его выходные переменные xDone и xError. Выход xDone = TRUE в случае успешно выполненного запроса, иначе xDone = FALSE, а выход xError = TRUE. После проверки результатов работы запроса следует сбросить переменную xExecute в FALSE.
Для настройки ПЛК NLScon-RSB в качестве Modbus-слейва с помощью функционала библиотеки Modbus FB в программе SlaveMain выполнено следующее:
- Создан экземпляр функционального блока (ФБ) мастера (клиента) ModbusFB.ClientSerial;
serverSerial: ModbusFB.ServerSerial;
- Созданы экземпляр ФБ ModbusFB.ExampleDataModel для формирования модели данных слейва — набора регистров, доступных для обмена данными по Modbus RTU.
exampleDataModel: ModbusFB.ExampleDataModel;
Модель данных ModbusFB.ExampleDataModel является примером формирования набора регистров для слейва и включает следующие секции:
- discrete inputs;
- coils;
- input registers;
- holding registers.
Каждая секция включает по 2 поля данных и имеет начальный адрес 5 по умолчанию.
- Настройка разрешенных для слейва Modbus-функций:
fcsSupported: ModbusFB.SupportedFcs := ( ReadHoldingRegisters:=TRUE, ReadInputRegisters:=TRUE, WriteMultipleRegisters:=TRUE);
- Настройка слейва: настройка разрешенных Modbus-функций, привязка к модели данных слейва, адрес слейва, настройка номера COM-порта слейва, к которому подключен мастер; скорость и формат передачи данных; протокол (RTU или ASCII); настройки вывода сообщений о ходе обмена данными в лог ПЛК. Настройки применятся по переднему фронту переменной xEnable.
serverSerial(fcsSupported:=fcsSupported, dataModel:=exampleDataModel.tableDefs, xEnable:=FALSE,
uiUnitId:=1, iPort:=SysCom.SYS_COM_PORTS.SYS_COMPORT2,
byDataBits:=byDataBits, eRtuAscii:=eRtuAscii,
dwBaudrate := SysCom.SYS_BR_57600,
udiLogOptions:=(ModbusFB.LoggingOptions.ServerStartStop OR
ModbusFB.LoggingOptions.ServerReceivedValidRequests));
- После того, как слейв настроен, требуется циклически вызывать экземпляр serverSerial ФБ ModbusFB.ServerSerial.
Вместо встроенной в библиотеку ModbusFB модели данных ModbusFB.ExampleDataModel можно настроить пользовательскую модель данных типа ModbusFB.TableDefinitions. Этот тип представляет собой структуру, включающую описание секций для четырех типов данных: discrete inputs, coils, input registers, holding registers.
В данном примере пользовательская модель данных реализована для устройства SlaveDevice_RegisterModel в программе SlaveMain.
Проект с пользовательской моделью данных в Modbus-слейв
В проекте создана пользовательская модель данных tableDefs типа ModbusFB.TableDefinitions. Эта модель в соответствии со своим типом состоит из четырех структур типа ModbusFB.TableDefinition:
- tableDiscreteInputs;
- tableCoils;
- tableInputRegisters;
- tableHoldingRegisters.
Каждая из перечисленных структур включает следующие поля: количество секций в структуре и указатель на первую секцию.
Модель данных типа ModbusFB.TableDefinitions
Таким образом, для Modbus RTU слейва модель данных включает: 1 секцию «дискретных входов», 2 секции «катушек», 3 секции «входных регистров» и 2 секции «регистров хранения».
Секции задаются массивом из некоторого количества структур типа ModbusFB.TableSection, например, инициализация секций для «входных регистров».
Секция «входных регистров» типа ModbusFB.TableSection
В данном случае секции для «входных регистров» представляют собой 3 структуры типа ModbusFB.TableSection, которые описываются параметрами:
- начальный адрес uiStart;
- количество uiNumDataItems полей данных в секции (бит/байт/слов – в зависимости от назначения секции);
- указатель pStartAddr на область памяти в ПЛК, выделенную для этой секции;
- размер uiDataItemSize в битах поля данных. Для discrete inputs/coils значение uiDataItemSize может быть равно 1 или 8 бит, для input/holding registers значение uiDataItemSize равно 16 бит.
Выбор размера для discrete inputs/coils зависит от того, как они привязаны к области памяти в ПЛК:
- если выделенная область памяти — это ARRAY [0..x] OF BOOL, то uiDataItemSize=8,
- если discrete inputs/coils адресуются побитово, то uiDataItemSize=1.
Для input/holding registers область памяти должна быть массивом ARRAY [0..x] OF UINT.
В данном примере для секции «входных регистров» выделены области памяти:
aInputRegistersMemory1
: ARRAY [0..6] OF UINT; aInputRegistersMemory2 : ARRAY [0..2] OF UINT;
В нашем случае «входные регистры» для ПЛК настроены следующим образом:
- первая секция: начальный адрес 0, количество полей в секции 3 штуки (3 регистра), их значения будут хранится в первых трех элементах массива aInputRegistersMemory1[0..2], размерность каждого «входного регистра» – 16 бит.
- вторая секция: начальный адрес 5, количество полей в секции 4 штуки (4 регистра), их значения будут хранится в последних четырех элементах массива aInputRegistersMemory1[3..6], размерность каждого «входного регистра» – 16 бит.
- третья секция: начальный адрес 10, количество полей в секции 3 штуки (3 регистра), их значения будут хранится в первых трех элемента массива aInputRegistersMemory2[0..2], размерность каждого «входного регистра» – 16 бит.
Подобным образом в программе SlaveMain объявлены секции для discrete inputs, coils и holding registers. Для всех секций в программе должны быть выделены области памяти.
Области памяти для пользовательской модели данных ПЛК
Чтобы запустить Modbus RTU слейв на ПЛК, потребуется настроить serverSerial (экземпляр ФБ ModbusFB.ServerSerial) и разрешить его работу:
- Настройка слейва: настройка разрешенных Modbus-функций, привязка к модели данных слейва, адрес слейва, настройка номера COM-порта слейва, к которому подключен мастер; скорость и формат передачи данных; протокол (RTU или ASCII); настройки вывода сообщений о ходе обмена данными в лог ПЛК. Настройки применятся по переднему фронту переменной xEnable.
serverSerial(fcsSupported:=fcsSupported, dataModel:=tableDefs, xEnable:=FALSE, uiUnitId:=1, iPort:=SysCom.SYS_COM_PORTS.SYS_COMPORT2, byDataBits:=byDataBits, eRtuAscii:=eRtuAscii, dwBaudrate := SysCom.SYS_BR_57600, udiLogOptions:=(ModbusFB.LoggingOptions.ServerStartStop OR ModbusFB.LoggingOptions.ServerReceivedValidRequests));
- После того, как слейв настроен, требуется циклически вызывать экземпляр serverSerial ФБ ModbusFB.ServerSerial.
Для опроса слейва с пользовательской моделью данных, нужно в программе MasterMain заменить в настройках опроса начальный адрес и количество регистров (при необходимости).
Задание начального адреса и кол-ва регистров для опроса
3.19. Обмен по сети Modbus TCP с помощью библиотеки ModbusFB
3.19.1. ПЛК – Слейв
Данный пример демонстрирует использование библиотеки ModbusFB для настройки ПЛК NLScon-RSB в качестве ведомого устройства, а ПЛК CODESYS Control Win V3 — в качестве ведущего в сети Modbus TCP.
Обмен данными между ПЛК CODESYS Control Win V3 и ПЛК NLScon-RSB осуществляется по сети Modbus TCP. Для организации обмена ПЛК NLScon-RSB (порт Ethernet 0) и компьютер, на котором запущена служба CODESYS Control Win V3 (виртуальный ПЛК), подключены к одной локальной сети.
С помощью стандартного функционала CODESYS в дерево устройств добавлены устройства MasterDevice (CODESYS Control Win V3) и SlaveDevice (NLScon-RSB).
Конфигурация дерева устройств для обмена данными в сети Modbus TCP
Для организации обмена с помощью функций библиотеки ModbusFB в Менеджере библиотек для ведомого устройства добавлены библиотеки ModbusFB, SysCom и Standard.
Менеджер библиотек
Для настройки виртуального ПЛК CODESYS Control Win V3 в качестве Modbus-мастера с помощью дерева устройств добавлены устройства (ПКМ на устройство MasterDevice, Add device):
- Ethernet;
Добавление и настройка компонента Ethernet дерева устройств
- Modbus TCP Master. Для настройки компонента требуется выставить галочку Auto-reconnect;
- Modbus TCP Slave. Здесь в поле Slave IP address указываем IP-адрес Modbus TCP слейва;
- Modbus_Slave_COM_Port. Адрес Slave address для ПЛК NLScon-RSB можно оставить равным 1. На вкладке Modbus Slave Channel нужно создать каналы опроса. После создания каналов нужно перейти на вкладку ModbusGenericSerialSlave I/O Mapping и в выпадающем списке Always update variables выбрать Enabled 2;
Добавление и настройка компонента Modbus_Slave_COM_Port дерева устройств
Настройка компонента Modbus_Slave_COM_Port – обновление переменных
Для настройки ПЛК NLScon-RSB в качестве Modbus-слейва с помощью функционала библиотеки Modbus FB в программе SlaveMain выполнено следующее:
- Создан экземпляр функционального блока (ФБ) мастера (клиента) ModbusFB.ServerTCP;
serverTCP: ModbusFB.ServerTCP;
- Созданы экземпляр ФБ ModbusFB.ExampleDataModel для формирования модели данных слейва — набора регистров, доступных для обмена данными по Modbus RTU.
exampleDataModel : ModbusFB.ExampleDataModel;
Модель данных ModbusFB.ExampleDataModel является примером формирования набора регистров для слейва и включает следующие секции:
- discrete inputs;
- coils;
- input registers;
- holding registers.
Каждая секция включает по 2 поля данных и имеет начальный адрес 5 по умолчанию.
- Настройка разрешенных для слейва Modbus-функций:
fcsSupported : ModbusFB.SupportedFcs := (
ReadHoldingRegisters:=TRUE,
ReadInputRegisters:=TRUE,
WriteMultipleRegisters:=TRUE
);
- Настройка слейва: настройка разрешенных Modbus-функций, привязка к модели данных слейва, символьное обозначение интерфейса Ethernet слейва, настройка номера Ethernet порта слейва; настройки вывода сообщений о ходе обмена данными в лог ПЛК. Настройки применятся по переднему фронту переменной xEnable
serverTCP(fcsSupported:=fcsSupported,
dataModel:=exampleDataModel.tableDefs,
xEnable:=FALSE,
wsInterfaceName:="eth0",
uiPort:=502,
udiLogOptions:=(ModbusFB.LoggingOptions.ServerStartStop OR
ModbusFB.LoggingOptions.ServerReceivedValidRequests));
Узнать символьное имя сетевого интерфейса слейва можно, временно добавив компонент Ethernet в дереве устройств SlaveDevice и просмотрев параметры сетевого интерфейса. Сетевые параметры будут актуальны, если предварительно найти устройство SlaveDevice в сети (сканировать сеть). Здесь же можно узнать IP-адрес слейва, чтобы верно указать его в настройках компонента Modbus TCP Slave.
Настройки сетевого интерфейса ПЛК NLScon-RSB
- После того, как слейв настроен, требуется циклически вызывать экземпляр serverTCP ФБ ModbusFB.ServerTCP.
Вместо встроенной в библиотеку ModbusFB модели данных ModbusFB.ExampleDataModel можно настроить пользовательскую модель данных типа ModbusFB.TableDefinitions. Этот тип представляет собой структуру, включающую описание секций для четырех типов данных: discrete inputs, coils, input registers, holding registers.
В данном примере пользовательская модель данных реализована для устройства SlaveDevice_RegisterModel в программе SlaveMain.
Проект с пользовательской моделью данных в Modbus-слейв
В проекте создана пользовательская модель данных tableDefs типа ModbusFB.TableDefinitions. Эта модель в соответствии со своим типом состоит из четырех структур типа ModbusFB.TableDefinition:
- - tableDiscreteInputs;
- - tableCoils;
- - tableInputRegisters;
- - tableHoldingRegisters.
Каждая из перечисленных структур включает следующие поля: количество секций в структуре и указатель на первую секцию.
Модель данных типа ModbusFB.TableDefinitions
Таким образом, для Modbus RTU слейва модель данных включает: 1 секцию «дискретных входов», 2 секции «катушек», 3 секции «входных регистров» и 2 секции «регистров хранения».
Секции задаются массивом из некоторого количества структур типа ModbusFB.TableSection, например, инициализация секций для «входных регистров».
Таблица «входных регистров» типа ModbusFB.TableSection
В данном случае секции для «входных регистров» представляют собой 3 структуры типа ModbusFB.TableSection, которые описываются параметрами:
- начальный адрес uiStart;
- количество uiNumDataItems полей данных в секции (бит/байт/слов – в зависимости от назначения секции);
- указатель pStartAddr на область памяти в ПЛК, выделенную для этой секции;
- размер uiDataItemSize в битах поля данных. Для discrete inputs/coils значение uiDataItemSize может быть равно 1 или 8 бит, для input/holding registers значение uiDataItemSize равно 16 бит. Выбор размера для discrete inputs/coils зависит от того, как они привязаны к области памяти в ПЛК: если выделенная область памяти — это ARRAY [0..x] OF BOOL, то uiDataItemSize=8, если discrete inputs/coils адресуются побитово, то uiDataItemSize=1. Для input/holding registers область памяти должна быть массивом ARRAY [0..x] OF UINT.
В данном примере для секции «входных регистров» выделены области памяти:
aInputRegistersMemory1: ARRAY [0..6] OF UINT;
aInputRegistersMemory2: ARRAY [0..2] OF UINT;
В нашем случае «входные регистры» для ПЛК настроены следующим образом:
начальный адрес 0, количество полей в секции 3 штуки (3 регистра), их значения будут хранится в первых трех элементах массива aInputRegistersMemory1[0..2], размерность каждого «входного регистра» - 16 бит.
начальный адрес 5, количество полей в секции 4 штуки (4 регистра), их значения будут хранится в последних четырех элементах массива aInputRegistersMemory1[3..6], размерность каждого «входного регистра» - 16 бит.
начальный адрес 10, количество полей в секции 3 штуки (3 регистра), их значения будут хранится в первых трех элементах массива aInputRegistersMemory2[0..2], размерность каждого «входного регистра» - 16 бит.
Подобным образом в программе SlaveMain объявлены секции для discrete inputs, coils и holding registers. Для всех секций в программе должны быть выделены области памяти.
Области памяти для пользовательской модели данных ПЛК
Чтобы запустить Modbus RTU слейв на ПЛК, потребуется настроить serverTCP (экземпляр ФБ ModbusFB.ServerTCP) и разрешить его работу:
- Настройка слейва: настройка разрешенных Modbus-функций, привязка к модели данных слейва, символьное обозначение интерфейса Ethernet слейва, настройка номера Ethernet порта слейва; настройки вывода сообщений о ходе обмена данными в лог ПЛК.
Настройки применятся по переднему фронту переменной xEnable.
serverTCP(fcsSupported:=fcsSupported,
dataModel:=exampleDataModel.tableDefs,
xEnable:=FALSE,
wsInterfaceName:="eth0",
uiPort:=502,
udiLogOptions:=(ModbusFB.LoggingOptions.ServerStartStop OR
ModbusFB.LoggingOptions.ServerReceivedValidRequests));
Узнать символьное имя сетевого интерфейса слейва можно, временно добавив компонент Ethernet в дереве устройств SlaveDevice_RegisterModel и просмотрев параметры сетевого интерфейса. Сетевые параметры будут актуальны, если предварительно найти устройство SlaveDevice_RegisterModel в сети (сканировать сеть). Здесь же можно узнать IP-адрес слейва, чтобы верно указать его в настройках компонента Modbus TCP Slave.
- После того, как слейв настроен, требуется циклически вызывать экземпляр serverTCP ФБ ModbusFB.ServerTCP.
Для опроса слейва с пользовательской моделью данных нужно заменить в настройках каналов Modbus_Slave_COM_Port начальный адрес и количество регистров (при необходимости).
4. Работа с модулями ввода и вывода RealLab
4.1. Протокол Modbus RTU
Проекты с примерами работы с устройствами в среде разработки CODESYS 3.5 можно скачать на нашем сайте reallab.ru.
4.1.1. Рекомендации для работы с модулями серии NL, NLS
- Рекомендуется устанавливать (по возможности) скорость обмена по шине 115200 бод, а также использовать контрольные суммы.
- Модули аналогового ввода (NLS-8AI, NLS-4RTD и др.) способны производить аналого-цифровое преобразование со скоростью около 10 раз в секунду. Это значит, что частота опроса не должна превышать 10 Гц.
- Модули ввода-вывода серии NL имеют собственный сторожевой таймер, который настраивается при конфигурировании модуля. Принцип действия этого таймера основан на передаче модулям по шине данных специальной широковещательной команды «00 06 0А 02 00 01 [CRC16]». Приняв такую команду модуль сбрасывает свой сторожевой таймер. Если таймер сработал до прихода команды, модуль переходит в защищенное состояние, которое также настраивается при конфигурировании модуля.
- Для ускорения опроса модулей ввода-вывода (и для ускорения работы ПЛК соответственно) рекомендуется разделить эти модули на «скоростные» (те, которые быстро отвечают, как правило —дискретные) и «обычные» (те, которым на отработку команды и ответ требуется 100 мс и более, как правило — аналоговые). «Скоростные» модули рекомендуется подключить к одной шине данных, «обычные» — к другой. В конфигурации задач также рекомендуется разделить опрос «скоростных» и «обычных» модулей по задачам. Т. е. одна задача запускает программный модуль, который использует данные каналов «скоростных» модулей ввода-вывода, другая задача запускает программный модуль, опрашивающий «обычные» модули. Данные между программными модулями можно передавать с помощью глобальных переменных. Разделение алгоритма работы ПЛК по задачам позволит организовать одновременную работу обеих шин данных, а также установить периоды повторения задач, свойственные модулям на шине, с которыми задача взаимодействует. Разделение модулей по шинам данных на «скоростные» и «обычные» позволит работать модулям на своей скорости и не ожидать ответов более медленных модулей. Такое замедление становится особо заметным, когда «обычный» модуль вдруг пропускает запрос (запрос, при этом, приходится повторять), а «скоростной» модуль вынужден ожидать (довольно длительный таймаут), когда ПЛК обратится к нему.
4.1.2. Основная работа в CODESYS
4.1.2.1.Подключение устройства
В дереве устройств выбрать Device (CODESYS Control NIL AP) и добавить устройство Modbus COM.
Во вкладке “Общее” Modbus COM необходимо указать номер COM-порта, используемого ПЛК, скорость передачи (по умолчанию 9600 бод), а также четность – NONE. Все остальные настройки без изменений.
После Modbus COM следует добавить Modbus Master. Во вкладке “Общее” Modbus Master COM Port – установить галочку “Автоперезапуск соединения”. К Modbus Master COM Port добавьте слейв-устройство (модуль), с которым будет установлено соединение.
Пример параметров Modbus для подключения
4.1.2.2.Каналы Modbus Slave
Во вкладке “Канал Modbus Slave” необходимо добавить каналы, которые понадобятся для использования в проекте, задать код функции для каждого канала в зависимости от цели использования и возможностей регистра, который связывается с CODESYS.
Добавление канала Modbus Slave
Для каналов, которые используются для записи значений в память модуля, рекомендуется использовать триггер “по переднему фронту”. Для каналов, читающих данные с устройства и его датчиков, можно оставить триггер “цикл” и установить необходимое время для чтения. Например, при использовании цикла со значением 100 мс, информация, считываемая с устройства, будет обновляться каждые 100 мс. Не стоит устанавливать значение времени цикла меньше, чем поддерживает подключенное устройство или датчик.
В примерах каналы, имена которых начинаются с “W_...”, служат для записи значений (см. код функции в графе “тип доступа”, вкладка “Канал Modbus Slave” в параметрах модуля). Каналы, имена которых начинаются с “R_...”, служат для чтения данных с устройства.
Чтобы добавить канал, во вкладке вашего устройства “Канал Modbus Slave” нажмите “Добавить канал…”. Введите его имя, укажите тип доступа, триггер, время цикла (если триггер: цикл), сдвиг и длину.
4.1.2.3.Триггеры
Во вкладке параметров вашего устройства (например, NLS-8AI) "ModbusGenericSerialSlave Соотнесение входов/выходов" откройте список, который появляется в основном окне. Назначьте нужные вам переменные, которые будут задействованы в программе и/или визуализации. Для переменных, которые имеют триггер “по переднему фронту” для правильной работы программы необходимо добавить триггерную переменную. Например, создать в программе переменную типа данных “R_TRIG” или “F_TRIG” и добавить в виде триггерной переменной параметр “имя переменной.CLK”. Также, триггером может выступать любая BOOL или BIT-переменная.
4.1.2.4.Добавление визуализации в проект
Правой кнопкой мыши кликните по “Application” – "Добавление объекта" – "Визуализация" – Поставьте галочку напротив "VisuSymbols" и нажмите “Добавить”.
Создание визуализации
Справа откроется панель инструментов визуализации. Там можно выбрать категории элементов. Для задействования нужного элемента перетащите его в основное окно визуализации.
В дереве устройств ПКМ по “Application” – Добавление объекта – Пул изображений. Введите имя пула и сохраните. В открывшемся окне введите в первую строку: ID пула и имя файла (нажмите на “…” и выберите файл через проводник Windows). Далее в визуализации откройте категорию "Базовый" и перетащите элемент "Изображение" в основное окно визуализации.
Настройка пула изображений
В ассистенте ввода выберите ваш пул изображений и выберите нужное изображение.
Импорт фото из пула
Затем перетащите из панели инструментов визуализации элемент "Индикатор" (группа Lamps/Switches/Bitmaps) в таком количестве, которое вам нужно. Назначьте индикатору переменную. То же самое сделайте с нужными вам элементами.
Работа над визуализацией
Также, можно выбрать стиль элементов, которые используются в визуализации. Для этого в дереве устройств дважды кликните по менеджеру визуализации и во вкладке “Установки” выберите из списка желаемый стиль. Помимо этого, есть возможность настройки частоты обновления визуализации (мин. 40 мс). Для этого в дереве устройств в ветке менеджера визуализации выберите Таргет-визуализацию или Web-визуализацию. В настройках обоих вариантов визуализаций есть пункт “Частота обновления (мс)”. Укажите нужное вам значение. Чем значение меньше, тем быстрее работает визуализация. Нет смысла устанавливать слишком маленькую частоту обновления визуализации (например, 40 мс), если данные, выводимые в визуализацию, обновляются гораздо реже (например, раз в 200 мс). В таком случае следует установить частоту обновления визуализации такую же, с которой обновляются данные, или чуть меньше.
Выбор стиля визуализации в проекте
4.1.2.5.Функции, используемые в программах
Функция WORD2_TO_REAL объединяет 2 WORD-переменных (WORD = 2 байта) в одну переменную REAL (REAL = 4 байта). Объединение можно провести с перестановкой байтов, слов (по 2 байта) и без перестановки.
Входные параметры функции WORD2_TO_REAL
Функция REAL_TO_2WORD разбивает одну переменную REAL на 2 переменных WORD с возможностью перестановки слов.
Входные параметры функции REAL_TO_2WORD
4.1.3. Пример использования NLS-16DI
4.1.3.1.Настройка каналов и соотнесения входов/выходов устройства
Дерево устройств – Modbus_COM – Modbus_Master_COM_Port – NLS-16DI, во вкладке "ModbusGenericSerialSlave Соотнесение входов/выходов".
Каналы модуля NLS-16DI
В параметрах соотнесения входов/выходов можно присваивать каналам и их составляющим не только переменные, которые нигде не объявлены, но и уже объявленные в программе.
Cоотнесение входов/выходов модуля NL(S)-16DI
4.1.3.2.Визуализация
Создана визуализация для модуля NLS-16DI. Запускаем программу и проверяем работу визуализации: подаем напряжение 12 В на контакт Din4:
Индикатор показывает наличие контакта на входе Din4
4.1.4. Пример использования NLS-16DO
4.1.4.1.Настройка каналов и соотнесения входов/выходов устройства
Каналы NLS-16DO
Дерево устройств – Modbus_COM – Modbus_Master_COM_Port – NLS-16DO, во вкладке "ModbusGenericSerialSlave Соотнесение входов/выходов".
Соотнесение входов/выходов NLS-16DO
В параметрах соотнесения входов/выходов можно присваивать каналам и их составляющим не только переменные, которые нигде не объявлены, но и уже объявленные в программе.
4.1.4.2.Визуализация
Помимо индикаторов здесь используются клавишные переключатели. На них назначены переменные W0, W1, W2, …, WF из соотнесения входов/выходов.
Полностью готовая визуализация NLS-16DO
4.1.5. Пример использования NLS-8R
4.1.5.1.Настройка каналов и соотнесения входов/выходов устройства
Каналы на чтение/запись модуля NL(S)-8R
Дерево устройств – Modbus_COM – Modbus_Master_COM_Port – NLS-16DO, во вкладке "ModbusGenericSerialSlave Соотнесение входов/выходов".
Соотнесение входов/выходов модуля NL(S)-8R
В параметрах соотнесения входов/выходов можно присваивать каналам и их составляющим не только переменные, которые нигде не объявлены, но и уже объявленные в программе.
4.1.5.2.Визуализация
Полностью готовая визуализация NLS-8R
4.1.6. Пример использования NLS-4AO
4.1.6.1.Настройка каналов и соотнесения входов/выходов устройства
Каналы на чтение/запись NL(S)-4AO
Соотнесение входов/выходов NLS-4AO
4.1.6.2.Создание программы
В дереве устройств дважды кликните по файлу вашей программы, напрмер “PLC_PRG”. Откроется редактор кода. Если в дереве устройств нет файла программы, то его нужно создать. Для этого нажмите правой кнопкой мыши по объекту “Application” (там же, в дереве устройств) – “Добавление объекта” – “POU”.
В редакторе кода есть верхняя и нижняя части. В верхней части нужно объявлять переменные, а в нижней – писать сам алгоритм, который циклически выполняется модулем.
Объявим переменные для взаимодействия с нашим модулем NLS-4AO:
Объявление переменных программы
Переменные типа данных INT: iRadioNumber и iRangeNumber, нужны для реализованной визуализации (см. рисунок).
iRadioNumber определяет номер аналогового выхода, в который будет записано значение, введенное в соответствующее поле ввода (см. рисунок). Значение вводится в мВ либо в мкА, т. е. в зависимости от установленного диапазона выхода.
iRangeNumber определяет номер аналогового выхода, диапазон которого нужно изменить. Значение диапазона выбирается в выпадающем списке, соответствующем нужному выходу (см. рисунок).
wRANGE_W используется для хранения значения кода общего диапазона. Значение выбирается из выпадающего списка в визуализации и записывается в эту переменную (см. рисунок). После нажатия кнопки “Установить новый диапазон” (см. рисунок), предварительно выбрав в выпадающем списке “номер выхода” – “[5] Общий диапазон”, сработает триггер и значение из переменной будет записано в нужный регистр устройства. Для работы триггера и установки нового общего диапазона используется следующий код:
Фрагмент кода с переменной wRANGE_W
При записи общего диапазона срабатывает триггер “trig_all”. Если CLK:=xClicked_10 имеет значение TRUE (переменная xClicked_10 назначена как параметр свойства кнопки в визуализации: “конфигурация ввода” – “Нажатие” – “Переменная”, и значение этой переменной становится TRUE, если нажать на кнопку), значение xRun_all тоже становится TRUE (триггер устанавливает xRun_all:=TRUE если xClicked_10=TRUE). Далее если xRun_all=TRUE, значение переменной wRANGE_W записывается в переменную RANGE_W (строка кода 22, см. рисунок), которая присвоена каналу. Через канал из переменной RANGE_W записывается код общего диапазона в регистр 0x202 (202h).
Переменные wW0, wW1, wW2, wW3 используются так же, как wRANGE_W, но записывают диапазоны 0, 1, 2, 3 канала соответственно.
Переменная wSPEED_W записывает скорость нарастания выходного сигнала с помощью выбора нужного значения в выпадающем списке (в визуализации).
xClicked_10, xRun_10, xRun_all – вспомогательные переменные для триггеров. Триггерными переменными в соотнесении входов/выходов устройства вместо переменных “xRun_...” можно использовать “имя_триггера.CLK”.
4.1.6.3.Визуализация
Место в визуализации, где используется iRadioNumber
Место в визуализации, где используется iRangeNumber
Полностью готовая визуализация
4.1.7. Пример использования NLS-8AI
4.1.7.1.Настройка каналов и соотнесения входов/выходов устройства
Во вкладке “Канал Modbus Slave” необходимо добавить каналы, которые нужны для использования в проекте, задать код функции каждого канала в зависимости от цели использования и возможностей регистра, который связывается с CODESYS с помощью канала.
Для каналов, которые используются для записи значений в память модуля следует использовать триггер “по переднему фронту”. Для каналов, читающих данные с устройства и его датчиков, можно оставить триггер “цикл” и установить необходимое время для чтения. Например, при использовании цикла со значением 100 мс, информация, считываемая с устройства, будет обновляться каждые 100 мс. Не стоит устанавливать значение времени цикла меньше, чем поддерживает подключенное устройство или датчик.
Каналы, имена которых начинаются с “W_...” служат для записи значений (см. код функции в графе “тип доступа”. Каналы, имена которых начинаются с “R_...” служат для чтения данных с устройства).
Каналы на чтение/запись NL(S)-8AI
Соотнесение входов/выходов NLS-8AI, ч.1
Соотнесение входов/выходов NLS-8AI, ч.2
Соотнесение входов/выходов NLS-8AI, ч.3
4.1.7.2.Создание программы
Откройте файл программы в созданном проекте. Если в дереве устройств нет файла программы, то его нужно создать. Для этого нажмите правой кнопкой мыши по объекту “Application” (там же, в дереве устройств) – “Добавление объекта” – “POU”. Нужно объявить переменные.
Объявленные переменные в PLC_PRG
В коде программы есть комментарии. В самом проекте помимо PLC_PRG (файла с ST-кодом) есть 2 функции. WORD2_TO_REAL и REAL_TO_2WORD.
Функция WORD2_TO_REAL объединяет 2 WORD-переменных (WORD = 2 байта) в одну переменную REAL (REAL = 4 байта). Объединение можно провести с перестановкой батов, слов (по 2 байта) и без перестановки.
Входные параметры ф-ии WORD2_TO_REAL
Функция REAL_TO_2WORD разбивает одну переменную REAL на 2 переменных WORD с возможностью перестановки слов.
Входные параметры ф-ии REAL_TO_2WORD
Алгоритм, написанный на ST выполняет преобразование показаний с шестнадцати входов NLS-8AI из вида [2 переменных по 2 байта (т.к. система получает данные из двух 2-байтовых регистров)] в [одну переменную размером 4 байта]. И обрабатывает триггеры для записи значений из переменных в нужный регистр.
4.1.7.3.Визуализация
Полностью готовая визуализация NLS-8AI
4.1.8. Пример использования NLS-8TI
4.1.8.1.Настройка каналов и соотнесения входов/выходов устройства
Каналы, имена которых начинаются с “W_...” служат для записи значений (см. код функции в графе “тип доступа”. Каналы, имена которых начинаются с “R_...” служат для чтения данных с устройства).
Каналы на чтение/запись NL(S)-8TI
Соотнесение входов/выходов NLS-8TI, ч. 1
Соотнесение входов/выходов NLS-8TI, ч. 2
4.1.8.2.Создание программы
Откройте файл программы в созданном проекте. Если в дереве устройств нет файла программы, то его нужно создать. Для этого нажмите правой кнопкой мыши по объекту “Application” (там же, в дереве устройств) – “Добавление объекта” – “POU”. Нужно объявить переменные.
Объявленные переменные в PLC_PRG
Код программы состоит из триггеров, которые отвечают за реакцию на нажатие кнопок с целью изменения маски и диапазонов входных каналов.
4.37. Код программы
В коде используется функция WORD2_TO_REAL. Она переносит данные из двух 2-байтовых переменных в одну 4-байтовую. Есть возможность переноса данных с перестановкой байтов и слов.
4.1.8.3.Визуализация
Полностью готовая визуализация NLS-8TI
4.1.9. Пример использования NLS-4RTD-Ex
4.1.9.1.Настройка каналов и соотнесения входов/выходов устройства
Каналы, имена которых начинаются с “W_...” служат для записи значений (см. код функции в графе “тип доступа”. Каналы, имена которых начинаются с “R_...” служат для чтения данных с устройства).
Каналы на чтение/запись NL-4RTD-EX
Соотнесение входов/выходов NL-4RTD-EX, ч. 1
Соотнесение входов/выходов NL-4RTD-EX, ч. 2
4.1.9.2.Создание программы
Откройте файл программы в созданном проекте. Если в дереве устройств нет файла программы, то его нужно создать. Для этого нажмите правой кнопкой мыши по объекту “Application” (там же, в дереве устройств) – “Добавление объекта” – “POU”. Нужно объявить переменные.
Объявленные переменные в PLC_PRG
Код программы состоит из триггеров и вызовов функции WORD2_TO_REAL. Триггеры отвечают за реакцию на нажатие кнопок с целью считывания либо изменения параметров модуля. Вызовы функций отвечают за перенос данных из двух 2-байтовых переменных типа WORD в одну 4-байтовую переменную типа REAL.
4.1.9.3.Визуализация
Полностью готовая визуализация NL-4RTD-EX
4.1.10. Пример использования NLS-4C
Настройка каналов и соотнесения входов/выходов устройства
Каналы, имена которых начинаются с “W_...” служат для записи значений (см. код функции в графе “тип доступа”. Каналы, имена которых начинаются с “R_...” служат для чтения данных с устройства).
Каналы на чтение/запись NLS-4C
Соотнесение входов/выходов NLS-4C, ч. 1
Соотнесение входов/выходов NLS-4C, ч. 2
Соотнесение входов/выходов NLS-4C, ч. 3
Соотнесение входов/выходов NLS-4C, ч. 4
4.1.10.2.Создание программы
Откройте файл программы в созданном проекте. Если в дереве устройств нет файла программы, то его нужно создать. Для этого нажмите правой кнопкой мыши по объекту “Application” (там же, в дереве устройств) – “Добавление объекта” – “POU”. Нужно объявить переменные.
Объявленные переменные в PLC_PRG
Объявленные переменные в TRIG_TASK
Код программы разделен на 2 файла (PLC_PRG и TRIG_TASK). В одном файле содержится код преобразования данных из двух переменных формата WORD в одну переменную формата DWORD. В другом файле содержится множество триггеров, которые отвечают за запись значений в регистры по нажатию определенных кнопок в визуализации. Триггеры отвечают за реакцию на нажатие кнопок с целью считывания либо изменения параметров модуля. Вызовы функций отвечают за перенос данных из двух 2-байтовых переменных типа WORD в одну 4-байтовую переменную типа REAL.
4.1.10.3.Визуализация
Полностью готовая визуализация NLS-4C
4.2. Протокол Modbus TCP
Проекты с примерами работы с устройствами в среде разработки CODESYS 3.5 можно скачать на нашем сайте reallab.ru.
4.2.1. Основная работа в CODESYS
4.2.1.1.Подключение устройства
Подключитесь к ПЛК. В дереве устройств дважды кликните по “Device”. В основном окне нажмите кнопку “Сканировать сеть” и выберите ПЛК к которому хотите подключиться.
ПКМ (Правой кнопкой мыши) по "Device" в дереве устройств – Добавить устройство – Ethernet.
ПКМ по Ethernet – Добавить устройство – Modbus_TCP_Master.
ПКМ по Modbus_Master_COM_Port – Добавить устройство – [выберите ваше устройство из списка].
Двойной клик по Ethernet – “Конфигурация Ethernet” – установите параметры: интерфейс сети, IP-адрес, маска, Gateway. Сделать это можно с помощью нажатия на “…” справа от поля ввода “Интерфейс сети”. Откроется всплывающее окно “Сетевые адаптеры”. Выберите нужный вам интерфейс и нажмите ОК.
Пример параметров Modbus для подключения
Далее дважды кликните по “Modbus_TCP_Master” в дереве устройств. Поставьте галочку на “автоподключение” во вкладке “Общее”.
Дважды кликните по названию модуля в дереве устройств. Во вкладке "Общее" необходимо указать Unit-ID модуля, его IP-адрес, таймаут ответа и порт.
4.2.1.2.Каналы Modbus Slave
Во вкладке “Канал Modbus Slave” необходимо добавить каналы, которые нужны для использования в проекте, задать код функции для каждого канала в зависимости от цели использования и возможностей регистра, который связывается с CODESYS с помощью канала.
Добавление канала Modbus Slave
Для каналов, которые используются для записи значений в память модуля, рекомендуется использовать триггер “по переднему фронту”. Для каналов, читающих данные с устройства и его датчиков, можно оставить триггер “цикл” и установить необходимое время для чтения. Например, при использовании цикла со значением 100 мс, информация, считываемая с устройства, будет обновляться каждые 100 мс. Не стоит устанавливать значение времени цикла меньше, чем поддерживает подключенное устройство или датчик.
Удобно, когда каналы, имена которых начинаются с “W_...” служат для записи значений (см. код функции в графе “тип доступа”). Каналы, имена которых начинаются с “R_...” служат для чтения данных с устройства.
Чтобы добавить канал, во вкладке вашего устройства “Канал Modbus Slave” нажмите “Добавить канал…”. Введите его имя, укажите тип доступа, триггер, время цикла (если триггер: цикл), сдвиг и длину.
4.2.1.3.Использование функций в программах
Функция WORD2_TO_REAL объединяет 2 WORD-переменных (WORD = 2 байта) в одну переменную REAL (REAL = 4 байта). Объединение можно провести с перестановкой байтов, слов (по 2 байта) и без перестановки.
Входные параметры функции WORD2_TO_REAL
Функция REAL_TO_2WORD разбивает одну переменную REAL на 2 переменных WORD с возможностью перестановки слов.
Входные параметры функции REAL_TO_2WORD
4.2.2. Пример использования NLS-16DI-Ethernet
4.2.2.1.Настройка каналов и соотнесения входов/выходов устройства
Дерево устройств – Ethernet – Modbus_TCP_Master – NLS-16DI_Ethernet, во вкладке "ModbusGenericSerialSlave Соотнесение входов/выходов".
Каналы модуля NLS-16DI-Ethernet
Соотнесение входов/выходов модуля NL(S)-16DI-Ethernet
В параметрах соотнесения входов/выходов можно присваивать каналам и их составляющим не только переменные, которые нигде не объявлены, но и уже объявленные в программе.
4.2.2.2.Визуализация
Полностью готовая визуализация NLS-16DI-Ethernet
4.2.3. Пример использования NLS-16DO-Ethernet
4.2.3.1.Настройка каналов и соотнесения входов/выходов устройства
Каналы NLS-16DO-Ethernet
Дерево устройств – Ethernet – Modbus_TCP_Master – NLS-16DO_Ethernet, во вкладке "ModbusGenericSerialSlave Соотнесение входов/выходов".
Соотнесение входов/выходов NLS-16DO-Ethernet
В параметрах соотнесения входов/выходов можно присваивать каналам и их составляющим не только переменные, которые нигде не объявлены, но и уже объявленные в программе.
4.2.3.2.Настройка каналов и соотнесения входов/выходов устройства
Помимо индикаторов здесь используются клавишные переключатели. На них назначены переменные W0, W1, W2, …, W15 из соотнесения входов/выходов.
Полностью готовая визуализация NLS-16DO-Ethernet
4.2.4. Пример использования NLS-8R-Ethernet
4.2.4.1.Настройка каналов и соотнесения входов/выходов устройства
Каналы на чтение/запись модуля NL(S)-8R-Ethernet
Дерево устройств – Modbus_COM – Modbus_Master_COM_Port – NLS-16DO, во вкладке "ModbusGenericSerialSlave Соотнесение входов/выходов".
Соотнесение входов/выходов модуля NL(S)-8R-Ethernet
В параметрах соотнесения входов/выходов можно присваивать каналам и их составляющим не только переменные, которые нигде не объявлены, но и уже объявленные в программе.
4.2.4.2.Визуализация
Полностью готовая визуализация NLS-8R-Ethernet
4.2.5. Пример использования NLS-4AO-Ethernet
4.2.5.1.Настройка каналов и соотнесения входов/выходов устройства
Дерево устройств – Ethernet – Modbus_TCP_Master – NLS-4AO_Ethernet, во вкладке "ModbusGenericSerialSlave Соотнесение входов/выходов".
Каналы на чтение/запись NLS-4AO-Ethernet
Соотнесение входов/выходов NLS-4AO-Ethernet, ч. 1
Соотнесение входов/выходов NLS-4AO-Ethernet, ч. 2
Соотнесение входов/выходов NLS-4AO-Ethernet, ч. 3
Соотнесение входов/выходов NLS-4AO-Ethernet, ч. 4
4.2.5.2.Создание программы
В дереве устройств дважды кликните по файлу вашей программы, например “PLC_PRG”. Откроется редактор кода. Если в дереве устройств нет файла программы, то его нужно создать. Для этого нажмите правой кнопкой мыши по объекту “Application” (там же, в дереве устройств) – “Добавление объекта” – “POU”.
В редакторе кода есть верхняя и нижняя части. В верхней части нужно объявлять переменные, а в нижней – писать сам алгоритм, который циклически выполняется модулем.
Объявим переменные для взаимодействия с нашим модулем NLS-4AO-Ethernet:
Объявление переменных программы
Переменные типа данных INT: iOutNumber, iPowerNumber, iSafeNumber, iRangeNumber, iSpeedNumber. В них записываются значения номеров выходов, для которых устанавливаются параметры: значения напряжения/силы тока на выходах (iOutNumber), значения напряжения/силы тока на выходах при запуске (Power On - iPowerNumber) и при срабатывании сторожевого таймера (Safe Value - iSafeNumber), коды диапазонов (iRangeNumber), скорость нарастания выходного сигнала (iSpeedNumber).
Массивы: RANGE_ARR и SPEED_ARR используются для записи диапазонов выходов и скоростей нарастания в память модуля (через каналы в регистры).
Триггеры: trig_out, trig_power, trig_safe, trig_range, trig_speed. Нужны для записи значений в память модуля. При нажатии на кнопку записи определенных данных срабатывает один из триггеров. Триггерная переменная, указанная для каждого канала записи принимает значение TRUE и данные записываются в нужный регистр модуля.
Переменные: xClicked_Out, xClicked_Power, xClicked_Safe, xClicked_Range, xClicked_Speed, xRun_Out, xRun_Power, xRun_Safe, xRun_Range, xRun_Speed, являются дополнением к триггерам. “xClicked_...” установлены в визуализации на кнопки, при нажатии на которые эти переменные принимают значение TRUE.
Оставшиеся массивы по две WORD-переменные (2 элемента по 2 байта) нужны для хранения значений выходов (текущие значения, значения Power On и Safe Value), т.к. значения хранятся в FLOAT (4 байта). Данные выходов разбиты по двум регистрам по 2 байта для каждого выхода. Чтобы данные удобно было читать, нужно переносить их из двух 2-байтовых переменных в одну 4-байтовую. Это делается с помощью функции WORD2_TO_REAL. Обратная конвертация из одной REAL переменной в две WORD переменных выполняется функцией REAL_TO_2WORD.
Функция WORD2_TO_REAL объединяет 2 WORD-переменных (WORD = 2 байта) в одну переменную REAL (REAL = 4 байта). Объединение можно провести с перестановкой батов, слов (по 2 байта) и без перестановки.
Входные параметры функции WORD2_TO_REAL
Функция REAL_TO_2WORD разбивает одну переменную REAL на 2 переменных WORD с возможностью перестановки слов.
Входные параметры функции REAL_TO_2WORD
4.2.5.3.Визуализация
Полностью готовая визуализация NLS-4AO-Ethernet
4.2.6. Пример использования NLS-8AI-Ethernet
4.2.6.1.Настройка каналов и соотнесение входов/выходов устройства
Дерево устройств – Ethernet – Modbus_TCP_Master – NLS-4AI_Ethernet, во вкладке "ModbusGenericSerialSlave Соотнесение входов/выходов".
Каналы на чтение/запись NLS-8AI-Ethernet
Соотнесение входов/выходов NLS-8AI-Ethernet, ч. 1
Соотнесение входов/выходов NLS-8AI-Ethernet, ч. 2
4.2.6.2.Создание программы
Откройте файл программы в созданном проекте. Если в дереве устройств нет файла программы, то его нужно создать. Для этого нажмите правой кнопкой мыши по объекту “Application” (там же, в дереве устройств) – “Добавление объекта” – “POU”. Нужно объявить переменные.
Объявление переменных с комментариями
Код программы содержит инициализацию триггеров и функции конвертации данных из двух WORD-переменных в одну типа REAL.
Код программы для примера работы с модулем NLS-8AI-Ethernet
Работа с переменными, объявленными в соотнесении входов/выходов, проходит в визуализации (переменные такие как, например, R_RANGE_0, привязаны к элементам визуализации, отображающим и позволяющим изменять значение этих переменных).
4.2.6.3.Визуализация
Полностью готовая визуализация NLS-8AI-Ethernet
4.2.7. Пример использования NLS-16AI-I (Ethernet)
4.2.7.1.Настройка каналов и соотнесение входов/выходов устройства
Дерево устройств – Ethernet – Modbus_TCP_Master – NLS-16AI-I_Ethernet, во вкладке "ModbusGenericSerialSlave Соотнесение входов/выходов".
Каналы на чтение/запись NLS-16AI-I-Ethernet
Соотнесение входов/выходов NLS-16AI-I-Ethernet, ч. 1
Соотнесение входов/выходов NLS-16AI-I-Ethernet, ч. 2
4.2.7.2.Создание программы
В дереве устройств дважды кликните по файлу вашей программы, например “PLC_PRG”. Откроется редактор кода. Если в дереве устройств нет файла программы, то его нужно создать. Для этого нажмите правой кнопкой мыши по объекту “Application” (там же, в дереве устройств) – “Добавление объекта” – “POU”.
В редакторе кода есть верхняя и нижняя части. В верхней части нужно объявлять переменные, а в нижней – писать сам алгоритм, который циклически выполняется модулем.
Объявим переменные для взаимодействия с нашим модулем NLS-16AI-I:
Объявление переменных с комментариями
Код программы содержит инициализацию триггера и функции конвертации данных из двух WORD-переменных в одну типа REAL.
Код программы для примера работы с модулем NLS-16AI-I-Ethernet
Работа с переменными, объявленными в соотнесении входов/выходов, проходит в визуализации (переменные такие как, например, R_RANGE_0, привязаны к элементам визуализации, отображающим и позволяющим изменять значение этих переменных).
4.2.7.3.Визуализация
Полностью готовая визуализация NLS-16AI-I-Ethernet
4.2.8. Пример использования NLS-4RTD (Ethernet-2P)
4.2.8.1.Настройка каналов и соотнесения входов/выходов устройства
Каналы на чтение/запись NLS-4RTD-Ethernet
Соотнесение входов/выходов NLS-4RTD-Ethernet, ч. 1
Соотнесение входов/выходов NLS-4RTD-Ethernet, ч. 2
4.2.8.2.Создание программы
В дереве устройств дважды кликните по файлу вашей программы, например “PLC_PRG”. Откроется редактор кода. Если в дереве устройств нет файла программы, то его нужно создать. Для этого нажмите правой кнопкой мыши по объекту “Application” (там же, в дереве устройств) – “Добавление объекта” – “POU”.
В редакторе кода есть верхняя и нижняя части. В верхней части нужно объявлять переменные, а в нижней – писать сам алгоритм, который циклически выполняется модулем.
Объявим переменные для взаимодействия с нашим модулем
NLS-4RTD-Ethernet:
Объявление переменных с комментариями
Код программы содержит инициализацию триггера и функции конвертации данных из двух WORD-переменных в одну типа REAL .
Код программы для примера работы с модулем NLS-4RTD-Ethernet
4.2.8.3.Визуализация
Полностью готовая визуализация NLS-4RTD-Ethernet
4.2.9. Пример использования NLS-8TI (Ethernet)
4.2.9.1.Настройка каналов и соотнесения входов/выходов устройства
Каналы на чтение/запись NLS-8TI-Ethernet
Соотнесение входов/выходов NLS-8TI-Ethernet, ч. 1
Соотнесение входов/выходов NLS-8TI-Ethernet, ч. 2
4.2.9.2.Создание программы
В дереве устройств дважды кликните по файлу вашей программы, например “PLC_PRG”. Откроется редактор кода. Если в дереве устройств нет файла программы, то его нужно создать. Для этого нажмите правой кнопкой мыши по объекту “Application” (там же, в дереве устройств) – “Добавление объекта” – “POU”.
В редакторе кода есть верхняя и нижняя части. В верхней части нужно объявлять переменные, а в нижней – писать сам алгоритм, который циклически выполняется модулем.
Объявим переменные для взаимодействия с нашим модулем NLS-8TI-Ethernet:
Объявление переменных с комментариями
Код программы содержит инициализацию триггера и функции конвертации данных из двух WORD-переменных в одну типа REAL.
4.2.9.3.Визуализация
Полностью готовая визуализация NLS-8TI-Ethernet
4.3. Протокол CANOpen
Проекты с примерами работы с устройствами в среде разработки CODESYS 3.5 можно скачать на нашем сайте reallab.ru.
4.3.1. Подключение устройства CAN
Создайте новый проект. Подключитесь к ПЛК. В дереве устройств дважды кликните по “Device”. В основном окне нажмите кнопку “Сканировать сеть” и выберите ПЛК к которому хотите подключиться.
ПКМ (Правой кнопкой мыши) по "Device" в дереве устройств – Добавить устройство – CANbus - CANbus.
ПКМ по CANbus – Добавить устройство – CANopen – CANopenManager – CANopen_Manager.
ПКМ по CANopen_Manager – Добавить устройство – [выберите ваше устройство из списка].
Двойной клик по CANbus – Общее – установите параметры: сеть, скорость передачи.
Двойной клик по CANopen_Manager – установите параметры как на рисунке.
Пример параметров CANopen_Manager для подключения
Если Вам необходимо, чтобы после запуска проекта, все подключенные CAN устройства запускались сразу, а не находились в состоянии конфигурации, установите галочку “NMT Запустить все (если возможно)”.
4.3.2. Настройка параметров PDO / SDO
Дважды кликните по имени вашего модуля в дереве устройств. Вам понадобятся вкладки: PDO, SDO, CANopen Соотнесение входов/выходов. PDO (объект данных процесса) и SDO (объект данных службы): CANopen определяет два основных метода связи: PDO и SDO.
PDO используются для обмена данными между устройствами в режиме реального времени, обеспечивая быструю и эффективную передачу важной информации.
SDO, с другой стороны, используются для настройки и доступа к параметрам и настройкам устройства, обеспечивая структурированный метод для удаленной настройки устройства.
>4.3.2.1.PDO
Протокол PDO это протокол обмена данными между узлами сети. Длина данных 8 байт. Протокол PDO определяет формат данных в зависимости от настроек PDO. Протокол PDO соответствует CANopen application layer and communication profile CiA 301.
Важно! Кадры протокола PDO обрабатываются только в рабочем состоянии.
Протокол PDO включает в себя два вида кадров данных TPDOn (передаваемые) и RPDO (принимаемые). Каждый вид кадров включает в себя по четыре независимых потока. Каждый поток имеет параметры коммуникации и параметры сопоставления.
Пример PDO модуля NLS-16DI-CAN
Чтобы добавить соотнесение в PDO, нажмите “ + Добавить соотнесение” в верхней части интерфейса программы. Один объект RPDO/TPDO может иметь максимальную битовую длину, размером 64 бита.
4.3.2.2.SDO
Протокол SDO определяет команды доступа к объектам SDO. Протокол SDO соответствует CANopen application layer and communication profile CiA 301.
Важно! Кадры протокола SDO не обрабатываются, когда устройство находится в состоянии остановки.
Важно! Кадры протокола SDO с командой записи обрабатываются, только когда устройство находится в состоянии конфигурирования.
Обмен данными протокола SDO производится в режиме клиент – сервер. Устройство является сервером SDO, а ведущее устройство сети - клиентом SDO. Инициатором обмена выступает клиент SDO и на каждый запрос сервер генерирует ответ (если устройство не может предоставить какие-либо значимые данные, или если запрос сам по себе был ошибочным, то сервер SDO передаст информацию об ошибке).
Важно! Снимите флажок с пункта “Записать полную конфигурацию PDO”, при установке флажка на пункт “Включить защиту узла” во вкладке “Общее” – “Защита узла”. Иначе есть риск, что модуль будет перезапускаться сам по себе и перестанет отвечать на запросы ведущего устройства.
Вкладка SDO
Внимание! Если в вашей программе (в визуализации) уже реализовано управление состояниями модуля и редактирование параметров SDO, снимите флажок с пункта “Создать все SDO” т.к. данная вкладка имеет больший приоритет выполнения, чем работа с SDO с помощью кода самой программы, и каждый раз когда устройство будет перезапускаться, параметры SDO будут взяты с таблицы данной вкладки, что очень неудобно в определенных случаях. Примеры управления модулем, его состоянием и параметрами SDO с помощью кода, включены в примеры использования модулей серии CAN: NLS-8AI, NLS-8TI, NLS-8AI-I, NLS-4RTD, NLS-4AO.
4.3.3. Использование функций в программах
4.3.3.1.Функция WORD2_TO_REAL
Функция WORD2_TO_REAL объединяет 2 WORD-переменных (WORD = 2 байта) в одну переменную REAL (REAL = 4 байта). Объединение можно провести с перестановкой байтов, слов (по 2 байта) и без перестановки. Данную функцию можно использовать также и для перемещения информации из массива байтов, размерностью 4 байта, в 4 байтовую переменную. Или можно использовать упрощенный вариант данной функции – BYTE4_TO_REAL.
Входные параметры функции WORD2_TO_REAL
4.3.3.2.Функция BYTE4_TO_REAL
Функция BYTE4_TO_REAL объединяет 4 BYTE переменных в одну переменную типа REAL (4 байта). Объединение производится без перестановки байтов. Данную функцию можно заменить функцией WORD2_TO_REAL. Также эта функция может перемещать данные из любой 4-байтовой переменной в массив, размерностью 4 байта (например, массив из 4-х BYTE переменных).
Входные параметры функции BYTE4_TO_REAL
4.3.3.3.Пример использования функции в программе
В примерах использования модулей, где используются функции работы с SDO в коде программы, пригодится использование данной функции. Пример: Необходимо записать значение объекта 6423h (включение/выключение глобального прерывания аналогового входа). Для этого необходимо: объявить переменную-функциональный блок, массив из 4-х байтов по индексам от 1 до 4, переменную типа REAL, а также переменную-триггер, которая будет присвоена кнопке. При нажатии на кнопку, в SDO будет записано значение объекта 6423h, которое будет применено к модулю после сохранения параметров и перезапуска модуля.
Необходимо будет перенести данные из переменной типа REAL в 4-байтовый массив (массив BYTE на 4 элемента). Для этого и пригодится функция BYTE4_TO_REAL. Массив байтов размером 4 элемента используется для записи данных об объекте 6423h функциональным блоком SDO_WRITE4.
Пример использования функции BYTE4_TO_REAL
4.3.4. Управление состоянием устройства в CODESYS
Для того, чтобы управлять состоянием устройства в CODESYS, необходимо выполнить следующие шаги:
- Создать визуализацию;
- Добавить в визуализацию кнопки, с помощью которых планируется управлять состоянием устройства;
- Написать код для каждой кнопки, который будет выполняться по ее нажатию.
Для создания кнопки в визуализации достаточно перейти в раздел “Стандартные элементы управления” в панели инструментов визуализации и перетащить кнопку в окно конструктора визуализации. Задайте кнопке размеры, свойства цвета и шрифта, если требуется. Объявите логическую (BOOL) переменную, которая будет менять своё состояние при нажатии на кнопку, в коде программы. Далее, в свойствах кнопки, выберите пункт “Конфигурация ввода – Нажатие – Переменная” и укажите там объявленную вами переменную.
Назначение переменной кнопке
Чтобы полноценно управлять состоянием подключенного устройства, достаточно кнопок:
- Стоп;
- Старт;
- Перезапустить модуль;
- Перевести устройство в режим конфигурации.
Также можно добавить кнопку перезапуска соединения.
Следующий шаг – объявление переменных для остальных кнопок и переменной (функционального блока) для передачи NMT-команд.
Объявленные переменные для управления состоянием модуля
Входные параметры функционального блока (ФБ) NMT, включенного в библиотеку CIA405:
Номер сети, переменная-триггер (назначается на нажатие кнопки), тайм-аут, ID подключенного устройства, состояние (точнее, его код), в которое перейдет модуль после выполнения команды.
Выходные параметры ФБ NMT: логическая переменная CONFIRM, значение которой показывает, успешно ли выполнена команда (1, если да, а иначе – 0), и переменная, отображающая код ошибки, в случае неудачного выполнения команды.
Коды состояний устройства CAN:
- Старт – 16#5;
- Стоп – 16#4;
- Состояние конфигурации – 16#7F;
- Перезапуск модуля – 16#6;
- Перезапуск соединения – 16#7.
Приведенные выше значения в исходном столбце не отображают значения спецификации CiA 405. При использовании специального оборудования для мониторинга передачи данных сообщений NMT будут отображаться значения как на рисунке.
Значения состояний устройства, указанные в спецификации
Входные и выходные параметры функционального блока NMT
Основной код программы, отвечающий за управление модулем.
Пример визуализации управления модулем NLS-16DI-CAN
4.3.5. Протоколы, используемые в работе CAN модулей
4.3.5.1.Протокол Heartbeat (Сердцебиение)
Протокол определяет службу контроля над ошибками (Error Control Service) без необходимости использования удалённых запросов.
Механизм Heartbeat (“сердцебиение”) для устройства CANopen устанавливается путем циклической передачи в миллисекундах сообщения о работе устройства без сбоев и ошибок, что позволяет своевременно сообщить пользователю о сбое в работе устройства. Если цикл Heartbeat завершится сбоем для устройства, генерирующего “сердцебиение”, т.е. heartbeat-сообщение не будет передано, потребитель “сердцебиения” будет проинформирован об этом событии.
Несмотря на то, что по умолчанию как сердцебиение, так и защита отключены, рекомендуется использовать эти механизмы контроля ошибок.
Для активации протокола Heartbeat в CODESYS необходимо выполнить следующие шаги:
- Открыть проект CODESYS и дважды кликнуть по названию устройства, для которого нужно активировать данный протокол;
- Открыть вкладку “Общее”;
- Установить флажок на пункт “Включить генерацию сердцебиения;
- Установить частоту, с которой Ваше устройство будет отправлять heartbeat-сообщения потребителю heartbeat о работе без ошибок и сбоев.
Частота: Период времени в миллисекундах, с которым узел будет передавать в сеть сообщение Heartbeat. Идентификатор сообщения Heartbeat: 16#700+NodeID. Сообщение содержит байт текущего состояния узла: 4 (STOPPED), 5 (OPERATIONAL), 127 (PRE-OPERATIONAL) Значение по умолчанию равно 0, что означает отсутствие передачи Heartbeat-сообщения.
Частоту отправки heartbeat-сообщений можно так же установить с помощью SDO-объекта 1017h – Producer Heartbeat time (Время поставщика соединения).
Протокол Heartbeat активирован и работает с частотой 200 мс
CANopenManager (ведущее устройство) также может посылать heartbeat-сообщения. Для активации во вкладке “Общее” CANopenManager’а необходимо установить флажок на “Включить генерацию сердцебиения”.
Важно! Когда вы вставляете устройство с функцией сердцебиения, его параметры приводятся в соответствие с мастером (CANopenManager).
Важно! В случае активации протокола Heartbeat протокол Guard не используется.
Важно! Устройство не может выступать в роли ведомого устройства в протоколе Heartbeat.
Для настройки Heartbeat-протокола в параметрах CANopenManager’а, точно так же необходимо установить флажок “Включить генерацию сердцебиения”. В CANopenManager’е это работает следующим образом:
Мастер отправляет сообщения сердцебиения, которые определяют временной интервал в поле “Частота”. Если для ведомых устройств включена функция сердцебиения, для ведущего устройства создается объект потребления сердцебиения от ведомого. При этом применяются ID узла и интервал сердцебиения 1.5x.
4.3.5.2.Протокол Guard (Защита узла)
Защита узла: С помощью этого протокола сообщения (удаленные кадры CAN) отправляются ведущим NMT, существующим ведомым устройствам CANopen. Ведомые устройства должны отвечать на эти сообщения в течение определенного времени. Если ответа нет, то это регистрируется мастером NMT как сбой/ошибка. Поскольку, как правило, следует избегать удаленных кадров CAN, предпочтительнее мониторинг с помощью сердцебиения (протокола Heartbeat).
Протокол Guarding используется для индикации устройства в сети CAN в формате запрос-ответ. Ведущее устройство генерирует запрос, в формате кадра RTR с идентификатором 700h + Node-ID, после получения которого устройство формирует ответный кадр в формате, представленном в Табл. 24.
Табл. 24. Протокол Guarding
COB-ID
|
Длина данных
|
Байт 0
|
700h+ID
|
1
|
Бит 7
|
Биты 6-0
|
Контроль четности
Toggle-bit
|
Текущее состояние устройства
04h – остановлен
05h – рабочее
7Fh - конфигурирования
|
Для активации протокола необходимо задать значение объекта “Время защиты сети (Guard Time)” не равное 0, для определения времени ожидания кадра до момента фиксации ошибки коммуникации в мс. Значение может быть увеличено с помощью объекта “Множитель времени защиты сети” (Life Time Factor).
Также активировать данный протокол можно с помощью установки флажка “Защита узла” во вкладке “Общее” CANopenManager’а в дереве устройств CODESYS, там же можно настроить остальные параметры этого протокола.
После установки галочки “Включить защиту узла” и запуска программы, CANopenManager отправляет сообщение ведомому устройству с интервалом “Интервал (мс)”. Если слейв не отвечает с заданным COB-ID (идентификатор объекта связи), CANopenManager повторно отправляет это сообщение столько раз, сколько задано в параметре “Время жизни”, или до тех пор, пока не ответит ведомое устройство.
Если ведомое устройство не отвечает, оно помечается как “недоступное”.
Активация протокола защиты узла
При активации устройство ожидает кадр в течении Time. Расчёт времени синхронизации происходит в зависимости от параметров (табл. 25).
Табл. 25. Параметры для расчета времени синхронизации
|
Guard Time = 00h
|
Guard Time ≠ 00h
|
Life Time Factor = 00h
|
Защита сети отключена
|
Time = Guard Time
|
Life Time Factor ≠ 00h
|
Time = Guard Time * Life Time Factor
|
В случае если время ожидания превысило установленное время устройство генерирует ошибку коммуникации.
Важно! В случае активации протокола Heartbeat протокол Guard не используется.
Важно! Устройство не может выступать в роли ведущего устройства в протоколе Guard.
4.3.5.3.Протокол SYNC
Важно! Устройство не может выступать в роли ведущего устройства в протоколе SYNC. Устройство не формирует кадр протокола SYNC.
Устройство принимает кадры протокола SYNC с адресом, указанным в объекте “Идентификатор коммуникационного” объекта, посылок синхронизации (COB-ID SYNC message) индекс 1005h и имеющие длину 0 байт
После приёма кадра протокола SYNC устройство производит наращивание счётчика SYNC кадров для каждого из TPDO отдельно. Если в режиме приёма TPDO установлено значения от 00h - F0h (устройство ожидает указанное количество кадров SYNC после чего обновляет данные и передаёт кадр TPDO) или FCh (в данном режиме устройство ожидает кадр SYNC, после чего обновляет данные, и отправляет кадр TPDO после получения кадра типа RTR).
Для активации протокола, перейдите во вкладку “Общее” CANopenManager’а и установите флажок “Синхронная генерация” и установите значения нужных вам параметров.
Параметры SYNC протокола в CANopenManager