近期手头有个项目,需要用mablab从一款四通道仪表上通过串口读取有效的称重数据。
首先,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组两个字节,最终组成四个整数
相关产品
免责声明
客服热线: 13199863987(同微信)
加盟热线: 13199863987(同微信)
媒体合作: 0571-87759945
投诉热线: 0571-87759942

下载仪表站APP

Ybzhan手机版

Ybzhan公众号

Ybzhan小程序