串口通信modbus协议格式查询方式下怎么读写寄存器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了串口通信modbus协议格式查询方式下怎么读写寄存器相关的知识,希望对你有一定的参考价值。
读的功能码是03,写的功能码10,都是16进制。
modbus是一个大的框架协议。具体标准不同,读写寄存器的发码格式不同。标准的modbus有两种主流,一种是modbus-ASCII另一种是modbus-RTU,第三种是modbus-TCP。
1、modbus-ASCII: RS485通讯。传输介质采用屏蔽双绞线。主要针对字符传输,它可以将ASCII码转换成16进制数发送。需要LRC(纵向冗余码)校验数据正确性。
2、modbus-RTU:RS485通讯。传输介质采用屏蔽双绞线。主要针对数据传输,它可以将IEEE754浮点数,整数等转换成16进制数发送。需要CRC-16或CRC-32(循环校验码)校验数据正确性。
3、modbus-TCP:以太网通讯。传输介质网线。可传输字符也可传输数据。因为遵循TCP协议,所以无需校验。
参考技术A modbus是一个大的框架协议。具体标准不同,读写寄存器的发码格式不同。标准的modbus有两种主流,一种是modbus-ASCII另一种是modbus-RTU,第三种是modbus-TCP。modbus-ASCII: RS485通讯。传输介质采用屏蔽双绞线。主要针对字符传输,它可以将ASCII码转换成16进制数发送。需要LRC(纵向冗余码)校验数据正确性。
modbus-RTU:RS485通讯。传输介质采用屏蔽双绞线。主要针对数据传输,它可以将IEEE754浮点数,整数等转换成16进制数发送。需要CRC-16或CRC-32(循环校验码)校验数据正确性。
modbus-TCP:以太网通讯。传输介质网线。可传输字符也可传输数据。因为遵循TCP协议,所以无需校验。
读的功能码是03,写的功能码10,都是16进制。格式:站号(1bit)+功能码(1bit)+起始地址(2bit)+长度(2bit)+校验(2bit)(如果需要)。例如,RTU协议,读取站1,从7052寄存器开始读8个字。(数据长度默认为字)校验码低位在前高位在后的情况发码应为:01 03 1b 8c 00 08 83 03。校验码高位在前低位在后的情况发码应为:01 03 1b 8c 00 08 03 83。
具体CRC-16或LRC校验码的计算,我也不懂,但是可以在网上下到校验位(码)计算工具。
希望对你有帮助。本回答被提问者和网友采纳 参考技术B 旺财,有什么东西发我一份追问
0.0 居然知道是我
参考技术C 自己要编写通信协议的工业机器人-串口通信技术与MODBUS协议
目录
1. 基本的通讯方式
基本的通讯方式有并行通讯和串行通讯两种。
在远程通信和计算机科学中,串行通信(英语:Serial communication)是指在计算机总线或其他数据通道上,每次传输一个位元数据,并连续进行以上单次过程的通信方式。与之对应的是并行通信,它在串行端口上通过一次同时传输若干位元数据的方式进行通信。
串行通信被用于长距离通信以及大多数计算机网络,在这些应用场合里,电缆和同步化使并行通信实际应用面临困难。
凭借着其改善的信号完整性和传播速度,串行通信总线正在变得越来越普遍,甚至在短程距离的应用中,其优越性已经开始超越并行总线不需要串行化元件(serializer),并解决了诸如时钟偏移(Clock skew)、互联密度等缺点。PCI到PCI Express的升级就一个例子。
并行通信:是指数据的各位同时进行传送的通信方式。
串行通信:是指数据一位一位顺序传送的通信方式。
扩展资料
1. 基本概念:
并发(Concurrency):以可独立执行的进程集合的方式编程(进程是出了名的难定义,这里是通常意义上的进程,不是Linux进程)
并行(Parallelism):以可同时执行的(可能相关的)计算指令方式编程。
2. 串行通信和并行通信区别:
这里说的通信是指数字信号。 数字信号是8位二进制数,可以使用信号线传输,一种方案是使用一条数据线按照次序一个位一个位的传送,每传送完8位为一个字节,叫串行通信。另一种方法是使用8条数据线分别传送8位,一次传送一个字节,叫并行通信。 实际传输有可能不是8位数据而是其它,但原理是相同的。 理论上并行速度比较快,但是串行口线间干扰小,稍远的距离速度不低于并行口。
并行通信传输中有多个数据位,同时在两个设备之间传输。发送设备将这些数据位通过对应的数据线传送给接收设备,还可附加一位数据校验位。接收设备可同时接收到这些数据,不需要做任何变换就可直接使用。并行方式主要用于近距离通信。计算机内的总线结构就是并行通信的例子。这种方法的优点是传输速度快,处理简单。
串行数据传输时,数据是一位一位地在通信线上传输的,先由具有几位总线的计算机内的发送设备,将几位并行数据经并–串转换硬件转换成串行方式,再逐位经传输线到达接收站的设备中,并在接收端将数据从串行方式重新转换成并行方式,以供接收方使用。串行数据传输的速度要比并行传输慢得多,但对于覆盖面极其广阔的公用电话系统来说具有更大的现实意义。
串行和并行的区别
1、数据传送方式不同:串行口传输方式为数据排成一行、一位一位送出接收也一样,并行口传输8位数据一次送出.
2、针脚不同:串行口针脚少、并行口针脚多.
3、用途不同:串行口现在只用作控制接口、并行口多用作打印机、扫描仪等接口。
2. 串行通讯的两种方式
串行通信的两种基本形式:同步通信和异步通信。
异步通信所传输的数据帧格式是由1个起始位、1~9个数据位、1~2个停止位组成,依靠起始位和停止位保持同步;
同步通信所传输数据帧格式是由多个字节组成的一个帧,每个帧都有两个(或一个)同步字符作为起始位以触发同步时钟开始发送或接收数据。
3. 根据传送方向分类
根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。
4. 串行通讯接口
串行通讯物理接口按电气标准及协议来分包括RS-232、RS-422、RS485等,工业界常用RS485接口。
RS-485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485。
RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,多采用的是两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上最多可以挂接32个节点。
在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。很多情况下,连接RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来,而忽略了信号地的连接,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,
原因1是共模干扰:RS-485接口采用差分方式传输信号方式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了,但容易忽视了收发器有一定的共模电压范围,RS-485收发器共模电压范围为-7到+12V,只有满足上述条件,整个网络才能正常工作;当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口;
原因2是EMI的问题:发送驱动器输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信号地),就会以辐射的形式返回源端,整个总线就会像一个巨大的天线向外辐射电磁波。
RS485 通讯线缆结构图
5. RS485接口电路
作为一个经常被应用到的SP485R芯片的示范电路,可以被直接嵌入实际的RS-485应用电路中。微处理器的标准串行口通过RXD 直接连接SP485R 芯片的RO 引脚,通过TXD直接连接SP485R 芯片的DI 引脚。
由微处理器输出的R/D 信号直接控制SP485R 芯片的发送器/接收器使能:R/D 信号为“1”,则SP485R 芯片的发送器有效,接收器禁止,此时微处理器可以向RS-485 总线发送数据字节;R/D 信号为“0”,则SP485R 芯片的发送器禁止,接收器有效,此时微处理器可以接收来自RS-485 总线的数据字节。此电路中,任一时刻SP485R 芯片中的“接收器”和“发送器”只能够有1 个处于工作状态。
连接至A 引脚的上拉电阻R7、连接至B 引脚的下拉电阻R8 用于保证无连接的SP485R芯片处于空闲状态,提供网络失效保护,以提高RS-485 节点与网络的可靠性。
如果将SP485R 连接至微处理器80C51 芯片的UART 串口,则SP485R 芯片的RO 引脚不需要上拉;否则,需要根据实际情况考虑是否在RO 引脚增加1 个大约10K 的上拉电阻。
参考文献:https://mp.weixin.qq.com/s/qCGk-d1g5Ej7d0s3fz38PQ
6. 串口MODBUS通讯
Modbus作为工业通信回路中数据交换的规则已经被广泛地应用在各个领域,使得具有Modbus 通信协议的设备方便通信,例如PLC、变频器、流量计、温湿度、上位机组态软件、各种传感器仪表等。
Modbus通信协议分为两种串行通信模式,ASCII 和RTU 通信模式。在使用时,需要先设定通信模式以及串行口RS232、RS485的通信参数(波特率,奇偶校验,从机地址,数据位,停止位,字节顺序),在Modbus 总线上的所有设备应具有相同的通信模式和串行通信参数:
7. MODBUS消息报文
8. MODBUS关键概念
(1)上位机:读取数据每次间隔时间一般不小于100ms
(2)设备地址:MODBUS从机通讯地址,在一个网络中不能有两个相同的地址。
(3)功能码:MODBUS 协议规定的功能码
(4)寄存器地址和寄存器数
主站命令中的参数是从寄存器地址开始的寄存,读寄存器长度的N个寄存器。
(5)从站响应数据
从站响应数据是:字节数和N个数字节数据。
9. MODBUS主站常用操作
1)读优化:对于不连续地址的数据读取,是否采取打包读,则系统使用打包读命令,一次性完成多个地址的读取。
2)读优化间隔:读优化时,若地址之间小于此间隔,则会打包到一起,使用多读命令一次读取。
3)最大包长:一次通讯允许的最大数据长度。
4)字节顺序:调整32位双字的解码顺序。
以32位整数为例,说明字节顺序的含义:
1234:表示双字元件不做处理直接解码,。
例如:从串口读到的数据为0000 00 01 表示 1。
2143:表示双字元件高低字不颠倒,但字内高低字节颠倒。
例如:从串口读到的数据为0000 00 01 表示 0x00000100 (即256)。
3412:表示双字元件高低字颠倒,但字内高低字节不颠倒。
例如:从串口读到的数据为0000 00 01 表示 0x00010000 (即65536)。
4321:表示双字元件内4个字节全部颠倒。
例如:从串口读到的数据为00 00 00 01 表示 0x0100 0000 (即1677 721
10 示例程序
(1).CRC16算法:
INT16U CRC16(INT8U *puchMsg, INT16U usDataLen)
{
INT8U uchCRCHi = 0xFF; /* 高CRC字节初始化 */
INT8U uchCRCLo = 0xFF; /* 低CRC 字节初始化 */
INT8U uIndex; /* CRC循环中的索引 */
while (usDataLen--) /* 传输消息缓冲区 */
{
uIndex = uchCRCHi ^*puchMsg++; /* 计算CRC */
uchCRCHi = uchCRCLo ^auchCRCHi[uIndex];
uchCRCLo = auchCRCLo[uIndex];
}
return (uchCRCHi << 8 |uchCRCLo);
}
(2)发送命令程序
本例程以Mag64为核心CPU
void Read_InPut(INT8U Addr,INT16UStart,INT16U Len)
{
INT16U CRC;
SendBuffer_485[0]=Addr; //设备地址
SendBuffer_485[1]=0x04; //modbus功能码
SendBuffer_485[2]=Start/256; //Start为寄存器地址
SendBuffer_485[3]=Start%256;
SendBuffer_485[4]=Len/256; //Len为读取寄存器长度
SendBuffer_485[5]=Len%256;
CRC=CRC16(SendBuffer_485,6);
SendBuffer_485[6]=CRC/256; //CRC校验高位
SendBuffer_485[7]=CRC%256; //CRC校验低位
R485_OUT; //使能RS485发送
SendLen_485=8;
SendNum_485=0;
CloseINT0(); //关闭串口接受中断
UCSR0B |= BIT(UDRIE0); //打开串口发送中断
}
(3)返回数据解析
数据接收使用串口中断,ReceivedBuffer_485为接收数据组,ReceivedNum_485为接收到数据长度,ReceivedFlag_485接收到数据标志。函数float Datasum(INT8UBYTE1, INT8U BYTE2, INT8U BYTE3, INT8U BYTE4)把浮点数的4个字节转换为1个浮点数。
float Datasum(INT8U FloatByte1, INT8U FloatByte2,INT8U FloatByte3, INT8U FloatByte4)
{
float aa;
union IntTOFP
{
FP32 F32;
INT8U T8[4];
};
union IntTOFPaa;
aa.T8[0] = FloatByte1;
aa.T8[1] = FloatByte2;
aa.T8[2] = FloatByte3;
aa.T8[3] = FloatByte4;
return aa;
}
void Read_Lmag(INT8U Ad)
{
INT8U i,j;
INT8U Num1[10],BIT;
INT16UCRC1,CRC2;
FP32 Flow; //aaa为瞬时流量数值
ReceivedFlag_485=1;
Open_Time1_Ms5(20);
Read_InPut(Ad,0x1010,2); //发送设备地址、寄存器地址、寄存器长度
while(ReceivedFlag_485); //等待接收结束
if((ReceivedNum_485==9)&&(ReceivedBuffer_485[0]==Ad)) // 判断数据是否正确
{
CRC1=CRC16(ReceivedBuffer_485,7);
CRC2=ReceivedBuffer_485[7]*256+ReceivedBuffer_485[8];
if(CRC1==CRC2)
{// 转换数据为浮点数
Flow= Datasum(ReceivedBuffer_485[6], ReceivedBuffer_485[5], ReceivedBuffer_485[4] ,ReceivedBuffer_485[3]);
}
}
}
以上是关于串口通信modbus协议格式查询方式下怎么读写寄存器的主要内容,如果未能解决你的问题,请参考以下文章
一款ModbusRTU/TCP485串口协议调试软件工具绿色版免安装
一款ModbusRTU/TCP485串口协议调试软件工具绿色版免安装
C# 开发Modbus Rtu客户端 modbus测试Demo,Modbus 串口通信 , 虚拟MODBUS-RTU测试