info@reallab.ru                                   +7 (495) 26-66-700 (многоканальный)              +7 (928) 289-24-86 (WA), +7 (961) 427-15-45 (дополнительные номера)
RealLab — Эффективная безопасностьтехнологических процессов
Российское оборудование и системы
промышленной автоматизации
0
ИТОГО
0 Р
В том числе НДС
0,00 Р
Ваша корзина пуста. Добавить товары в корзину.

Программирование ПЛК RealLab! в среде CODESYS 3.5

 Открыть документ в формате PDF

1. Вводная часть

 

1.1. Введение

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

Документ соответствует версии среды разработки CODESYS V3.5 SP16 Patch 4.

 

1.2. Общие сведения о CODESYS V3.5

CODESYS представляет собой комплекс программ для проектирования прикладного ПО, отладки в режиме эмуляции и загрузки программы в ПЛК. Основными частями системы являются среда разработки программы и среда ее исполнения (CODESYS SP), которая находится в ПЛК.

В CODESYS входят графические и текстовые редакторы для всех пяти языков МЭК 61131–3. Этот комплекс полностью реализует требования стандарта и дополнительно вводит ряд оригинальных расширений, самым удобным из которых является объектно-ориентированные программирование.

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

Программа, написанная на языках МЭК, компилируется системой CODESYS в машинный код, оптимизированный для заданной аппаратной платформы. Компилятор выдает диагностические сообщения как на этапе компиляции, так и на этапе ввода операторов языка.

При отсутствии реального контроллера отладку программы можно выполнять с помощью встроенного программного эмулятора.

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

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

Помимо средств программирования, CODESYS имеет встроенную систему визуализации, которая применяется для операторского управления, а также моделирования на этапе разработки. Визуализацию можно запустить на компьютере, графической панели ПЛК или встроенном в контроллер web-сервере.

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

Для систем, связанных с безопасностью, CODESYS имеет библиотеку функциональных блоков PLCopen Safety, систему исполнения для оборудования с дублированием и специализированное расширение среды программирования. При внезапном отключении питания CODESYS автоматически сохраняет значения переменных во флеш-памяти или в ОЗУ с батарейным питанием.

 

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

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

Требование: Задан активный путь к контроллеру.

  1. Установите дополнение CODESYS Security Agent.
  2. Щелкните Вид ‣ Экран безопасности.
  3. Выберите вкладку «Устройства».
  4. Выберите контроллер в левом представлении.

В правом представлении отображаются все службы контроллера, для которых требуется сертификат.

  1. Выберите службу сервера OPC UA.
  2. Создайте новый сертификат для устройства. Для этого щелкните значок.

Откроется диалоговое окно «Настройки сертификата».

  1. Определите параметры сертификата и нажмите OK, чтобы закрыть диалоговое окно.

Сертификат создан на контроллере (на рисунке).

  1. Перезапустите систему выполнения.


Сертификат создан

 

3.7.3. Настройка зашифрованного соединения с клиентом UaExpert

Клиент OPC UA «UaExpert» представляет собой свободное доступное ПО, которое можно загрузить из Интернета. Этот клиент можно использовать для подключения к серверу CODESYS OPC  UA. Следующее описание относится к этой программе. Другие клиенты OPC UA работают аналогичным образом.

  1. Запустите программу UaExpert.
  2. Щелкните Сервер «Добавить» и откроется диалоговое окно «Добавить сервер».
  3. Разверните Локальный ‣ OPUAServer@… в древовидном представлении.
  4. Выберите тип подключения Basic256Sha256 — Sign & Encrypt (uatcp-uasc-uabinary) и нажмите «OK», чтобы закрыть диалоговое окно.


Выбор типа подключения

  1. Щелкните Сервер «Подключить» и откроется диалоговое окно проверки сертификата с сообщением об ошибке.
  2. Выберите параметр «Временно принять сертификат сервера для этого сеанса» и нажмите «Продолжить».
  3. В среде разработки CODESYS щелкните символ и изображение обновится.
  4. Выберите папку «Сертификаты на карантине». Сертификат клиента UaExpert@… отображается справа.


Сертификаты на карантине

  1. Перетащите сертификат в папку «Доверенные сертификаты». Теперь сертификат клиента классифицируется сервером как доверенный.
  2. Щелкните Сервер «Подключить в клиенте UaExpert». Откроется диалоговое окно проверки сертификата с сообщением об ошибке.
  3. Выберите параметр «Временно принять сертификат сервера для этого сеанса» и нажмите «Продолжить». Соединение установлено, и объекты отображаются в представлении «Адресное пространство».

 

3.7.4. Использование клиента OPC UA Server для изменения переменной

  1. Разверните объект Objects ‣ DeviceSet ‣ CODESYS OPC UA ‣ Application ‣ Global Vars ‣ GVL в клиенте UaExpert представления Address Space. Переменные списка глобальных переменных видны.
  2. Выберите переменные и перетащите их в представление доступа к данным. Отображаются переменные и их текущие значения.


Переменные в UaExpert

  1. Измените значения переменных, дважды щелкнув поле «Значение».

 

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:

  • SysSocket;
  • CmpErrors.

Для описания совместной работы серверного и клиентского 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 требуется следующее:

  1. Создать новое подключение к брокеру;


Создание нового подключения в MQTTX

  1. Указать имя подключения (Name), адрес брокера (Host), номер порта (Port) и версию протокола, соответствующую используемой библиотеке (MQTT Version = 3.1.1). Затем в правом верхнем углу — подключение (Connect).


Настройка подключения к брокеру broker.hivemq.com

При успешном подключении появится уведомление и окно MQTTX примет вид:


Вид окна MQTTX при успешном подключении к брокеру

  1. Для подписки на топик нужно выбрать New Subscription и указать название топика, например, mqttTest_pub. Далее — подтвердить подписку (Confirm).

Выбор топика для подписки

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

Прием сообщения в MQTTX

  1. Для отправки сообщения нужно использовать нижнюю часть окна 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 выполнено следующее:

  1. Создан экземпляр функционального блока (ФБ) мастера (клиента) ModbusFB.ClientSerial;

client : ModbusFB.ClientSerial;

  1. Созданы экземпляры ФБ для отправки запросов мастером:
  • чтение регистров хранения (ФБ ModbusFB.ClientRequestReadHoldingRegisters);
  • чтение входных регистров (ФБ ModbusFB.ClientRequestReadInputRegisters);

clientRequestReadHoldingRegisters: ModbusFB.ClientRequestReadHoldingRegisters; clientRequestReadInputRegisters : ModbusFB.ClientRequestReadInputRegisters;

  1. Созданы массивы данных для подготовки значений, записываемых в регистры хранения слейва, и для хранения считанных из слейва значений регистров хранения и входных регистров;

aUINT_holding: ARRAY [0..1] OF UINT; aUINT_input: ARRAY [0..1] OF UINT;

  1. Настройка мастера: настройка номера 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);

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

clientRequestReadHoldingRegisters(rClient:=client,

uiUnitId:=9, uiStartItem:=16#0200, uiQuantity:=1, pData:=ADR(aUINT_holding[0]));

  1. После того, как мастер и запросы настроены, требуется циклически вызывать экземпляр 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 выполнено следующее:

  1. Создан экземпляр функционального блока (ФБ) мастера (клиента) ModbusFB.ClientSerial;

client: ModbusFB.ClientSerial;

  1. Созданы экземпляры ФБ для отправки запросов мастером:
  • чтение регистров хранения (ФБ ModbusFB.ClientRequestReadHoldingRegisters);
  • чтение входных регистров (ФБ ModbusFB.ClientRequestReadInputRegisters);
  • запись регистров хранения (ФБ ModbusFB.ClientRequestWriteMultipleRegisters);

clientRequestReadHoldingRegisters : ModbusFB.ClientRequestReadHoldingRegisters; clientRequestReadInputRegisters : ModbusFB.ClientRequestReadInputRegisters; clientRequestWriteMultipleRegisters : ModbusFB.ClientRequestWriteMultipleRegisters

  1. Созданы массивы данных для подготовки значений, записываемых в регистры хранения слейва, и для хранения считанных из слейва значений регистров хранения и входных регистров;

aUINT_holding : ARRAY [0..10] OF UINT;
aUINT_input : ARRAY [0..10] OF UINT;
aUINT_multiple : ARRAY [0..10] OF UINT;

  1. Настройка мастера: настройка номера 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);

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

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 выполнено следующее:

  1. Создан экземпляр функционального блока (ФБ) мастера (клиента) ModbusFB.ClientSerial;

serverSerial: ModbusFB.ServerSerial;

  1. Созданы экземпляр ФБ ModbusFB.ExampleDataModel для формирования модели данных слейва — набора регистров, доступных для обмена данными по Modbus RTU.

exampleDataModel: ModbusFB.ExampleDataModel;

Модель данных ModbusFB.ExampleDataModel является примером формирования набора регистров для слейва и включает следующие секции:

  • discrete inputs;
  • coils;
  • input registers;
  • holding registers.

Каждая секция включает по 2 поля данных и имеет начальный адрес 5 по умолчанию.

  1. Настройка разрешенных для слейва Modbus-функций:

fcsSupported: ModbusFB.SupportedFcs := ( ReadHoldingRegisters:=TRUE, ReadInputRegisters:=TRUE, WriteMultipleRegisters:=TRUE);

  1. Настройка слейва: настройка разрешенных 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));

  1. После того, как слейв настроен, требуется циклически вызывать экземпляр 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) и разрешить его работу:

  1. Настройка слейва: настройка разрешенных 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));

  1. После того, как слейв настроен, требуется циклически вызывать экземпляр 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):

  1. Ethernet;


Добавление и настройка компонента Ethernet дерева устройств

  1. Modbus TCP Master. Для настройки компонента требуется выставить галочку Auto-reconnect;
  2. Modbus TCP Slave. Здесь в поле Slave IP address указываем IP-адрес Modbus TCP слейва;
  3. 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 выполнено следующее:

  1. Создан экземпляр функционального блока (ФБ) мастера (клиента) ModbusFB.ServerTCP;

serverTCP: ModbusFB.ServerTCP;

  1. Созданы экземпляр ФБ ModbusFB.ExampleDataModel для формирования модели данных слейва — набора регистров, доступных для обмена данными по Modbus RTU.

exampleDataModel : ModbusFB.ExampleDataModel;

Модель данных ModbusFB.ExampleDataModel является примером формирования набора регистров для слейва и включает следующие секции:

  • discrete inputs;
  • coils;
  • input registers;
  • holding registers.

Каждая секция включает по 2 поля данных и имеет начальный адрес 5 по умолчанию.

  1. Настройка разрешенных для слейва Modbus-функций:

fcsSupported : ModbusFB.SupportedFcs := (

ReadHoldingRegisters:=TRUE,

ReadInputRegisters:=TRUE,

WriteMultipleRegisters:=TRUE

);

  1. Настройка слейва: настройка разрешенных 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

  1. После того, как слейв настроен, требуется циклически вызывать экземпляр 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) и разрешить его работу:

  1. Настройка слейва: настройка разрешенных 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.

  1. После того, как слейв настроен, требуется циклически вызывать экземпляр serverTCP ФБ ModbusFB.ServerTCP.

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

 

 

4. Работа с модулями ввода и вывода RealLab

 

4.1. Протокол Modbus RTU

Проекты с примерами работы с устройствами в среде разработки CODESYS 3.5 можно скачать на нашем сайте reallab.ru.

 

4.1.1. Рекомендации для работы с модулями серии NL, NLS

  1. Рекомендуется устанавливать (по возможности) скорость обмена по шине 115200 бод, а также использовать контрольные суммы.
  2. Модули аналогового ввода (NLS-8AI, NLS-4RTD и др.) способны производить аналого-цифровое преобразование со скоростью около 10 раз в секунду. Это значит, что частота опроса не должна превышать 10 Гц.
  3. Модули ввода-вывода серии NL имеют собственный сторожевой таймер, который настраивается при конфигурировании модуля. Принцип действия этого таймера основан на передаче модулям по шине данных специальной широковещательной команды «00 06 0А 02 00 01 [CRC16]». Приняв такую команду модуль сбрасывает свой сторожевой таймер. Если таймер сработал до прихода команды, модуль переходит в защищенное состояние, которое также настраивается при конфигурировании модуля.
  4. Для ускорения опроса модулей ввода-вывода (и для ускорения работы ПЛК соответственно) рекомендуется разделить эти модули на «скоростные» (те, которые быстро отвечают, как правило —дискретные) и «обычные» (те, которым на отработку команды и ответ требуется 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, необходимо выполнить следующие шаги:

  1. Создать визуализацию;
  2. Добавить в визуализацию кнопки, с помощью которых планируется управлять состоянием устройства;
  3. Написать код для каждой кнопки, который будет выполняться по ее нажатию.

Для создания кнопки в визуализации достаточно перейти в раздел “Стандартные элементы управления” в панели инструментов визуализации и перетащить кнопку в окно конструктора визуализации. Задайте кнопке размеры, свойства цвета и шрифта, если требуется. Объявите логическую (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 необходимо выполнить следующие шаги:

  1. Открыть проект CODESYS и дважды кликнуть по названию устройства, для которого нужно активировать данный протокол;
  2. Открыть вкладку “Общее”;
  3. Установить флажок на пункт “Включить генерацию сердцебиения;
  4. Установить частоту, с которой Ваше устройство будет отправлять 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

 

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

 



   
     
               
 
КОНТАКТЫ

Телефон:


Режим работы:
Адрес:

Почта:

+7 (495) 26-66-700
+7 (928) 289-24-86, 
+7 (961) 427-15-45
с 8:00 до 16:30
Биржевой Спуск, 8
г. Таганрог, Россия
info@reallab.ru

© НИЛ АП, ООО, 1989-2024

Дизайн-студия cCube. Разработка и поддержка сайтов
Разработка и поддержка
cCube.ru