from
https://stackoverflow.com/questions/43360587/opc-ua-server-client-on-raspberry-pi2
sudo apt-get update
sudo apt-get install libxml2-dev libxmlsec1-dev libffi-dev
pip install cryptography
pip install freeopcua
from
https://github.com/FreeOpcUa/freeopcua
Example minimal client in python
client = opcua.Client(False)
client.connect("opc.tcp://10.10.10.4:4841/OPCUA/AnyServer/")
objects = client.get_objects_node()
print("Children of objects are: ", objects.get_children())
var = objects.get_child(["3:AnObject", "AVariable"])
print("Value of variable is: ", var.get_value())
client.disconnect()
from
https://github.com/huazh/python-opcua/blob/master/examples/example-client.py
python-opcua/examples/example-client.py
| import sys |
| sys.path.insert(0, "..") |
| import logging |
| import time |
|
|
| try: |
| from IPython import embed |
| except ImportError: |
| import code |
|
|
| def embed(): |
| vars = globals() |
| vars.update(locals()) |
| shell = code.InteractiveConsole(vars) |
| shell.interact() |
|
|
|
|
| from opcua import Client |
| from opcua import ua |
|
|
|
|
| class SubHandler(object): |
|
|
| """ |
| Subscription Handler. To receive events from server for a subscription |
| data_change and event methods are called directly from receiving thread. |
| Do not do expensive, slow or network operation there. Create another |
| thread if you need to do such a thing |
| """ |
|
|
| def datachange_notification(self, node, val, data): |
| print("Python: New data change event", node, val) |
|
|
| def event_notification(self, event): |
| print("Python: New event", event) |
|
|
|
|
| if __name__ == "__main__": |
| logging.basicConfig(level=logging.WARN) |
| #logger = logging.getLogger("KeepAlive") |
| #logger.setLevel(logging.DEBUG) |
|
|
| client = Client("opc.tcp://localhost:4840/freeopcua/server/") |
| # client = Client("opc.tcp://admin@localhost:4840/freeopcua/server/") #connect using a user |
| 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("Root node is: ", root) |
| objects = client.get_objects_node() |
| print("Objects node is: ", objects) |
|
|
| # 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(ua.Variant([23], ua.VariantType.Int64)) #set node value using explicit data type |
| #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) |
|
|
| # subscribing to a variable node |
| handler = SubHandler() |
| sub = client.create_subscription(500, handler) |
| handle = sub.subscribe_data_change(myvar) |
| time.sleep(0.1) |
|
|
| # we can also subscribe to events from server |
| sub.subscribe_events() |
| # sub.unsubscribe(handle) |
| # sub.delete() |
|
|
| # calling a method on server |
| res = obj.call_method("2:multiply", 3, "klk") |
| print("method result is: ", res) |
|
|
| embed() |
| finally: |
| client.disconnect() |
from
https://hant.helplib.com/GitHub/article_111897
python 中的最小客戶端示例
client = opcua.Client(False)
client.connect("opc.tcp://10.10.10.4:4841/OPCUA/AnyServer/")
objects = client.get_objects_node()
print("Children of objects are:", objects.get_children())
var = objects.get_child(["3:AnObject","AVariable"])
print("Value of variable is:", var.get_value())
client.disconnect()
留言
張貼留言