联系我们

联系人:王女士

点击查看联系方式

技术文章

四通道称重测力仪表,matlab如何通过串口modbus协议,读取数据的。

点击次数:130 发布时间:2025/9/19 9:04:29
商家名片
王**
联系我时,请说明是阿仪网看到的,谢谢!
  • 电话: 18******228
  • 手机: 18******228
  • 微信:
  • 交换名片后展示联系方式 → →

近期手头有个项目,需要用mablab从一款四通道仪表上通过串口读取有效的称重数据。下面是说明书中的modbus寄存器地址,我们要从下面寄存器中读取数值回来。 ST100F寄存器字节图.png

首先,Modbus协议是一种常见的通信协议,常用于工业自动化。这里需要用到的是Modbus RTU模式,因为它通常通过串口进行通信,比如RS-485或RS-232。

从用户的问题来看,有几个关键点:

1、使用MATLAB的串口接口。

2、仪表的从机地址是1。

3、读取保持寄存器,从11号开始,读8个寄存器。

4、每两个寄存器组成一个32位有符号整数,然后就返回四个这样的数值。

首先,我需要知道如何在MATLAB中使用串口。MATLAB有一个Instrument Control Toolbox,里面有serialport函数可以用来配置和操作串口设备。

接下来是Modbus协议的具体实现部分。因为MATLAB可能没有内置的Modbus库,所以可能需要自己构造Modbus RTU帧。这包括:

·从机地址:1个字节。

·函数码:读保持寄存器(0x03)。

·起始地址:两个字节,这里是从11号开始。

·寄存器数量:一个字节,这里是8个。

·CRC校验。

所以Modbus RTU帧的结构大致是:

[设备地址][功能码][起始地址高][起始地址低][寄存器数量][数据…][CRC]

在代码中,我需要构造这个帧,然后通过串口发送出去,并等待仪表的响应。收到的数据需要进行解析。

接下来考虑如何处理接收到的数据。Modbus RTU的响应结构是:

·设备地址(1字节)

·功能码(1字节)

·数据部分(2个字节每个寄存器,共8*2=16字节)

·CRC校验(2字节)

所以数据部分会被分割成4组,每两个字节组成一个32位整数。因为用户要求的是有符号的整数,所以在转换时需要处理为int32类型。

我还需要注意字节顺序的问题。通常情况下,Modbus的数据传输是使用大端字节序,即高位在前。但在MATLAB中处理的时候,可能需要调整字节顺序。

接下来我们列出具体的步骤:

1、配置串口:正确的波特率、数据位、停止位等参数。假设仪表的波特率为9600,8数据位,无奇偶校验,1停止位。

2、打开串口连接。

3、构造Modbus RTU读取请求帧:

a. 设备地址:1

b. 功能码:0x03(十进制51)

c. 起始地址:高字节和低字节。11的十六进制是0x0B,所以高位是0x00,低位是0x0B。

d. 寄存器数量:8

4、计算CRC校验。这个部分可能需要查找Modbus RTU CRC算法,通常是计算前三个字节(设备地址、功能码和数据字段)的多项式,得到两个字节的校验值。

5、发送请求帧到串口。

6、等待响应,并读取返回的数据。

7、解析响应帧:

a. 检查设备地址和功能码是否正确。

b. 提取数据部分。

8、将16个字节分成4组,每组两个字节构成一个32位整数。需要注意的是,这可能涉及到将两个字节合并成一个双字节值,并转换为有符号整数。

在构造请求帧的时候,我需要计算CRC校验。我记得Modbus RTU的CRC是基于0xFFFF的多项式,使用的是16位的循环冗余校验码。所以,需要写一个函数来计算这个CRC。

另外,在读取串口数据时,可能会遇到超时的问题。所以代码中需要设置适当的等待时间,并且处理可能的错误情况,比如没有收到足够的数据或者CRC不匹配的情况。

接下来是具体实现:

1、配置串口:

使用serialport对象,设置波特率、字节大小等参数。

2、构造请求帧:

设备地址:1(一个字节)

功能码:3(十进制,对应0x03)

起始地址:高位是0x00,低位是0x0B

寄存器数量:8

数据部分暂时为空,因为请求帧的数据字段包含起始地址和寄存器数量,所以请求的数据字段为[0x00, 0x0B, 0x08]。然后计算CRC校验。

构造完整的请求帧应该是:

[1 (设备地址), 3 (功能码), 0x00, 0x0B, 0x08, CRC_high, CRC_low]

这里需要注意的是,数据部分在请求中是包含起始地址和寄存器数量的,所以数据字段是三个字节:起始高、起始低、寄存器数。那计算CRC的时候,需要包括这些三个字节吗?或者是不是只计算前两个字节?

不,Modbus RTU中的数据部分在请求中包含的是起始地址和寄存器数量,因此数据字段的长度是2(起始地址)+1(寄存器数量)=3个字节。所以在构造请求时,整个帧的数据字段包括这三个字节。那计算CRC的时候,是否只对前三个字节进行校验?

不,实际上Modbus RTU的CRC是针对设备地址、功能码和数据部分的所有字节进行计算的。所以,在本例中,数据部分有3个字节:起始高(0x00)、起始低(0x0B)和寄存器数(0x08)。因此,总共有1(设备地址) + 1(功能码) +3(数据部分)=5个字节用于计算CRC。

然后,我需要编写一个函数来计算这五个字节的多项式生成校验码。这可能有点复杂,但网上可以找到Modbus CRC-16算法的实现方式。

另外,在解析响应时,收到的数据应该包括设备地址、功能码、数据部分和CRC。首先检查设备地址是否为1,功能码是否正确,然后计算接收到的数据部分是否符合预期,并验证CRC是否正确。

关于转换字节到32位整数的部分,我需要将每两个连续的字节合并成一个双字节值。需要注意的是,MATLAB中的处理方式可能会影响符号的问题,因为数据是以有符号整数形式返回。

举个例子,假设收到的数据是字节1和字节2,那么这个数值如何转换?在Modbus中,通常是将高字节放在前面(大端),所以首位字节作为高位,第二个字节作为低位。然后将它们组合成一个16位的无符号整数,再转换为有符号整数。

比如,如果有两个字节:0x12和0xAB,那么合并的结果是 0x12AB,将其视为有符号整数,应该是43957。

但是在MATLAB中,这可能需要一些处理。因为字节的顺序会影响结果,所以可能需要将它们转换为一个双字节值,并考虑是否有符号的问题。

另外,在解析数据时,我还需要确保数据部分确实返回了8个寄存器的数据,也就是16个字节,这样可以得到4组两个字节,最终组成四个整数


原创作者:深圳市斯迈耐特科技有限公司

相关产品

  • 友情链接
  • 热词推荐
在线咨询5分钟应答

提交