例(1)通过路径获取
使用 get_children()和get_child(path) 两个函数。服务器和客户端都适合.
客户端
import sys
sys.path.insert(0, "..")
from opcua import Client
if __name__ == "__main__":
client = Client("opc.tcp://localhost:4840/freeopcua/server/")
#connect using a user
# client = Client("opc.tcp://admin@localhost:4840/freeopcua/server/")
try:
client.connect()
# Client has a few methods to get proxy to UA nodes that
# should always be in address space such as Root or Objects
root = client.get_root_node()
print("Objects node is: ", root)
# Node objects have methods to read and write node attributes
# as well as browse or populate address space
print("Children of root are: ", root.get_children())
# get a specific node knowing its node id
#var = client.get_node(ua.NodeId(1002, 2))
#var = client.get_node("ns=3;i=2002")
#print(var)
#var.get_data_value() # get value of node as a DataValue object
#var.get_value() # get value of node as a python builtin
#var.set_value(3.9) # set node value using implicit data type
# Now getting a variable node using its browse path
myvar = root.get_child(["0:Objects", "2:MyObject", "2:MyVariable"])
obj = root.get_child(["0:Objects", "2:MyObject"])
print("myvar is: ", myvar)
print("myobj is: ", obj)
print(myvar.get_value())
finally:
client.disconnect()
服务器端的路径读取
import sys
sys.path.insert(0, "..")
import time
from IPython import embed
from opcua import ua, Server, instantiate
if __name__ == "__main__":
# setup our server
server = Server()
server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")
# setup our own namespace, not really necessary but should as spec
uri = "http://examples.freeopcua.github.io"
idx = server.register_namespace(uri)
# create our custom object type
dev = server.nodes.base_object_type.add_object_type(0, "MyDevice")
dev.add_variable(0, "sensor1", 1.0)
dev.add_property(0, "device_id", "0340")
ctrl = dev.add_object(0, "controller")
ctrl.add_property(0, "state", "Idle")
# instantiate our new object type
mydevice = instantiate(server.nodes.objects, dev, bname="2:Device0001")
#mydevice = server.nodes.objects.add_object(2, "Device0001", objecttype=dev) # specificying objecttype to add_object also instanciate a node type
mydevice_var = mydevice.get_child(["0:controller", "0:state"]) # get proxy to our device state variable
# starting!
server.start()
try:
mydevice_var.set_value("Running")
embed()
finally:
# close connection, remove subcsriptions, etc
server.stop()
mydevice_var = mydevice.get_child(["0:controller", "0:state"])
例-2 服务器产生事件
import sys
sys.path.insert(0, "..")
from opcua import ua, Server
if __name__ == "__main__":
# setup our server
server = Server()
server.set_endpoint("opc.tcp://localhost:48400/freeopcua/server/")
# setup our own namespace, not really necessary but should as spec
uri = "http://examples.freeopcua.github.io"
idx = server.register_namespace(uri)
# get Objects node, this is where we should put our custom stuff
objects = server.get_objects_node()
# populating our address space
myobj = objects.add_object(idx, "MyObject")
# Creating a custom event: Approach 1
# The custom event object automatically will have members from its parent (BaseEventType)
etype = server.create_custom_event_type(idx, 'MyFirstEvent', ua.ObjectIds.BaseEventType, [('MyNumericProperty', ua.VariantType.Float), ('MyStringProperty', ua.VariantType.String)])
myevgen = server.get_event_generator(etype, myobj)
# Creating a custom event: Approach 2
custom_etype = server.nodes.base_event_type.add_object_type(2, 'MySecondEvent')
custom_etype.add_property(2, 'MyIntProperty', ua.Variant(0, ua.VariantType.Int32))
custom_etype.add_property(2, 'MyBoolProperty', ua.Variant(True, ua.VariantType.Boolean))
mysecondevgen = server.get_event_generator(custom_etype, myobj)
# starting!
server.start()
try:
# time.sleep is here just because we want to see events in UaExpert
import time
count = 0
while True:
time.sleep(5)
myevgen.event.Message = ua.LocalizedText("MyFirstEvent %d" % count)
myevgen.event.Severity = count
myevgen.event.MyNumericProperty = count
myevgen.event.MyStringProperty = "Property " + str(count)
myevgen.trigger()
mysecondevgen.trigger(message="MySecondEvent %d" % count)
count += 1
embed()
finally:
# close connection, remove subcsriptions, etc
server.stop()
可以通过uaExpert EventView 看到事件 。但是不知道如何查看secondEvent的Property