Python通过KEPServerEX 6读取PLC数据
ps:博主电脑通过以太网连接PLC
1.配置kepserver
前期配置请参考博文前部分:WPF通过KEPServerEX 读取PLC 的DB块值 – 锡城小笼包 – 博客园 (cnblogs.com)
获取OPC UA地址:
右击任务栏中的kepserver图标,选择“OPC UA配置”。
选择适配器,查看TCP地址,一般默认为opc.tcp://127.0.0.1:49320,也可以自己添加。安全策略选“无”。
2.连接kepserver
client = Client('opc.tcp://127.0.0.1:49320', timeout=10) # 地址为本地配置的kepserver地址
# 连接kepserver
client.connect()
print("Connected to KEPserver")
try:
# 测试连接是否成功
# 获取根节点
root = client.get_root_node()
print("Root node:", root)
# 获取对象节点
objects = client.get_objects_node()
print("Objects node:", objects)
except Exception as e:
print(e)
finally:
# 断开连接
client.disconnect()
print("Disconnected from KEPserver")
3.读取节点
例如我要读取“Channel1.Device1.start”的数据。
找到你要读取的节点层级,如果不知道,就按笨办法一层一层找
# 连接kepserver
client.connect()
print("Connected to KEPserver")
# 连接后
# 获取根节点
root = client.get_root_node()
# 获取子节点
children = root.get_children()
print("children node:", children)
①先输出root node的children:
②此时还不知道目标值在哪个node下,先找第一个node的children:
children = root.get_children()[0].get_children()
print("children node:", children)
③可以看到上面输出的结果,Channel1在第15位,输出Channel1的children:
children = root.get_children()[0].get_children()[14].get_children()
print("children node:", children)
④Device1在第3位,输出Device1的children:
children = root.get_children()[0].get_children()[14].get_children()[2].get_children()
print("children node:", children)
⑤此时就可以根据你要的节点序号传值到参数‘number’。
def readNode(number):
# 读取你的节点
# 需要找到你要读取的节点位置,例如我需要读取的NodeItem为Channel1.Device1.start
node = root.get_children()[0].get_children()[14].get_children()[2].get_children()[number]
value = node.get_value()
return value
4.完整代码
from queue import PriorityQueue
import time
from opcua import Client, ua
import csv
class SubHandler(object):
def datachange_notification(self, node, val, data):
print("Python: New data change event", node, val, data)
def readNode(number):
# 读取你的节点,这里需要修改自己的节点位置
# 需要找到你要读取的节点位置,例如我需要读取的NodeItem为Channel1.Device1.start
node = root.get_children()[0].get_children()[14].get_children()[2].get_children()[number]
value = node.get_value()
return value
def readData():
# 读取1号节点,这里需要修改自己要获取的节点号
value1 = readNode(1)
print("number1:", value1)
# 读取2号节点
value2 = readNode(2)
print("number2:", value2)
# 读取3号节点
value3 = readNode(30)
print("number3:", value3)
# 读取4号节点
value4 = readNode(13)
print("number4:", value4)
return value1, value2, value3, value4
client = Client('opc.tcp://127.0.0.1:49320', timeout=10) # 地址为本地配置的kepserver地址
csv_file_path = "data.csv" # 如果要将数据存入文件,新建文件地址
try:
# 连接kepserver
client.connect()
print("Connected to KEPserver")
# 获取根节点
root = client.get_root_node()
print("Root node:", root)
# 获取对象节点
objects = client.get_objects_node()
print("Objects node:", objects)
# 如果你不知道自己需要读取的节点层级可以按一下方式获取
# 获取子节点
print(root.get_children())
while True:
# 读取节点数据,并存入csv文件
with open(csv_file_path, mode='w', newline='') as file:
writer = csv.writer(file) # 以写的方式打开csv文件
writer.writerow(["1", "2", "3", "4"]) # 定义表头
#读取多组节点数据
for i in range(4):
print(f"第{i + 1}组读取:")
value1, value2, value3, value4 = readData()
writer.writerow([value1, value2, value3, value4])
time.sleep(5)
print("完成读取!")
except Exception as e:
print(e)
finally:
client.disconnect()
print("Disconnected from KEPserver")
找节点序号这个方法很笨,我也是自己找不到教程摸索出来的,第一次用kepserver不知道怎么直接找到节点,如果有知道的小伙伴欢迎在评论区指教!!
作者:ciding899