Практическая схема подключения действующей Lon-сети к современной SCADA без замены контроллеров.
Архитектура решения: Lon → USB → TCP → MasterOPC → Simple-Scada
Старые системы автоматизации зданий часто переживают несколько поколений верхнего уровня. Контроллеры продолжают управлять вентиляцией, холодильными машинами и тепловыми пунктами, но родная диспетчеризация уже не отвечает современным требованиям. Менять исправную сеть дорого, поэтому логичнее сохранить Lon, а заменить только путь от сети до SCADA.
В этой статье разберу решение, которое использовал на действующем объекте: Lon-интерфейс подключён по USB, работа с ним вынесена в отдельный TCP-шлюз, MasterOPC превращает ответы в обычные OPC-теги, а Simple-Scada отображает значения и отправляет команды записи.
Задача: сохранить уровень Lon и заменить диспетчеризацию
На объекте уже работала Lon-сеть с 24 контроллерами. Требовалось не вмешиваться в логику полевых устройств и не перекладывать шину, но вывести данные в Simple-Scada вместо Tac Vista. Практический набор требований получился таким:
1. циклически читать NVI и NVO разных контроллеров;
2. преобразовывать двоичные значения SNVT в инженерные единицы;
3. передавать в OPC не только значение, но и качество связи;
4. строить мнемосхемы, архивы и тренды в Simple-Scada;
5. записывать во входные переменные NVI;
6. подтверждать результат записи, а не только факт отправки пакета;
7. вести журнал, по которому можно отличить ошибку адресации от тайм-аута или неверного формата данных.
Низкоуровневую работу с Lon я вынес в отдельный сервис, а MasterOPC оставил ролью понятного для SCADA преобразователя: запросить данные по TCP, разобрать результат, обновить теги и обработать команду записи.
Архитектура решения
Обмен проходит через пять уровней:
Сеть Lon. Существующие контроллеры и их сетевые переменные NVI/NVO.
USB-интерфейс. Физическое подключение компьютера к Lon-сети через Lon Usb адаптер.
TCP-шлюз. Принимает запросы, выполняет операции через USB-интерфейс и возвращает данные вместе с диагностикой.
MasterOPC. Циклически опрашивает переменные, декодирует SNVT и публикует результат как OPC-теги. Запись идёт в обратном направлении.
Simple-Scada. Отображает мнемосхемы, тренды и архивы, а также позволяет оператору менять разрешённые уставки.
Разделение на уровни сильно упрощает диагностику. Если не отвечает контроллер, это видно на уровне Lon. Если оборвалось TCP-соединение, MasterOPC переводит соответствующие теги в плохое качество. Если OPC работает, но объект на мнемосхеме не меняется, проблему уже нужно искать в проекте Simple-Scada.
Что действительно нужно знать о переменной Lon
Понятное человеку имя вроде «Температура приточного воздуха» удобно в SCADA, но в сетевом запросе не участвует. Для обращения к переменной нужны адрес и её место в таблице узла; для получения осмысленного значения — ещё тип и длина данных.
|
Параметр |
Зачем он нужен |
|
Domain / Domain Index |
Выбор нужного домена. Если интерфейс заранее включён в единственный домен, этот параметр можно хранить в общей конфигурации, а не в каждом теге. |
|
Subnet и Node |
Сетевой адрес контроллера. |
|
NV Index |
Положение сетевой переменной в таблице конкретного узла. |
|
SNVT Index или тип |
Правило декодирования и кодирования двоичных данных. |
|
Размер данных |
Проверка длины ответа; для стандартного SNVT обычно определяется по типу. |
|
Имя и единица |
Нужны оператору, MasterOPC и Simple-Scada, но не входят в Lon-пакет. |
Минимум и достаточность. для отправки запроса к уже настроенному интерфейсу достаточно subnet, node и NV Index. Для корректного инженерного значения этого недостаточно: нужен SNVT или описание собственного типа и ожидаемая длина данных. Domain необходим на уровне конфигурации интерфейса, если используется несколько доменов.
Что добавляется при записи в NVI
Запись сложнее чтения. Нельзя взять NV Index и подставить его в пакет обновления как selector: это разные сущности. NV Index указывает позицию переменной в таблице узла, а selector хранится в конфигурации сетевой переменной и используется в сообщении обновления.
Для надёжной записи нужно знать или получить из конфигурации NVI:
-
selector — идентификатор сетевой переменной в сообщении обновления;
-
direction — переменная должна иметь направление Input;
-
priority и authentication — флаги, с которыми настроен обмен;
-
service type — в моём случае использовался подтверждаемый сервис ACKD;
-
address entry — адресная запись, если она участвует в настроенной привязке;
-
SNVT и длину — чтобы закодировать значение в правильный набор байтов;
Рабочая последовательность записи выглядит так:
-
обратиться к устройству по адресу subnet/node;
-
по NV Index прочитать конфигурацию переменной;
-
проверить направление Input;
-
извлечь selector и флаги передачи;
-
закодировать инженерное значение согласно SNVT;
-
отправить обновление с подтверждением;
-
прочитать переменную повторно и сравнить результат.
Последний шаг принципиален: подтверждение транспортного обмена ещё не означает, что в устройстве уже находится нужное инженерное значение. Контрольное чтение отделяет состояние «пакет отправлен» от результата «устройство действительно приняло новое значение».
Как организованы теги в MasterOPC
Для каждого контроллера удобно создать отдельную группу, а внутри неё — набор переменных чтения и служебные теги. Для одной читаемой переменной я использовал следующие поля:
1. Subnet, Node — адрес контроллера;
2. NvIndex — индекс переменной;
3. SnvtIndex — правило декодирования;
4. Value — инженерное значение для OPC;
5. Raw — исходные байты ответа;
6. Quality — качество результата;
7. Status — состояние последней операции;
8. LastUpdate — время последнего успешного чтения;
Для записи используется отдельная группа WriteNvi. В ней нужны адрес узла, NV Index, SNVT, требуемое значение и разрешение запуска. Результат операции возвращается в двух видах: краткий машинный статус и подробная диагностическая строка.
1. WriteNvi.Value — значение, введённое оператором.
2. WriteNvi.Execute — запуск операции записи.
3. WriteNvi.Status — краткий статус: BUSY, OK_VERIFIED, TIMEOUT и т. п..
4. WriteNvi.Result — подробности: selector, направление, сервис, адресная запись и исходные байты.
Simple-Scada сначала записывает новое значение в Value, затем устанавливает Execute. Скрипт MasterOPC фиксирует параметры, выполняет операцию один раз и сам сбрасывает Execute в ноль. Благодаря этому команда не повторяется на каждом цикле скрипта.
Как выглядит подтверждённая запись
После исправления процедуры записи журнал стал содержать не только общий результат, но и параметры, из которых был собран пакет:
WriteNvi.Execute = 0
WriteNvi.Status = OK_VERIFIED
WriteNvi.Result = Значение записано и подтверждено;
selector=0x3FFD dir=Input priority=0
auth=0 service=ACKD addr=15 turnaround=0
raw=3F FD 0F
Статус OK_VERIFIED означает, что конфигурация NVI прочитана, selector получен автоматически, пакет сформирован с нужными флагами, обмен подтверждён, а новое значение проверено повторным чтением.
Что получилось
Связка Lon → USB → TCP → MasterOPC → Simple-Scada позволила сохранить действующую полевую сеть и заменить только верхний уровень. В результате система циклически читает переменные 24 устройств, декодирует SNVT, передаёт значения и качество по OPC, строит архивы и тренды и записывает уставки в NVI с автоматическим получением selector и проверкой результата.
Главный практический вывод: для интеграции Lon недостаточно передать сырые байты в OPC. Надёжное решение должно знать адрес узла, индекс и тип переменной, учитывать её конфигурацию при записи и всегда отделять значение от качества связи.
Архитектура не привязана к конкретной мнемосхеме. После публикации тегов тот же нижний уровень можно использовать для вентиляции, холодоснабжения, тепловых пунктов и других инженерных систем, где продолжает работать оборудование Lon.
Материал основан на собственных наблюдениях при локальной интеграции законно эксплуатируемого оборудования. Названия Lon, LonWorks, MasterOPC и Simple-Scada используются только для идентификации описываемых технологий.
ссылка на оригинал статьи https://habr.com/ru/articles/1060978/