Перейти к основному содержимому

OPC-UA в Eclipse 4diac

Источник

Основано на официальной документации Eclipse 4diac, лицензия EPL-2.0.

OPC-UA (Unified Architecture) — промышленный стандарт коммуникации для безопасного, платформонезависимого обмена данными.

Компиляция FORTE с OPC-UA

Linux (Ubuntu/Debian)

# 1. Зависимости
sudo apt update && sudo apt install -y cmake g++ git python3

# 2. Сборка open62541 (OPC-UA библиотека)
git clone https://github.com/open62541/open62541.git
cd open62541
git checkout v1.3.8 # или актуальная стабильная версия
mkdir build && cd build
cmake .. \
-DUA_NAMESPACE_ZERO=FULL \
-DUA_ENABLE_ENCRYPTION=MBEDTLS \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install
sudo ldconfig

# 3. Сборка FORTE с OPC-UA
cd /path/to/4diac-forte
mkdir build && cd build
cmake .. \
-DFORTE_ARCHITECTURE=Posix \
-DFORTE_COM_OPC_UA=ON \
-DFORTE_COM_OPC_UA_MASTER_BRANCH=ON \
-DFORTE_COM_OPC_UA_MULTICAST=ON
make -j$(nproc)

Windows

# 1. Установите CMake, Visual Studio 2019+, Git

# 2. Сборка open62541
git clone https://github.com/open62541/open62541.git
cd open62541
mkdir build; cd build
cmake .. -DUA_NAMESPACE_ZERO=FULL -G "Visual Studio 16 2019"
cmake --build . --config Release
cmake --install . --prefix C:/open62541

# 3. Сборка FORTE
cd /path/to/4diac-forte
mkdir build; cd build
cmake .. ^
-DFORTE_ARCHITECTURE=Win32 ^
-DFORTE_COM_OPC_UA=ON ^
-Dopen62541_DIR=C:/open62541/lib/cmake/open62541
cmake --build . --config Release
Ларус-100

На Ларус-100 OPC UA уже скомпилирован в поставляемый FORTE. Сборка не требуется.

Синтаксис параметра PARAMS (ID)

Общий формат:

opc_ua[ACTION;ENDPOINT#PAIR1;PAIR2;...;PAIRn]
ЭлементОписаниеПример
ACTIONРежим работы FBREAD, WRITE, CREATE, DELETE, SUBSCRIBE
ENDPOINTАдрес OPC UA сервераopc.tcp://192.168.1.10:4840
#Разделитель (пусто = локальный сервер)#
PAIRИдентификатор узла;ns=2;s=Temperature

SUBSCRIBE / PUBLISH — реалтайм подписки

Пример OPC UA приложения с FlipFlop FB

SUBSCRIBE FB (получение данных при изменении)

SUBSCRIBE_1.ID = "opc_ua[SUBSCRIBE;opc.tcp://server:4840#;ns=2;s=Temperature]"

FB получает событие IND каждый раз, когда значение на сервере изменяется. Не требует периодического опроса — данные поступают по push от сервера.

OPC UA Subscriptions

PUBLISH FB (публикация переменной на локальном сервере)

PUBLISH_1.ID = "opc_ua[#;ns=2;s=MyOutput]"

Создаёт OPC UA переменную на встроенном сервере FORTE. Внешние клиенты могут читать/подписываться.

CLIENT FB — чтение и запись переменных

OPC UA Client — чтение/запись переменных

Чтение (READ)

CLIENT_1_0.ID = "opc_ua[READ;opc.tcp://192.168.1.10:4840#;ns=2;s=Temperature]"

При получении события REQ читает текущее значение переменной, возвращает через RD_1 и событие CNF.

Запись (WRITE)

CLIENT_0_1.ID = "opc_ua[WRITE;opc.tcp://192.168.1.10:4840#;ns=2;s=Setpoint]"

При REQ записывает значение из SD_1 в указанную переменную на сервере.

Чтение нескольких переменных

CLIENT_3_0.ID = "opc_ua[READ;opc.tcp://server:4840#;ns=2;s=Temp;ns=2;s=Press;ns=2;s=Flow]"

Читает 3 переменные за один запрос (RD_1, RD_2, RD_3).

SERVER FB — вызываемые методы

OPC UA метод — серверная сторона

SERVER_1_1.ID = "opc_ua[#;ns=2;s=SetParameters]"

Создаёт OPC UA метод на встроенном сервере. Внешний клиент вызывает метод → FORTE получает событие IND с входными данными, обрабатывает и возвращает результат через RSP.

OPC-UA сервер (публикация данных)

FORTE может выступать как OPC-UA сервер, экспортируя данные FB как OPC-UA узлы:

ID = "opc_ua[#;ns=2;s=MyTag]"   # Без адреса = локальный OPC-UA сервер

По умолчанию FORTE OPC UA сервер доступен на порту 4840.

Подключение к промышленным OPC-UA серверам

ПродуктАдрес по умолчаниюNamespace
Siemens S7-1200/1500opc.tcp://plc_ip:4840ns=3 (для пользовательских переменных)
Schneider M241/251opc.tcp://plc_ip:4840ns=4
ОВЕН ПЛК2ххopc.tcp://plc_ip:4840ns=2
CODESYS Runtimeopc.tcp://device_ip:4840ns=4
Ларус-100 (FORTE)opc.tcp://larus_ip:4840ns=2

Определение узлов (Node Browsing)

Для определения идентификаторов узлов используйте OPC UA клиент:

# UaExpert (GUI) — скачайте с unified-automation.com
# или Python:
pip install opcua
python3 -c "
from opcua import Client
c = Client('opc.tcp://192.168.1.10:4840')
c.connect()
root = c.get_root_node()
for node in root.get_children():
print(node.get_browse_name())
c.disconnect()
"

Безопасность OPC-UA

Security Modes

РежимОписаниеПрименение
NoneБез шифрованияТестирование, изолированная сеть
SignПодпись (целостность)Внутренняя сеть
SignAndEncryptПодпись + шифрованиеПродакшн, межсетевое взаимодействие

Security Policies

PolicyАлгоритмыСтатус
Basic128Rsa15RSA-1024, AES-128Устаревшая
Basic256RSA-2048, AES-256Устаревшая
Basic256Sha256RSA-2048, AES-256, SHA-256Рекомендуемая
Aes128_Sha256_RsaOaepAES-128, SHA-256, RSA-OAEPНовая

Настройка TLS и сертификатов

Для сборки с поддержкой шифрования нужен mbedTLS:

# Установка mbedtls
sudo apt install -y libmbedtls-dev

# Сборка open62541 с шифрованием
cmake .. -DUA_ENABLE_ENCRYPTION=MBEDTLS

# Генерация сертификатов
openssl req -x509 -newkey rsa:2048 -keyout forte_key.pem \
-out forte_cert.pem -days 365 -nodes \
-subj "/CN=FORTE/O=Liman-Tech"

Параметры безопасного подключения

opc_ua[opc.tcp://server:4840?SecurityMode=SignAndEncrypt&SecurityPolicy=Basic256Sha256#;ns=2;s=Tag]

Аутентификация по логину/паролю

opc_ua[opc.tcp://user:password@server:4840#;ns=2;s=Tag]

Типовые сценарии

Ларус-100 → OPC UA → SCADA

Ларус-100 (FORTE)                    SCADA
PUBLISH_1 ─── opc_ua[#;ns=2;s=T1] ──► OPC UA Client (чтение)
PUBLISH_1 ─── opc_ua[#;ns=2;s=P1] ──► OPC UA Client (чтение)
SERVER_1_1 ── opc_ua[#;ns=2;s=SP] ──► OPC UA Client (запись уставки)

Ларус-100 ← OPC UA ← Siemens S7

  CLIENT_1_0.ID = "opc_ua[READ;opc.tcp://s7-1500:4840#;ns=3;s=\"DB1\".\"Temperature\"]"
E_CYCLE (DT=T#1s) → CLIENT_1_0.REQ → обработка данных

Следующие шаги