OPCUA学习⼼得—4OPC编程实现,基于Python OPC UA编程实现 — 基于Python
创建⼀个OPC服务器的步骤⾮常简单:
from opcua import Server
server = Server() # 实例化⼀个UA服务器
server.set_endpoint("p://0.0.0.0:48400/freeopcua/server/") # 设定服务器URI
server.start() # 启动UA服务器
1. 软件打开后,右键“Servers”,添加新连接
2. 在“Custom Discovery”下双击,并填⼊上⾯代码中设定的服务器URI
上步添加完URI后,会扫描到Python中创建的UA服务器,选择“Anonymous”,建⽴连接
3. 连接成功后在主页⾯能够看到OPC UA规范定义的标准地址空间结构
对于如何通过FreeOpcUa,创建⾃⼰的地址空间,项⽬源代码下的server-example.py⽂件进⾏了举例。这⾥要介绍的是如何通过XML⽂件来编辑地址空间。
在XML⽂件中创建节点和分配引⽤,是⾮常⾮常棒的⼀种⽅法。
编写XML⽂件,⾸先添加命名空间,主要包括节点类、数据类型以及W3C标准。
<?xml version="1.0" encoding="UTF-8" ?>
<UANodeSet xmlns="/UA/2011/03/UANodeSet.xsd"
xmlns:uax="/UA/2008/02/Types.xsd"
xmlns:xsd="/2001/XMLSchema"
xmlns:xsi="/2001/XMLSchema-instance">
</UANodeSet>
1. 创建对象节点
<UAObject NodeId="" BrowseName="" ParentNodeId="">
<Description></Description>
<DisplayName></DisplayName>
<References>
<Reference ReferenceType="" IsForward=""></Reference>
</References>
</UAObject>
1. 填写正确的NodeId,⽤于明确标识节点
2. 填写BrowseName,作为浏览地址空间时的⾮本地化名称
3. 填写ParentNodeId,在实例化时⾮常关键,与ModelParent相关,如果不对实例声明进⾏明确指定,会导致⽆法实例化
4. 分配引⽤,需要注意每种引⽤可以使⽤的次数(在节点类学习⼼得中进⾏了中)
2. 创建变量节点
<UAVariable NodeId="" BrowseName="" DataType="" ParentNodeId="" AccessLevel="" UserAccessLevel=""> <Description></Description>
<DisplayName></DisplayName>
<References>
<Reference ReferenceType="" IsForward=""></Reference>
</References>
<Value></Value>
</UAVariable>
1. AccessLevel,设定访问⽅式,可读可写或其他
2. Value,定义节点Value属性
⼀个简单的例⼦
from opcua import Server
server = Server()
server.set_endpoint("p://0.0.0.0:48400/freeopcua/server/") # 设定服务器URI
server.import_xml("l") # 导⼊XML⽂件
server.start()
<?xml version="1.0" encoding="UTF-8" ?>
<UANodeSet xmlns="/UA/2011/03/UANodeSet.xsd"
xmlns:uax="/UA/2008/02/Types.xsd"
xmlns:xsd="/2001/XMLSchema"
xmlns:xsi="/2001/XMLSchema-instance">
<UAObject NodeId="i=30001" BrowseName="MyXMLFolder">
<Description>A custom folder.</Description>
<References>
<Reference ReferenceType="HasTypeDefinition">i=61</Reference>
<Reference ReferenceType="Organizes" IsForward="false">i=85</Reference>
</References>
python处理xml文件</UAObject>
<UAObject NodeId="i=30002" BrowseName="MyXMLObject">
<Description>A custom object node.</Description>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="Organizes" IsForward="false">i=30001</Reference>
</References>
</UAObject>
<UAVariable NodeId="i=30004" BrowseName="MyXMLVariable" DataType="String">
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="Organizes" IsForward="false">i=30002</Reference>
</References>
<Value><uax:String>StringValue</uax:String></Value>
</UAVariable>
<UAVariable NodeId="i=30005" BrowseName="MyXMLProperty" DataType="UInt32">
<References>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
<Reference ReferenceType="HasProperty" IsForward="false">i=30002</Reference>
</References>
<Value><uax:UInt32>76</uax:UInt32></Value>
</UAVariable>
</UANodeSet>
1. 在上例中,⾸先添加了⼀个类型为⽂件夹的对象节点MyXMLFolder,通过HasTypeDefinition设定其类型为FolderType,⽤于组织
地址空间中的节点,并使⽤Organizes引⽤将它组织到Root下的Objects节点下
2. 然后在⽂件夹节点下添加了⼀个名为MyXMLObject的对象节点,通过HasTypeDefinition引⽤设定其类型为BaseObjectType,并
使⽤Organizes引⽤将它组织到MyXMLFolder节点下
3. 在MyXMLObject对象节点下创建⼀个变量MyXMLVariable,数据类型设定为字符串型,节点类型为BaseVariableType,设定
Value属性来赋予初始值“StringValue”
4. 在MyXMLObject对象节点下添加⼀个特性MyXMLProperty,需要使⽤HasProperty引⽤,节点类型设定为PropertyType,数据
类型为32位的UInt,并赋予初始值76
⼀个复杂的例⼦
创建⼀个⾃定义的对象类型节点,然后通过实例化该类型节点得到⼀个复杂的对象节点。
from opcua import Server
server = Server()
server.set_endpoint("p://0.0.0.0:48400/freeopcua/server/") # 设定服务器URI
uri = 'examples.freeopcua.github.io'
idx = ister_namespace(uri) # 注册地址空间
server.import_xml("l") # 导⼊⾃定义的节点类型
my_sensor_type = _root_node().get_child([
"0:Types", "0:ObjectTypes", "0:BaseObjectType", "0:TemperatureSensorType"]).nodeid
my_sensor = des.objects.add_object(idx, "TemperatureSensor", my_sensor_type) server.start()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论