TwinCAT ADS库的Python包装器

pyads的Python项目详细描述


pyads-python包

Build StatusCoverage StatusDocumentation StatusPyPI version

这是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数据类型,但不适用于数组 或结构。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java集合属性值   java字符串==运算符是否比较引用?   java是否存在过太多的ListView或适配器?   json获取java中类路径中下载的文件   我可以用java代码解决数据库并发问题吗?   在多个线程中使用forEach()或使用forEach()和lambdas进行java集合迭代   java输出JFrame中的整个循环   java禁用高度详细的日志记录   java在没有特定属性的对象中访问模型的值   java Smack xmpp建立连接   处理过时域对象引起的并发问题的java策略(Grails/GORM/Hibernate)   java从ObservableList中提取元素   使用图像进行java相似图像搜索   java ListView和图像:我快疯了   在Java中,如何从毫秒时间戳中提取一天的周期?   java我需要这样的设计,但我面临两个问题   java如何获取JGoodies FormLayout中的单元格大小   Spring引导生成的java War文件未部署到Weblogic 12c