我正在寻找使用 OPC UA 第 14 部分创建应用程序的程序。目前,我正在使用 python 进行编码。我当前的程序使用第 4 部分订阅来在每次更改时在模拟 PLC 中获取变量的值,然后使用 MQTT 的 PubSub 模型发布一个包含新值的字符串,该字符串在另一个程序中读取并打印它。
我知道有一种方法可以创建 OPC UA PubSub 模型,但我不知道该怎么做。而且,我看到有一种方法可以构建要发布的信息(映射?),但我不知道是否有一个函数可以自动执行此操作,以及这种方法的优点是什么。
我想知道我的做法是否正确,或者我在互联网搜索时是否遗漏了某些内容。你知道是否有可以启发我的例子吗?
有以下OPC基金会的例子: https://github.com/OPCFoundation/UA-IIoT-StarterKit
也许这对你有帮助。
以下是如何使用 QuickOPC 通过 MQTT 订阅 OPC UA PubSub 消息:
# This example shows how to subscribe to all dataset messages on an OPC-UA PubSub connection with MQTT JSON mapping using
# TCP.
#
import opclabs_quickopc
import opclabs_mqttnet
import time
# Import .NET namespaces.
from OpcLabs.EasyOpc.UA.PubSub import *
from OpcLabs.EasyOpc.UA.PubSub.Engine import *
from OpcLabs.EasyOpc.UA.PubSub.OperationModel import *
def dataSetMessage(sender, e):
# Display the dataset.
if e.Succeeded:
# An event with null DataSetData just indicates a successful connection.
if e.DataSetData is not None:
print('')
print('Dataset data: ', e.DataSetData, sep='')
for pair in e.DataSetData.FieldDataDictionary:
print(pair)
else:
print('')
print('*** Failure: ', e.ErrorMessageBrief, sep='')
print('*** Failure: ', e.Exception, sep='')
# Define the PubSub connection we will work with. Uses implicit conversion from a string.
# Default port with MQTT is 1883.
pubSubConnectionDescriptor = UAPubSubConnectionDescriptor.op_Implicit('mqtt://opcua-pubsub.demo-this.com')
# Specify the transport protocol mapping.
# Define the arguments for subscribing to the dataset, specifying the MQTT topic name.
subscribeDataSetArguments = UASubscribeDataSetArguments(pubSubConnectionDescriptor)
subscribeDataSetArguments.DataSetSubscriptionDescriptor.CommunicationParameters.BrokerDataSetReaderTransportParameters.\
QueueName = 'opcuademo/json'
# Instantiate the subscriber object and hook events.
subscriber = EasyUASubscriber()
subscriber.DataSetMessage += dataSetMessage
print('Subscribing...')
IEasyUASubscriberExtension.SubscribeDataSet(subscriber, subscribeDataSetArguments)
print('Processing dataset message events for 20 seconds...')
time.sleep(20)
print('Unsubscribing...')
subscriber.UnsubscribeAllDataSets()
print('Waiting for 1 second...')
# Unsubscribe operation is asynchronous, messages may still come for a short while.
time.sleep(1)
subscriber.DataSetMessage -= dataSetMessage
print('Finished.')
关于PubSub信息模型的使用,它也可以用来解析连接/订阅信息。