TwinCAT ADS库的Python包装器
pyads的Python项目详细描述
pyads-python包
这是twincats广告库的python包装器。它提供python函数 用于与TwinCAT设备通信。pyads在windows上使用由tcadsddll.dll提供的c api adslib.so在linux上。ads api的文档可以在infosys.beckhoff.com上找到。
文档:http://pyads.readthedocs.io/en/latest/index.html
安装
来自PYPI:
$ pip install pyads
来自github:
$ git clone https://github.com/MrLeeh/pyads.git --recursive
$ cd pyads
$ python setup.py install
快速启动
创建路由
ads使用自己的地址系统amsnetid来识别设备。这个 通过路由将设备分配给amsnetid。路由 在Windows和Linux上的处理方式不同。
在Linux上创建路由
打开端口并为远程计算机创建amsaddr对象。
>>>importpyads>>>pyads.open_port()32828
添加到远程计算机的路由(仅限Linux-Windows路由必须是 在Twincat路由器用户界面中添加)。
>>>remote_ip='192.168.0.100'>>>adr=pyads.AmsAddr('127.0.0.1.1.1',pyads.PORT_SPS1)>>>pyads.add_route(adr,remote_ip)
获取本地计算机的AMS地址。这可能需要添加到
远程计算机的路由表。
注意:在linux机器上,在调用之前必须至少添加一个路由
到get_local_address()
将正常工作。
在Linux上向PLC添加路由
beckhoff可编程逻辑控制器要求在可编程逻辑控制器的路由表中添加一条路由。通常这是在windows上的twincat路由器中处理的,但是在linux上没有这样的选项。 在最初设置与远程plc的连接时,只需执行一次。
添加到远程plc的路由以允许连接到主机名为“mypc”的pc
>>>importpyads>>>SENDER_AMS='1.2.3.4.1.1'>>>PLC_IP='192.168.0.100'>>>USERNAME='user'>>>PASSWORD='password'>>>ROUTE_NAME='RouteToMyPC'>>>HOSTNAME='MyPC'>>>PLC_AMS_ID='11.22.33.44.1.1'>>>pyads.add_route_to_plc(SENDER_AMS,HOSTNAME,PLC_IP,USERNAME,PASSWORD,route_name=ROUTE_NAME)
在windows上创建路由
在windows上,不需要使用pyad手动添加路由,但是 使用twincat附带的twincat路由器ui(tcsystemmanager) 安装。查看Twincat文档 infosys.beckhoff.com TcSystemManager了解更多详细信息。
测试服务器
对于第一个测试,您可以使用 pyads包。要启动它,只需从 一个单独的控制台窗口。
$ python -m pyads.testserver
这将在127.0.0.1端口48898上创建一个新设备。下一步 需要从另一个python控制台添加到testserver的路由。
>>>importpyads>>>pyads.open_port()>>>adr=pyads.AmsAddr('127.0.0.1.1.1',pyads.PORT_SPS1)>>>pyads.add_route(adr,'127.0.0.1')
用法
连接到远程设备
>>>importpyads>>>plc=pyads.Connection('127.0.0.1.1.1',pyads.PORT_SPS1)>>>plc.open()>>>plc.close()
按名称读写值
>>>importpyads>>>plc=pyads.Connection('127.0.0.1.1.1',pyads.PORT_SPS1)>>>plc.open()>>>plc.read_by_name('global.bool_value',pyads.PLCTYPE_BOOL)True>>>plc.write_by_name('global.bool_value',False,pyads.PLCTYPE_BOOL)>>>plc.read_by_name('global.bool_value',pyads.PLCTYPE_BOOL)False>>>plc.close()
如果找不到名称,则会引发包含错误消息和ADS错误号的异常。
>>>plc.read_by_name('global.wrong_name',pyads.PLCTYPE_BOOL)ADSError:ADSError:symbolnotfound(1808)
读取字符串最大缓冲长度为1024。
>>>plc.read_by_name('global.sample_string',pyads.PLCTYPE_STRING)'Hello World'>>>plc.write_by_name('global.sample_string','abc',pyads.PLCTYPE_STRING)>>>plc.read_by_name(adr,'global.sample_string',pyads.PLCTYPE_STRING)'abc'
也可以读/写数组。为此,只需将数据类型乘以 要读/写的数组元素数。
>>>plc.write_by_name('global.sample_array',[1,2,3],pyads.PLCTYPE_INT*3)>>>plc.read_by_name('global.sample_array',pyads.PLCTYPE_INT*3)(1,2,3)
按地址读写值
按地址读写udint变量。
>>>importpyads>>>plc=pyads.Connection('127.0.0.1.1.1',pyads.PORT_SPS1)>>>plc.open()>>># write 65536 to memory byte MDW0>>>plc.write(pyads.INDEXGROUP_MEMORYBYTE,0,65536,pyads.PLCTYPE_UDINT)>>># write memory byte MDW0>>>plc.read(pyads.INDEXGROUP_MEMORYBYTE,0,pyads.PLCTYPE_UDINT)65536>>>plc.close()
按地址切换位大小变量。
>>># read memory bit MX100.0>>>data=plc.read(pyads.INDEXGROUP_MEMORYBIT,100*8+0,pyads.PLCTYPE_BOOL)>>># write inverted value to memory bit MX100.0>>>plc.write(pyads.INDEXGROUP_MEMORYBIT,100*8+0,notdata)
通知回调的简单处理
为了使通知的处理更像python,通知装饰器具有 在版本2.2.4中引入。这个装饰器负责转换 通过ads传输到python数据类型的ctype值。
>>>importpyads>>>plc=pyads.Connection('127.0.0.1.1.1',48898)>>>plc.open()>>>>>>@plc.notification(pyads.PLCTYPE_INT)>>>defcallback(handle,name,timestamp,value):>>>print(>>>'{1}: received new notitifiction for variable "{0}", value: {2}'>>>.format(name,timestamp,value)>>>)>>>>>>handles=plc.add_device_notification('GVL.intvar',pyads.NotificationAttrib(2),callback)>>># Write to the variable to trigger a notification>>>plc.write_by_name('GVL.intvar',123,pyads.PLCTYPE_INT)2017-10-0110:41:23.640000:receivednewnotitifictionforvariable"GVL.intvar",value:abc>>># remove notification>>>plc.del_device_notification(handles)
通知回调适用于所有基本的plc数据类型,但不适用于数组 或结构。