完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
ModBus TCP协议是由ModBus系列通信协议派生而来,具有简单、中立产商、运行可靠的优点。它基于TCP/IP协议,可以直接在以太网上传输,在OSI模型中处于第五层(应用层),目前广泛运用于自动化设备的管理和控制中。在PLC调试过程中,一般需要采集并实时显示某些变量的变化曲线,或者需要做复杂的计算,虽然博图软件、PLC和HMI也可以做这种操作,但是如果将变量值传递到MATLAB进行操作,将会有更多的灵活性,同时在做特殊计算时会更方便。例如,在集中空调调试中,可以将PLC读取到的各点温度、湿度和压力传送到MATLAB,空调系统研发人员可使用这些参数进行系统建模,实时了解空调的运行状态。
ModBus TCP协议的通信请求端叫Client,响应端叫Server,即Client主动发送通信请求报文到Server,Server解析报文后响应Client的请求,要么修改寄存器的数值,要么读取寄存器的值,并形成报文返回到Client端,至此一个通信事务完成。 1. 在PLC创建Server端 第一步:创建需要传输的变量 添加全局数据块DataSended,因为我们要做绝对引址,因此在块属性中将“优化的块访问”的勾去掉。在数据块中创建需要传输的变量,可以是单个变量,也可以是数组变量。需要注意的是,读写寄存器时是以两个字节(Word)为单位,因此变量的数据类型最好是Word的整数倍。 第二步:创建TCON_IP_v4传输对象 添加全局数据块SEND,在块中新建变量sendObj,数据类型为TCON_IP_v4,该变量是ModBus TCP的通信描述。参照下图设置sendObj变量的各个值。InterfaceId为PLC的硬件标识符;ID为连接编号,取值范围1~4095;ADDR[1]~[4]为Client端的IP地址;LocalPort为Server的端口,一般Server端才需要设置,Client端可采用默认值。 第三步:Server端MB_SERVER编程 将MB_SERVER V4.2指令拉到程序中,MB_HOLD_REG参数为待传输的寄存器(第一步创建的DataSended),此处需要使用绝对地址的引址方式;CONNECT为TCON_IP_v4连接对象(第二步创建的sendObj)。 2. 在MATLAB创建Client端 代码很简单,主要就三句: %创建modbus连接对象 mbConnector = modbus(‘tcpip’,‘192.168.0.1’,502); mbConnector.Timeout = 20; %若想读取ModSim32上的数据,需要设置mbConnector的WordOrder属性为‘little-endian’ %set(mbConnector,‘WordOrder’,‘little-endian’) %读取数据 data = read(mbConnector,‘holdingregs’,1,[2,1,2,1,1,1],。。。 {‘uint16’,‘uint32’,‘uint16’,‘uint32’,‘single’,‘double’}); %高级的格式化读取,‘uint16’, ‘int16’, ‘uint32’, ‘int32’, ‘uint64’, ‘int64’, ‘single’, and ‘double’。 %This argument is optional, and the default is ‘uint16’。 data = data‘; %断开并清除modbus连接对象 clear mbConnector modbus函数创建连接对象,可创建ModBus TCP和RTU连接,第二个输入参数为Server的IP地址,第三个为Server端为ModBus协议开的端口。read函数用于读取Server端寄存器的数据,读取顺序与寄存器的顺序一致,可通过定义数据类型和变量数量来快速获取所需的数据。运行结果如下,MATLAB是以十进制显示。 向寄存器写数据可用write函数,同时读写可用writeread函数,等等。modbus函数在MATLAB R2017a才引入(“Introduced in R2017a”),具体的可参考MATLAB官方帮助文档 https://ww2.mathworks.cn/help/instrument/modbus-communication.html?s_tid=CRUX_lftnav 如果想定时刷新数据,可以使用timer类来实现,可实现毫秒级的数据刷新。 MATLAB最终读取的数据为double类型,由于无法做底层操作,如果想得到二进制、十六进制值,可使用MATLAB提供的转化函数dec2bin、dec2hex等转为了char类型的数据。 3. 问题分析 有网友反映说MATLAB与控制器用ModBus TCP通信不上。本文建议先用modbus pol软件或ModScan32软件作为Client端,访问一下控制器,如果能通信上,说明通信链路、数据链路没有问题;否则,请检查通信线路、设置IP为同一网段等等。此时,再用modbus slave软件或ModSim32软件作为Server端,模拟控制器的ModBus TCP服务。 然后在MATLAB中运行以下程序,如果不能通信,说明是MATLAB软件的安装问题了。有网友说卸载instrument control tool,再重装一遍该工具箱可解决问题。有问题欢迎私信! clear %创建modbus连接对象 mbConnector = modbus(’tcpip‘,’127.0.0.1‘,502); data = read(mbConnector,’holdingregs‘,1,1) clear mbConnector 总结 新版MATLAB提供了简洁、强大的ModBus通信方法,可方便地与带有ModBus的设备实现通信,开发者可快速管理和控制自动化设备。个人感受,学过的技术一两个月不用就会忘得干干净净,可以先做粗略的学习笔记,以后忘了还可以翻出来看看。 |
|
|
|
只有小组成员才能发言,加入小组>>
878浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 12:00 , Processed in 0.601617 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号