Стандартный набор инструментов драйвера

Набор для разработки драйверов AggreGate Server также включает в себя так называемый стандартный набор инструментов драйвера, который является набором классов, упрощающим создания типичных драйверов для сетевых устройств, программируемых логических контроллеров (PLCs), шлюзов и сенсоров интернета вещей (IoT), спутниковых трекеров и т.д.

Стандартный набор инструментов - это технически полная, простая разработка драйверос со следующими характеристиками:

  • Связь по TCP, UDP или по последовательному соединению
  • Разбор входящих данных потока в раздельные команды
  • Поддержка оповещений (асинхронные входящие команды) и ответов (синхронные ответы на ранее отправленные команды)
  • Дополнительный разбор и обработка входящих команд по коду пользователя
  • Кодировка и отправка исходящих команд
  • Соотнесение входящих команд с ранее отправленными исходящими посредством пользовательских идетификаторов
  • Поддержка отправления множественных исходящих команд одновременно и получения ответов вне очереди

Разработка драйверов с помощью стандартного набора инструментов

Чтобы разработать драйвер устройств AggreGate Server, который основывается на стандартном наборе инструментов и использует полностью дополнительную настройку соединения и код соединений устройства, следует:

  • Создать новый общий драйвер устройства (плагин класс + драйвер класс), как описано в других статьях этого раздела
  • Создать новый класс команды устройства, наследуемый от Command, а также, по желанию, больше дочерних классов для различных типов входящих и исходящих команд. Классы команды главным образом содержат обе базы устройств: первичную и обработанную
  • Создать новый класс контроллера устройства, наследуемый от AbstractDeviceController и установить его параметры по базе входящих/исодящих классов команды. Контроллер устройства отвечает за управление связями устройства и за данные
  • Создать новый командовый анализаторный класс путем реализации интерфейса CommandParser или (лучше) путем наследования у AbstractCommandParser
  • Для второго подхода (при использовании AbstractCommandParser) система будет добавлять входящие данные для вашего буфера анализатора байт за байтом, затем вызовет метод readCommand(). Если вы увидите, что буфер содержит полностью сформированную команду, просто создайте объект Command и верните его, в другом случае верните null. Собранные на данном этапе данные хранятся в ByteArrayOutputStream и доступны посредством byte[] getData()
  • Переопределить методы connectImpl(), loginImpl(), и disconnectImpl() вашего контроллера устройства и установить связь устройств, имя пользователя и логику разрыва соединения в них
  • Убедиться, что вы вызываете метод setCommandParser() из вашей настройки connectImpl(), чтобы предоставить правильный анализатор команды для контроллера устройства
  • Переопределить метод send(Command cmd) вашего контроллера устройства и реализовать команду, отправляя в нее логику, например отправьте данные команды в сокет, созданный в течение соединения
  • Переопределить методы драйверов устройств setupDeviceContext(DeviceContext deviceContext) и добавить свойства контроллера устройства в группу переменных контекста устройства ontextUtils.GROUP_ACCESS
  • Переопределить метод connect() вашего класса драйвера устройства, чтобы создать настроенный вами контроллер устройства и вызвать его метод connect(). Реализовать метод драйвера disconnect() путем переноса логики в вызов disconnect() контроллера устройства
  • Внести необходимую логику связи устройства в методы драйвера readVariableDefinitions(), readFunctionDefinitions(), readEventDefinitions(), readVariableValue(), writeVariableValue() и executeFunction(). Эти методы обычно взаимодействуют с контроллером устройства путем отправления различных команд, получения ответов и нормализации значений протокола устройста, например, конвертируя их в/из DataTable экземпляров
  • Если ваше устройство отправляет асинхронные команды (события), убедитесь в реализации метода processAsyncCommand() у AbstractDeviceController. Его реализация обычно должна создавать любое событие в контексте устройства. Убедитесь, что тип события был ранее представлен в ядре, полученном от драйвера readEventDefinitions()

Разработка драйверов с помощью набора инструмента и связи устройств

Этот раздел описывает, каким образом разработать драйверы устройств, которые:

  • Используют TCP (протокол управления передачей), UDP (протокол пользовательских датаграмм) или серийные связи и единый подход конфигурации устройства
  • Используют бинарные или текстовые команды устройства, разделенные одним или двумя пользовательскими символами characters ("разделители")

В таком случае вам необходимо следовать инструкции, написанной в разделе Разработка драйверов с помощью стандартного набора инструментов. Однако разработка такого драйвера даже проще. Список различий представлен ниже:

  • Создать объект связянных свойств путем разработки интерфейс ConnectionProperties или увеличения класса DefaultConnectionProperties
  • Используя наследование от DefaultConnectionProperties, клонировать его свойства FORMAT в статическом блоке, сделать необходимые модификации, добавить поля и передать новый формат конструктору DefaultConnectionProperties
  • Использовать ваш контроллер устройства с помощью StandardDeviceController вместо AbstractDeviceController. Вам не понадобится разрабатывать логику установки/разрыва соединения, а также логику, которую отправляет команда. Просто убедитесь, что вы перезаписываете connectImpl(), чтобы установить анализатор команды с помощью setCommandParser() после вызова super.connectImpl().

Резюмируя вышесказанное, важно отметить, что в этом случае вы не разбираете проблемы, касающиеся связи устройства, а имеете возможность полностью концентрироваться на обмене данными устройства.

Количество кодов, которые могут быть разработаны для создания нового драйвера устройств, относительно этого случая действительно минимально.