记录利用Python调用TwinCAT ADS接口的方法及效率测试。
1 前言
使用Python调用TwinCAT ADS接口的核心即 pyads库。笔者主要在Windows上进行了相关测试,Ubuntu上的测试尚未进行。
2 pyads从ADS读取数据的方式
笔者测试了三种方式,是否有更多的方式还有待探究。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35import pyads
import time
import datetime
plc = pyads.Connection('127.0.0.1.1.1',pyads.PORT_TC3PLC1)
plc.open()
# Get all symbols from TwinCAT
# symbols = plc.get_all_symbols()
# for item in symbols:
# print(item)
# # print('\n'.join("%s: %s"% item for iterm in vars(symbols[0]).items()))
# print(len(symbols)) # 685
symbol = plc.get_symbol('MAIN.array')
print(symbol)
print(symbol.read())
a = 1.0
# Method 1
start = time.time()
for i in range(100):
plc.get_symbol('MAIN.array').read()
print('symbol read time: ', time.time() - start) # 100次0.23601937294006348s
# Method 2
start = time.time()
for i in range(100):
plc.read_by_name("MAIN.SafeIndex")
print(' read by name time: ', time.time() - start) # 100次0.32199621200561523s
# Method 3
start = time.time()
for i in range(100):
plc.read_list_by_name(["MAIN.SafeIndex"]) # 100次0.10998749732971191s
print('list read time: \n', time.time() - start)
三种方式都是循环运行100次,求其平均值,结果是采用 plc.read_list_by_name
的方式获取的平均时间最短。
注意:
plc.read_list_by_name
: 可以一次性以列表的方式获取多个数值,但不会对时间造成过多的影响,结果以dict形式呈现,如何获取数组还有待探索;plc.get_symbol
: 可以获取数组类型的数据;plc.read_by_name
: 可以获取一个ADS接口的数据,结果不是dict, 会直接呈现,也可以获取数组类型的数据。
参考链接
- Python与倍福(Beckhoff)ADS通讯