01H(读取线圈状态)
|
请求数据包格式:ADDRESS(1BYTE) 01H(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) NUMH(1BYTE) NUML(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
解释:ADDRESS=被请求对象的地址,服务器地址或从站地址;STARTADDR=读取的线圈的启示位地址;NUM=连续读取的线圈的个数;CRC=对于RTU来讲是有的,CRC校验。
回应数据包格式:ADDRESS(1BYTE) 01H(1BYTE) BYTECOUNT(1BYTE) DATA1 ... DATAN
CRCL(1BYTE) CRCH(1BYTE)
解释:ADDRESS=被请求对象的地址,也就是服务器或从站地址;BYTECOUNT=发送的数据帧中,数据的字节数,CRC=对于RTU来讲是有的,CRC校验。
注意:
回复数据时,数据帧的DATA顺序是,字节顺序从左往右由低到高,每个字节DATA中的位从右往左是bit0~bit7!
|
02H(读取离散状态)
|
请求数据包格式:ADDRESS(1BYTE) 02H(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) NUMH(1BYTE) NUML(1BYTE) CRCL(1BYTE) CRCH(1BYTE) 解释:ADDRESS=被请求对象的地址,服务器地址或从站地址;STARTADDR=读取的离散状态的启示位地址;NUM=连续读取的线圈的个数;CRC=对于RTU来讲是有的,CRC校验。 回应数据包格式:ADDRESS(1BYTE) 01H(1BYTE) BYTECOUNT(1BYTE) DATA1 ... DATAN CRCL(1BYTE) CRCH(1BYTE) 解释:ADDRESS=被请求对象的地址,也就是服务器或从站地址;BYTECOUNT=发送的数据帧中,数据的字节数,CRC=对于RTU来讲是有的,CRC校验。 注意:回复数据时,数据帧的DATA顺序是,字节顺序从左往右由低到高,每个字节DATA中的位从右往左是bit0~bit7! |
03H(读取保持寄存器)
|
请求数据包格式:ADDRESS(1BYTE) 03H(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) NUMH(1BYTE) NUML(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
解释:ADDRESS=被请求对象的地址,服务器地址或从站地址;STARTADDR=读取的线圈的起始字地址;NUM=连续读取的字个数;CRC=对于RTU来讲是有的,CRC校验。
回应数据包格式:ADDRESS(1BYTE) 03H(1BYTE) BYTECOUNT(1BYTE) DATA1 ... DATAN
CRCL(1BYTE) CRCH(1BYTE)
解释:ADDRESS=被请求对象的地址,也就是服务器或从站地址;BYTECOUNT=发送的数据帧中,数据的字节数,CRC=对于RTU来讲是有的,CRC校验。
注意:
1、根据在工业标准,这里的寄存器单位是字(2个byte)或者双字(4byte);2、回复数据时,数据帧中DATA的数据顺序是,以一个字作为单位,从左往右是由低到高,但每个字的字节中,从左往右是从高到低!!!
|
04H(读取输入寄存器)
|
请求数据包格式:ADDRESS(1BYTE) 04H(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) NUMH(1BYTE) NUML(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
解释:ADDRESS=被请求对象的地址,服务器地址或从站地址;STARTADDR=读取的线圈的起始字地址;NUM=连续读取的字个数;CRC=对于RTU来讲是有的,CRC校验。
回应数据包格式:ADDRESS(1BYTE) 04H(1BYTE) BYTECOUNT(1BYTE) DATA1 ... DATAN
CRCL(1BYTE) CRCH(1BYTE)
解释:ADDRESS=被请求对象的地址,也就是服务器或从站地址;BYTECOUNT=发送的数据帧中,数据的字节数,CRC=对于RTU来讲是有的,CRC校验。
注意:
1、根据在工业标准,这里的寄存器单位是字(2个byte)或者双字(4byte);2、回复数据时,数据帧中DATA的数据顺序是,以一个字作为单位,从左往右是由低到高,但每个字的字节中,从左往右是从高到低!!!
|
05H(写入单个线圈指令)
|
请求数据包格式:ADDRESS(1BYTE) 05H(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) DATAH(1BYTE) DATAL(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
解释
:ADDRESS=被请求对象的地址,服务器地址或从站地址;STARTADDR=写入的单个线圈的位地址;DATA=写入线圈的值
(0XFF00代表线圈为TRUE,0X0000代表线圈为FLASE);CRC=对于RTU来讲是有的,CRC校验。
回应数据包格式:ADDRESS(1BYTE) 05H(1BYTE) DATAH(1BYTE) DATAL(1BYTE) BYTECOUNT(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
解释:ADDRESS=被请求对象的地址,也就是服务器或从站地址;BYTECOUNT=发送的数据帧中,数据的字节数
(这里固定为1),CRC=对于RTU来讲是有的,CRC校验。
|
06H(写入单个寄存器)
|
请求数据包格式:ADDRESS(1BYTE) 06H(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) DATAH(1BYTE) DATAL(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
解释
:ADDRESS=被请求对象的地址,服务器地址或从站地址;STARTADDR=写入的单个寄存器的字地址;DATA=写入寄存器的值;CRC=对于RTU来讲是有的,CRC校验。
回应数据包格式:ADDRESS(1BYTE) 06H(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) DATAH(1BYTE) DATAL(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
注意:
1、06H功能回复的数据直接是请求的数据;2、根据工业标准,一个寄存器是2个字节,单位是字。
|
0FH(写入多个线圈指令)
|
请求数据包格式:ADDRESS(1BYTE) 0FH(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) NUMH(1BYTE) NUML(1BYTE) COUNT(1BYTE) DATAL(1BYTE) ... DATAH(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
解释
:ADDRESS=被请求对象的地址,服务器地址或从站地址;STARTADDR=写入的线圈的起始地址;NUM=连续写入的线圈的个数(单位是bit);COUNT=DATA的数量(字节数);DATA=写入线圈的值;CRC=对于RTU来讲是有的,CRC校验。
回应数据包格式:ADDRESS(1BYTE) 0FH(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) NUMH(1BYTE) NUML(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
注意:
1、连续写入多个线圈,DATA中,从左往右的字节顺序是从低到高。
|
10H(写入多个寄存器指令)
|
请求数据包格式:ADDRESS(1BYTE) 10H(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) NUMH(1BYTE) NUML(1BYTE) COUNT(1BYTE) DATAL(1BYTE) ... DATAH(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
解释
:ADDRESS=被请求对象的地址,服务器地址或从站地址;STARTADDR=写入的寄存器的起始字地址;NUM=连续写入的字的个数(一个字2个byte);COUNT=DATA的数量(总字节数);DATA=写入寄存器的值;CRC=对于RTU来讲是有的,CRC校验。
回应数据包格式:ADDRESS(1BYTE) 10H(1BYTE) STARTADDRH(1BYTE) STARTADDRL(1BYTE) NUMH(1BYTE) NUML(1BYTE)
CRCL(1BYTE) CRCH(1BYTE)
注意:
1、在连续写入多个寄存器指令中,DATA数据内容,每两个DATA代表一个字,且字的顺序从左到右为由低到高;2、每个字的字节顺序为由高到低!!!
|
static unsigned short Make_CRC(unsigned char *Data_buff,int Data_length) //调用此函数生成CRC校验码,函数返回CRC校验码//
{
if(NULL == Data_buff)
return 0xffff;
unsigned short wcrc = 0xffff; //CRC寄存器预置//
unsigned char temp;
unsigned int i=0,j=0; //计数//
/*循环计算每个数据*/
for(i=0;i>= 1;
wcrc ^= 0xa001;
}
else
wcrc >>= 1;
}
}
//对计算结果进行高低字节兑换//
unsigned char CRC_L = wcrc & 0xff;
unsigned char CRC_H = wcrc >> 8;
return ((CRC_L << 8) | CRC_H);
}
容
|
解释
|
事务处理标识
|
可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。计数动作由主站来完成,
从站在回复主站的数据请求时,回复的数据帧要包含回复对应的序列号,主站才可以在接收到从站回复的消息后,知道从站回复的是哪一个请求。
|
协议标识符
|
00 00表示ModbusTCP协议;
这个是固定不可变的。
|
长度
|
表示
接下来的数据长度,单位为字节。
|
单元标识符
|
可以理解为设备地址。就是被访问的设备ID
|