![cover](https://img-blog.csdnimg.cn/5575e6b5b0024cb581d0258d5fefe2c9.png)
实现S7-200smart通过MODBUS TCP/IP与matlab通讯
MATLAB最终读取的数据为double类型,由于无法做底层操作,如果想得到二进制、十六进制值,可使用MATLAB提供的转化函数dec2bin、dec2hex等转为了char类型的数据。寄存器类型:要读取的目标区域。read函数:用于读取Server端寄存器的数据,读取顺序与寄存器的顺序一致,可通过定义数据类型和变量数量来快速获取所需的数据。服务器ID:将读取命令发送到的服务器的地址,指定为双精度
目录
S7-200smart通过MODBUS TCP/IP与matlab通讯
两台S7-200smart之间通过Modbus TCP连接:
通过Matlab-Industment Control工具箱进行连接
S7-200smart通过MODBUS TCP/IP与matlab通讯
两台PLC之间建立Modbus TPC/IP通讯
STEP 7-MicroWIN SMART自V2.4版本后,用户可以在库中直接调用MODBUS模块
MODBUS TCP Client梯形图各个参数的功能:
EN: 使能;
Req: 发送通信请求,ON允许通信,OFF禁止通信;
Connect: 建立连接,ON连接,OFF断开:
IPAddr1-4:服务器的IP地址(如192.168.2.1);
IP_PORT指的是客户端尝试连接、且随后使用 Modbus TCP 进行通信的服务器的端口号:默认值502 将端口设置为设备的实际端口号
RW指示该操作是读还是写:0=读取;1=写入
Addr指的是要读或者是写的服务器的起始地址,这里填写的是40026,对应服务器一侧为&VB100;
COUNT: Modbus数据长度;此请求中要访问的位或保持寄存器的数量;
DataPtr指客户端的起始地址
MODBUS TCP Server梯形图各个参数的功能:
MaxIQ:MaxlQ:开放可访问IQ点数量;MaxAl:开放可访问Al数量;将可用于Modbus地址0xxxx到1xxxx的I和Q点数设置为0-256。0表示禁用对输入和输出所有读取和写入。建议将值设置为256
MaxAI:MaxlQ:开放可访问IQ点数量;MaxAl:开放可访问Al数量;将可用于Modbus地址3xxxx的字输入数设置为0-56.0表示禁用对模拟量输入的读取。要允许访问所有CPU模拟量输入,建议对于CPU CR40和CR60设置为0;对于其他型号设置为56
MaxHold:可用于Modbus地址4xxxx或4yyyyy的V存储器中的字保持寄存器数,不能与库存储区分配地址产生重叠。若允许Modbus客户端访问2000字节的V存储器,则将其值改为1000字。
HoldStart:指向V存储器中保持寄存器起始位置的指针。通常设置为&VB0,可更改
MODBUS地址40001对应的VWQ地址。&VBO则表示40001代表vwo,&VB100则表示40001代表VW100。
两台S7-200smart之间通过Modbus TCP连接:
现将客户端VW100开始的10个字写入服务器VW50开始的十个字中;服务器VW100开始的10个字读取到客户端VW50开始的10个字中。
客户端一侧程序
服务器一端程序:
一台服务器不能连接多台客户端,但是服务器又可以作为客户端与其它服务器通信。每台服务器只能定义一个端口,不同服务器的端口可以相同。
MATLAB端建立Modbus TCP客户端:
通过函数建立Modbus TCP客户端
MATLAB R2017a中引入了modbus函数:
modbus函数:创建连接对象,可创建ModBus TCP和RTU连接。
read函数:用于读取Server端寄存器的数据,读取顺序与寄存器的顺序一致,可通过定义数据类型和变量数量来快速获取所需的数据。
write函数:用于对连接到Modbus服务器执行写操作
writeRead函数:在单个Modbus中对一组保持寄存器执行写然后读操作
maskWrite函数:在保持寄存器上执行掩码写入操作
instrhwinfo函数:有关可用硬件的信息
clear函数:从MATLAB工作区中删除仪器对象
MATLAB是以十进制显示。MATLAB最终读取的数据为double类型,由于无法做底层操作,如果想得到二进制、十六进制值,可使用MATLAB提供的转化函数dec2bin、dec2hex等转为了char类型的数据。
Property | 类型 | 描述 |
DeviceAddress | TCP/IP | 如果传输是TCP/IP,则在创建对象时需要MODBUS服务器的IP地址或主机名,例如“192.168.2.1”。 |
Port | TCP/IP | 如果传输是TCP/IP,则在创建对象期间是可选的,MODBUS服务器使用的远程端口。默认值为502。 |
Timeout | TCP/IP;RTU | 等待MODBUS服务器响应的最长时间(秒),指定为double类型的正值。默认值为10。可以在创建对象期间或创建对象后更改值 |
NumRetries | TCP/IP;RTU | 如果超时后服务器没有回复,则要执行的重试次数。如果使用串行RTU传输,则会重新发送该消息。如果使用TCP/IP传输,连接将关闭并重新打开。 |
ByteOrder | TCP/IP;RTU | 写入16位寄存器或从16位寄存器读取的值的字节顺序。有效的选择是“big-endian”和“little-endian”。默认值为“big-endian”,由MODBUS标准指定。 |
WordOrder | TCP/IP;RTU | 跨多个16位寄存器的寄存器读写的字顺序。有效的选择是“big-endian”和“little-endian”。默认值是“big-endian”,并且它依赖于设备。 |
使用Modbus Slave模拟
读取代码如下
% 创建客户端
m = modbus('tcpip','192.168.2.1',502) %类型TCP/IP IP地址192.168.2.1 端口502
% 属性查看
m.ByteOrder
ans =
'big-endian'
%要更改 代码为m.ByteOrder = 'little-endian';
m.Port
ans =
502
% 设置属性
m.Timeout = 3 %超时时间为3s
m =
Modbus TCPIP with properties:
DeviceAddress: '127.0.0.1'
Port: 502
Status: 'Connected'
NumRetries: 1
Timeout: 3 (seconds)
ByteOrder: 'big-endian'
WordOrder: 'big-endian'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% read(obj,'holdingregs',address,count)
% read(obj,target,address,count,serverId) % 指定Server ID
% read(obj,target,address,count,precision) % 指定数据读取格式
% read(obj,target,address,count,serverId,precision) % 同时指定Server ID和数据读取格式
% 读取,以保持寄存器的方式读取,read列表为modbus对象、寄存器类型、开始地址(从1开始)、读取的个数、读取的类型
>> read(m,'holdingregs',3,1,'int16')
ans =
23
% 单精度浮点型数据的读取
>> read(m,'holdingregs',5,1,'single')
ans =
10.1100
% 断开并清除Modbus连接
clear m
发送代码如下
% 创建客户端
m = modbus('tcpip','192.168.2.1',502)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% write(m,target,address,values)
% write(m,target,address,values,serverId,'precision') %同时指定Server ID和数据读取格式
write(mbConnector,'holdingregs',10,1235,'int16')
write(mbConnector,'holdingregs',1,[1 2 3],'int16')
% 断开并清除Modbus连接
clear m
通过Matlab-Industment Control工具箱进行连接
在Matlab 2022b中选中APP-Modbus Explorer
选择配置Modbus TCP/IP
按照以下步骤通过TCP/IP与Modbus仪器进行通信。
1.在打开的配置选项卡中,在toolstrip中设置以下通信参数,以配置与设备的连接:
设备地址:Modbus服务器的IP地址,例如192.168.2.20。此参数是建立连接所必需的。
端口:Modbus服务器使用的远程端口。默认值为502。如果使用不同的端口号,请更改。
超时:等待Modbus服务器响应的最长时间(秒),指定为正值。默认值为3。您可以编辑该值以增加或减少超时时间。
字节顺序:写入16位寄存器或从16位寄存器读取值的字节顺序。默认值为Big Endian,由Modbus标准指定。如果您的设备需要Little Endian,请更改下拉列表中的值。
字序:跨越多个16位寄存器的寄存器读写的字序。默认值是Big Endian,并且它是特定于设备的。如果您的设备需要Little Endian,请更改下拉列表中的值。
2.在toolstrip中设置以下读取参数,以配置从设备读取数据:
服务器ID:将读取命令发送到的服务器的地址,指定为双精度。如果未指定服务器ID,则使用默认值1。有效值为1-247。
寄存器类型:要读取的目标区域。您可以对四种类型的目标执行Modbus读取操作:线圈、输入、输入寄存器和保持寄存器。使用下拉列表选择您的类型。
寄存器地址:从中读取的起始地址,指定为双精度。输入起始地址的号码。
精度:Modbus服务器上正在读取的寄存器的数据格式。对于线圈和输入,精度始终是位。对于保持寄存器和输入寄存器,可以指定精度,例如uint16。
3.要测试配置,请按“读取”按钮。如果您的配置参数正确,则读取成功,并且读取值将填充读取的值。如果出现错误,请调整参数,直到读取成功。
4.此值需要与设备手册中列出的值相匹配。请确保此值和其他配置参数与设备的规格相匹配。
获得正确的读取值后,按下Confirm Parameters(确认参数)按钮。选项卡的其余部分出现,您的设备列在应用程序左侧的设备列表中。
5.使用该表设置设备的读取。在配置选项卡中输入的寄存器详细信息显示在寄存器表的第一行。toolstrip中的按钮用于将行插入表中以及移动或删除行。然后将信息添加到行中。每一行表示从列出的目标类型和地址读取的数据。或者,可以使用“导入”按钮导入以前导出的信息表。
将Modbus Slave设置为如下
在matlab中读取到的数据如图所示
2023.9.25
参考文章:S7-200SMART 实现MODBUS TCP通信的具体方法示例(客户端读写+服务器响应)_AAA_自动化工程师的博客-CSDN博客
MATLAB - Modbus TCP客户端的使用_matlab使用modbus tcp write函数出现timeout_罗伯特祥的博客-CSDN博客
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)