ApolloStudio高手之路(3):用Python以最优雅简洁的方式读写支持Modbus RTU/TCP协议的设备数据

纵观整个工业界生态链,可能Modbus协议(包括了通过串口方式连接的Modbus RTU协议和通过网络传输的Modbus TCP协议,这里统称为Modbus)作为一种工业领域通信协议的业界标准在所有设备互联的协议群中独占鳌头,也许正是因为其相较与其他协议的优越性(1.公开发表并且无版权要求;2.易于部署和维护;3.对供应商来说,修改移动本地的比特或字节没有很多限制)才让其在更广泛的领域内大放异彩。

在ApolloStudio体系中对Modbus也是进行了完美的支持,我们可以先通过脚本工具集来简单粗略了解下:

ApolloStudio高手之路(3):用Python以最优雅简洁的方式读写支持Modbus RTU/TCP协议的设备数据_第1张图片

                                                                                   ApolloStudio脚本工具集 

优雅而简洁的读写

在上面的功能集合中,我们大致了解了ApolloStudio对Modbus RTU/TCP的全功能支持,我们又如何以Python的方式去使用这些功能呢?答案是:一句话的事!以常用的Modbus RTU读写数据为例(TCP功能与RTU一致,只需将函数名中RTU改为TCP即可):

#读取编号为0的设备群中站号为1的设备0号地址的输出线圈通断状态
myCoil = AS.Func_Modbus_RTU_ReadCoil(0, 1, 0)

#写入0号设备群中站号为1的设备0号地址线圈置位为1
AS.Func_Modbus_RTU_WriteCoil(0, 1, 0, 1)

#读取0号设备群中站号为1的设备0号寄存器数据并强制转换成ushort类型输出
myRegister = AS.Func_Modbus_RTU_ReadHoldingRegisters(0, 1, 0, "ushort")

#写入0号设备群中站号为1的设备0号寄存器(以ushort类型写入)
AS.Func_Modbus_RTU_WriteRegister(0, 1, 0, "1", "ushort")

#读取字符串类型数据时需指定字符串的读取长度,这里指定了读取10个字节合成一个字符串输出(该为扩展功能)
AS.Func_Modbus_RTU_ReadInputRegisters(0, 1, 0, "string", 10)

#写入多线圈或者多寄存器时,流程与上面单地址读写类似
AS.Func_Modbus_RTU_WriteMultCoil(0, 1, 0, (True, True))
AS.Func_Modbus_RTU_WriteMultRegisters(0, 1, 0, (1, 1), "ushort")

在代码中,我们通过一句话(该语句完全以脚本工具集双击中文语句后复制粘贴而来)简单而又优雅的将数据进行了操控。

在ApolloStudio中对Modbus RTU/TCP进行了深度封装,用户不用了解任何底层通讯机制,只需要将精力放在如何优化处理好数据信息即可。ApolloStudio对Modbus RTU/TCP的支持除了常规连接读写外,还额外提供了设备集群功能,即单台PC可以无限制的接入多台Modbus设备网络,而且彼此之间参数相互独立配置运行,极大限度的拓展了ApolloStudio的适用潜能,而且用户也无需对设备群进行复杂的命名,直接根据系统自动分配的编号即可快速索引到具体设备群进行操作。

值得注意的是,ApolloStudio对寄存器的读写操作均支持强制类型转换,这样的目的也极大的便利了用户省去了传统通信中数据读写转换的麻烦,目前ApolloStudio广泛支持了大多数数据类型:short(即int16,单字)、ushort(即uint16,单字)、int(即int32,双字)、uint(即uint32,双字)、float(即float,双字)、long(即int64,四字)、ulong(即uint64,四字)、double(四字)、string(多字)等等;与此同时ApolloStudio也支持在通讯报文中指定特定的报文顺序(高低位颠倒等等)以适应更多非标Modbus应用场景。

应用举例

综合上述简介内容,我们以一个简单的案例来总结本节学习:

项目目的:读取Modbus TCP设备(这里以Modbus Slave进行模拟)上的寄存器的值,并将其显示在ApolloStudio界面上。

项目配备:

1、Modbus Slave配置:

ApolloStudio高手之路(3):用Python以最优雅简洁的方式读写支持Modbus RTU/TCP协议的设备数据_第2张图片

 

ApolloStudio高手之路(3):用Python以最优雅简洁的方式读写支持Modbus RTU/TCP协议的设备数据_第3张图片

 2、ApolloStudio配置

2.1、加载 脚本、组态、ModbusTCP通讯(基本上后续操作都是如此,通过鼠标右键对需要用到的模块进行添加和配置,这里我们对Modbus TCP进行配置为例);

ApolloStudio高手之路(3):用Python以最优雅简洁的方式读写支持Modbus RTU/TCP协议的设备数据_第4张图片

右键Modbus TCP通讯,然后配置所选任务项,在 弹框中根据具体参数(这里由于是本机测试故与Slave默认一致即可),确定保存。(值得注意的是 127.0.0.1-502-1-0》0,其中最后这个0表示其处于0号设备圈内,这个是由ApolloStudio系统内部自动分配的

2.2、界面编辑,我们这里只使用一个简单的数码管进行举例,右键添加数码管后,将格式改为00000(改变成5位数的目的是为了显示更大的数),修改控件名称为"lb1"(这么修改的目的是为了便于记忆,后期脚本内以此找到对应的控件 )保存退出。

ApolloStudio高手之路(3):用Python以最优雅简洁的方式读写支持Modbus RTU/TCP协议的设备数据_第5张图片

 2.3、主界面加载UI,右键任务栏中的组态界面单元进行配置,加载上一步中保存的asxf文件,结果如图示:

ApolloStudio高手之路(3):用Python以最优雅简洁的方式读写支持Modbus RTU/TCP协议的设备数据_第6张图片

 2.4、编写脚本

#-*- coding: UTF-8 -*-
#加载内嵌模块
import clr,sys,time,datetime

myvalue = AS.Func_Modbus_TCP_ReadHoldingRegisters(0, 1, 0, "ushort")
AS.Func_UI_LedDisplay_SetValue("lb1", str(myvalue))

我们先以ushort的类型读取0号设备群中站号为1的设备0号地址寄存器的数据,然后将其显示在名称为lb1的数码管上。 保存该脚本后,同样的再主界面任务项中的脚本单元中右键进行配置,指定该脚本的绝对路径,保存即可!

2.5、启动,即可看到结果

ApolloStudio高手之路(3):用Python以最优雅简洁的方式读写支持Modbus RTU/TCP协议的设备数据_第7张图片

***********************************************************************************************************************************************

ApolloStudio最新版下载地址(网盘有交流群号):

(点击跳转至首页文章,见文章最底部下载链接)

 

你可能感兴趣的:(ApolloStudio高手之路(3):用Python以最优雅简洁的方式读写支持Modbus RTU/TCP协议的设备数据)