Контроллеры ОВЕН, программируемые в среде CODESYS V3.5 (ПЛК210, ПЛК200, СПК1xx, СПК210), поддерживают стандартные промышленные протоколы Modbus RTU/TCP (Master/Slave) и OPC UA (Server), а также позволяют настраивать обмен данными по нестандартным протоколам.
В библиотеке OwenVendorProtocols реализованы протоколы для электросчетчиков Меркурий и Энергомер, теплосчетчиков ВКТ и других популярных устройств учета. Однако охватить все возможные протоколы для всех существующих устройств невозможно. Поэтому пользователи могут реализовать нестандартные протоколы самостоятельно.
Контроллеры ОВЕН предоставляют для этого удобный инструмент — библиотеку OwenCommunication, которая включает высокоуровневые коммуникационные блоки, упрощающие процесс.
Пример использования OwenCommunication
К нам обратился клиент, которому нужно было подключить к контроллеру СПК два вакуумных датчика Smartline VSM77DL от Thyracont Vacuum Instruments. Для их опроса использовался нестандартный строковый протокол обмена, разработанный производителем. Клиенту требовалось только получать текущее значение давления, что включало отправку одной команды на датчик, получение ответа и извлечение нужного значения.
В документации указано, что адрес датчика по умолчанию — 001. Чтобы упростить процесс и избежать разработки полноценного алгоритма формирования запросов с вычислением длины пакета и контрольной суммы, мы предложили клиенту оставить для обоих датчиков один адрес (1) и подключить их к разным COM-портам контроллера.
Контроллер СПК оснащён тремя портами RS-485, что позволило подключить два датчика (по одному на порт) и оставить один порт для шины с модулями ввода-вывода ОВЕН Mx110. Другие устройства в проекте не использовались.
Здесь последний фрагмент запроса, обозначенный как CR, заменен на $0D. CR (Carriage Return) — это символ конца строки. Утилита не позволяет вводить спецсимволы напрямую, поэтому используется префикс $ и соответствующий код символа из таблицы ASCII. Код для CR — это 0D.
В ответ на запрос мы получили корректный ответ. Также на этом этапе мы определили сетевые настройки датчика: в руководстве указано, что он работает в режиме 8-N-1 (8 бит данных, без контроля четности, 1 стоповый бит), но не указана скорость обмена. Опытным путем было установлено, что скорость обмена по умолчанию составляет 115200 бод.
После этого был создан проект для виртуального контроллера CODESYSControlWinV3. В проект мы добавили библиотеку OwenCommunication, с помощью двух блоков которой написали простейший отладочный проект:
В рамках проекта запрос к датчику задается жестко через переменную sRequest, а ответ сохраняется в переменной sResponse. Для работы с портами используется экземпляр блока COM_Control для открытия COM-порта с нужными настройками, а блок UNM_SerialRequest отправляет запрос через порт и получает ответ.
Ответ от датчика приходит в виде строки, содержащей адрес устройства и дополнительную информацию. Наиболее важная часть этого ответа — значение давления, которое необходимо извлечь и преобразовать из строки в число с плавающей точкой (тип REAL). Для этого применяется комбинация функций Between (из библиотеки OwenStringUtils) и MID (из библиотеки Standard) для удаления лишних фрагментов строки, после чего оставшееся значение давления конвертируется в тип REAL с помощью оператора TO_REAL.
После этого был запущен виртуальный контроллер CODESYSControlWinV3, в который загрузили проект. В переменной xGetPressure установили значение TRUE. Эта переменная связана с входом xExecute блока UNM_SerialRequest, и при изменении на переднем фронте отправляется запрос на датчик и получен ответ. Для реального проекта можно использовать генератор импульсов с заданным периодом (например, 1 секунда), чтобы каждый импульс инициировал новый сеанс обмена.
После выполнения команды переменная rValue приняла значение 1000, что совпадало с отображением на дисплее датчика, подтверждая корректность работы.
Вся процедура настройки обмена с прибором заняла полчаса, к началу процедуры датчик уже был подключен к ПК.
Созданный пример можно практически без доработок интегрировать в пользовательский проект и запустить на реальном контроллере, добавив генератор импульсов для циклического обмена.
Для опроса второго датчика требуется лишь скопировать созданный код и поменять номер COM-порта, указываемый в вызове экземпляра COM_Control.