最后更新:2022-05-04 21:42:06 手机定位技术交流文章
ModBus通信协议分为RTU和ASCII协议;下面是ModBus RTU协议的简要摘要:
一、通讯协议
(一) 通信方式:
通信传输分为单独的信头和编码数据,以下通信方式也符合MODBUS RTU章程:
编 码 8位二进制
起始位 1位
数据位 8位
木偶校准地点1(木偶校准地点)
停止位 1位
CRC(冗余环圈代码)错误校校
= 初始结构4字节的时间
1字节 = 地址代码
1 字节等于 1 函数代码
N 字节=数据区域
校准误差 = 16 位 CRC 代码
4千字节时间 = 最终结构
地址代码是传输的初始字节 。此位表示将从主机收到用户指定的地址代码 。每台机器都有自己的地址密码答复首先从其各自的地址号码开始。主机的地址代码显示要从计算机发送的地址 。机器提供的地址代码 揭示了机器的返回地址
通信传输的第二个字节是功能代码。《ModBus通信法》界定了职能1至127。这一工具仅使用其功能代码的一个子集。作为主机请求发送,机器会用功能代码告诉你该怎么做作为从机响应,机器发送的函数代码与主机发送的函数代码相同。它还表明,机器是应东道方的要求采取行动的。如果机器的最大功能代码为1(例如,同时127个最大和最大),,表示没有从计算机中找到答案,或者发送错误。
数据区域:视功能代码而定,数据区域可以是实际值、设定点、机器地址的主机或主机地址的主机。
《儿童权利公约》准则:二比特的误差探测代码。
(二)、通讯规约:
当仪器收到通讯命令时,这是一个人第一次获得与正确地址代码相对应的通信命令。并除去地址码,读取信息,如果没有出错,执行相关工作;结果送交发件人地址代码、采取行动的功能编号、执行操作结果的数据以及错误检查代码都返回。如果出事了,不要发短信
1.信息帧结构
地址代码、功能代码、数据区域和错误校准代码都是代码的例子。
N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 位、 N 8 8 位、 N 8 8 位、 N 8 8 位、 N 8 8 位、 N 8 8 位、 N 8 8 位、 N 8 8 位、 N 8 8 位、 N 8 8 位、 N 8 8 位、 N 8 位、 n 8 位、 8 位、 8 位、 8 位、 8 位
地址代码是信息框的第一个字节( 8 个职位 ) 。从0到255。此字节表示主机的信件将在用户指定的地址从服务器接收 。每台机器必须有一个不同的地址代码。只有对地址代码进行回复的计算机才能作出反应。当从机回送信息时,相应的地址号码确定了信息来源。
东道主发送功能代码, 告知机器要完成的任务。 表1-2中描述的功能代码定义了定义和操作 。
代码 含义 操作
03 读取数据 在当前登记册中,读取一个或多个二进制值 。
06 重新配置一个登记册,并将设定的二进制值写入一个登记册
数据区域:数据区域包括信息,说明应采取何种行动,或从计算机中收回哪些行动。这种信息可以是数字、参考地址或两者的组合。例如,函数代码表示机器从注册处读取的值。要阅读登记册,数据区域必须包含起始地址和读数长度。对于不同的从机,地址和数据不是一回事。
错误校准代码: 主机或机器是否可以使用校准代码来检测电文是否在错误中收到 。有时,由于电子噪音或其他干扰因素,在传送期间,信息略有变化。错误校准已经核实主机或机器在整个传输过程中没有处理错误信息。这提高了系统的安全和效率。CRC-16核查技术用于错误核查。
应当指出,框架格式基本上是相同的:地址代码、功能代码、数据区域和错误检查代码。
2.错误校验
《冗余周期法》(CRC)由两字节组成。即16位二进制。发送者计算了CRC代码。电文在电文结尾处发出。根据《儿童权利公约》代码重新计算接收装置。比较《儿童权利公约》所收儿童人数是否与所收人数相匹配。如果两者不相符,则表明出错。
CRC代码计算法是将所有16位存储器设定为1.8位数数据信息,每8位数数据信息将经过一段时间处理。只有8位数数据用于CRC代码的计算、起始和停止位,如果有奇特的检查位,奇特的检查位将不包含在CRC代码计算中。
当计算 CRC 代码时, 8 位数据与发送者的数据不同或不同,结果被移到最底层的一字节,顶部 0 被填满。再次检查最低的字节,如果是 1,登记簿的内容与预设不同;否则,不更改或操作 。
这一程序已经执行了八次。第8次移位后,接下来的八种与目前发件人的材料独特或不同。如前所述,这一过程进行了八次。当所有数据信息处理完毕后,《儿童权利公约》的编码价值储存在最后登记册中。收到时,《儿童权利公约》代码中的数据以较低的字节提供。
计算《儿童权利公约》编码时遵循下列程序:
• 将16位数发射机转换为十六进制发射机(即全部1),该登记册称为《儿童权利公约》登记册。
• 将《儿童权利公约》16位数登记簿中的数据头八位数分开,或将结果存入《儿童权利公约》登记簿;
• 将登记册的内容向右(向下)移动,填充前0,以检查最低者;
• 如果最低值为0,重复第3步(搬迁);如果最低值为1,则《儿童权利公约》登记簿不是A001(100 00 00/01)乘数之一;或
· 重复步骤3和4,直到所有八次向右移动都得到处理。
• 重复步骤2-5,用于下列八个数据处理业务。
• 《儿童权利公约》守则是最后收到《儿童权利公约》登记册。
3. 03 函数、读点和返回值:
文书使用了Modbus RTU通讯议定书。利用通讯命令,您可以读取值(“ 保存注册簿 ” ) 或返回值(“ 输入注册簿 ” )。登记册以16比特(2字节)保存并输入。并且高位在前。这意味着仪器的读点和返回值都是两个字节。在任何特定时刻,读取库的最大数量为60个。由于某些可编程控制器不使用03函数,因此,第03号函数既用作读取点,又用作返回值。机器回答的指令形式来自机器地址、功能代码、数据区域和CRC代码。数据部分的每两个字节中,每两个字节前面都有登记数据。
4. 单点保存,功能代码06
此命令被主机用于存储仪器内存中的单点数据。 机器也使用此命令将信息传送回主机 。
二、编程举例
以下是VC的ModBus RTU通讯的例子。
(一)、通讯口设置
DCB dcb;
hCom=CreateFile(“COM1”,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hCom==INVALID_HANDLE_VALUE)
{
MessageBox(“createfile error,error”);
}
BOOL error=SetupComm(hCom,1024,1024);
if(!error)
MessageBox(“setupcomm error”);
error=GetCommState(hCom,&dcb);
if(!error)
MessageBox(“getcommstate,error”);
dcb.BaudRate=2400;
dcb.ByteSize=8;
dcb.Parity=EVENPARITY;//NOPARITY;
dcb.StopBits=ONESTOPBIT;
error=SetCommState(hCom,&dcb);
(二) 计算CRC校准编码
UINT crc
void calccrc(BYTE crcbuf)
{
BYTE i;
crc=crc ^ crcbuf;
for(i=0;i<8;i++)
{
BYTE TT;
TT=crc&1;
crc=crc>>1;
crc=crc&0x7fff;
if (TT==1)
crc=crc^0xa001;
crc=crc&0xffff;
}
}
(三)、数据发送
zxaddr=11;// 读取从地址 11 开始的检查表数据
使用 zxnum= 10; / 读取 10 频道的数据 。
writebuf2[0]=zxaddr;
writebuf2[1]=3;
writebuf2[2]=0;
writebuf2[3]=0;
writebuf2[4]=0;
writebuf2[5]=zxnum;
crc=0xffff;
calccrc(writebuf2[0]);
calccrc(writebuf2[1]);
calccrc(writebuf2[2]);
calccrc(writebuf2[3]);
calccrc(writebuf2[4]);
calccrc(writebuf2[5]);
writebuf2[6]=crc & 0xff;
writebuf2[7]=crc/0x100;
WriteFile(hCom,writebuf2,8,&comnum,NULL);
(四)、数据读取
ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL);//读取zxnum个通道数据
可列入处理错误的程序,如地址代码错误、CRC代码错误判断、通信故障处理等。
本文由 在线网速测试 整理编辑,转载请注明出处。