Python 调用 ADS 接口及时间分析

记录利用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
35
import 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, 会直接呈现,也可以获取数组类型的数据。

参考链接

  1. Python与倍福(Beckhoff)ADS通讯
------ 本文结束感谢您的阅读------
Donate a cup of cola?