PLC
直播中

bigbangboom

8年用户 1237经验值
擅长:电源/新能源
私信 关注

基于ModBus TCP的MATLAB与控制器如何进行通信

ModBus TCP协议是什么?
怎样在PLC上创建Server端?
怎样在matlab创建Client端?

回帖(1)

刘丹芹

2021-9-1 17:13:05
  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”)。
  如果想定时刷新数据,可以使用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的设备实现通信,开发者可快速管理和控制自动化设备。个人感受,学过的技术一两个月不用就会忘得干干净净,可以先做粗略的学习笔记,以后忘了还可以翻出来看看。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分