本变频器使用的Modbus协议通信数据格式分为RTU(远程终端单元)模式和ASCII(American Standard Code for Information International Interchange)模式两种。
10.3.1 RS485
RS485接口工作于半双工,数据信号采用差分传输方式,也称作平衡传输。它使用一对双绞线,将其中一线定义为A(+),另一线定义为B(-)。通常情况下,发送驱动器A、B之间的正电平在+2~+6V表示逻辑“1”,电平在-2V~-6V表示逻辑“0”。
变频器端子板上的485+对应的是A,485-对应的是B。
通讯波特率(P14.01)是指用一秒钟内传输的二进制bit数,其单位为每秒比特数bit/s(bps)。设置波特率越高,传输速度越快,抗干扰能力越差。当使用0.56mm(24AWG)双绞线作为通讯电缆时,根据波特率的不同,最大传输距离如下表:
波特率 | 传输最大距离 | 波特率 | 传输最大距离 |
2400BPS | 1800m | 9600BPS | 800m |
4800BPS | 1200m | 19200BPS | 600m |
RS485远距离通讯时建议采用屏蔽电缆,并且将屏蔽层作为地线。
在设备少距离短的情况下,不加终端负载电阻整个网络能很好的工作,但随着距离的增加性能将降低,所以在较长距离时,建议使用120Ω终端电阻。
10.3.2 RTU模式
在RTU模式中,新帧总是以至少3.5个字节的传输时间静默作为开始。在以波特率计算传输速率的网络上,3.5个字节的传输时间可以轻松把握。紧接着传输的数据域依次为:从机地址、操作命令码、数据和CRC校验字,每个域传输字节都是十六进制的0…9,A…F。网络设备始终监视着通讯总线的活动。当接收到第一个域(地址信息),每个网络设备都对该字节进行确认。随着最后一个字节的传输完成,又有一段类似的3.5个字节的传输时间间隔,用来表识本帧的结束,在此以后,将开始一个新帧的传送。
一个帧的信息必须以一个连续的数据流进行传输,如果整个帧传输结束前有超过1.5个字节以上的间隔时间,接收设备将清除这些不完整的信息,并错误认为随后一个字节是新一帧的地址域部分,同样的,如果一个新帧的开始与前一个帧的间隔时间小于3.5个字节时间,接收设备将认为它是前一帧的继续,由于帧的错乱,最终CRC校验值不正确,导致通讯故障。
RTU帧的标准结构:
帧头START | T1-T2-T3-T4(3.5个字节的传输时间) |
从机地址域ADDR | 通讯地址:0~247(十进制)(0为广播地址) |
功能域CMD | 03H:读从机参数 06H:写从机参数 |
数据域 DATA(N-1) … DATA(0) | 2*N个字节的数据,该部分为通讯的主要内容,也是通讯中,数据交换的核心 |
CRC CHK 低位 | 检测值:CRC校验值(16BIT) |
CRC CHK 高位 | |
帧尾END | T1-T2-T3-T4(3.5个字节的传输时间) |
10.3.3 ASCII模式
名称 | 定义 |
编码系统 | 通讯协议属于16进制,ASCII的信息字符意义:“0”…“9”,“A”…“F”每个16进制都用对应字符的ASCII信息表示: |
数据格式 | 起始位、7/8个数据位、校验位和停止位。数据格式的描述如下表: 10-bit字符帧: |
在ASCII模式中,帧头为“:”(“0x3A”),帧尾缺省为“CRLF”(“0x0D”“0x0A”)。在ASCII方式下,除了帧头和帧尾之外,其余的数据字节全部以ASCII码方式发送,先发送高4位位元组,然后发送低4位位元组。ASCII方式下数据为8位长度。对于‘A’~‘F’,采用其大写字母的ASCII码。此时数据采用LRC校验,校验涵盖从从机地址到数据的信息部分。校验和等于所有参与校验数据的字符和(舍弃进位位)的补码。
ASCII帧的标准结构:
START | ‘:’(0x3A) |
Address Hi | 通讯地址: 8-bit 地址由2个ASCII码组合 |
Address Lo | |
Function Hi | 功能码: 8-bit 地址由2个ASCII码组合 |
Function Lo | |
DATA(N-1) … DATA(0) | 数据内容: nx8-bit 数据内容由2n个ASCII码组合 n<=16,最大32个ASCII码 |
LRC CHK Hi | LRC检查码: 8-bit 检验码由2个ASCII码组合 |
LRC CHK Lo | |
END Hi | 结束符: END Hi=CR(0x0D),END Lo=LF(0x0A) |
END Lo |
10.3.4 RTU通讯帧错误校验方式
帧的错误校验方式主要包括两个部分的校验,即字节的位校验(奇/偶校验)和帧的整个数据校验(CRC校验或LRC校验)。
10.3.4.1 字节位校验
用户可以根据需要选择不同的位校验方式,也可以选择无校验,这将影响每个字节的校验位设置。
偶校验的含义:在数据传输前附加一位偶校验位,用来表示传输的数据中"1"的个数是奇数还是偶数,为偶数时,校验位置为"0",否则置为"1",用以保持数据的奇偶性不变。
奇校验的含义:在数据传输前附加一位奇校验位,用来表示传输的数据中"1"的个数是奇数还是偶数,为奇数时,校验位置为"0",否则置为"1",用以保持数据的奇偶性不变。
例如,需要传输"11001110",数据中含5个"1",如果用偶校验,其偶校验位为"1",如果用奇校验,其奇校验位为"0",传输数据时,奇偶校验位经过计算放在帧的校验位的位置,接收设备也要进行奇偶校验,如果发现接受的数据的奇偶性与预置的不一致,就认为通讯发生了错误。
10.3.4.2 CRC校验方式---CRC(Cyclical Redundancy Check)
使用RTU帧格式,帧包括了基于CRC方法计算的帧错误检测域。CRC域检测了整个帧的内容。CRC域是两个字节,包含16位的二进制值。它由传输设备计算后加入到帧中。接收设备重新计算收到帧的CRC,并与接收到的CRC域中的值比较,如果两个CRC值不相等,则说明传输有错误。
CRC是先存入0xFFFF,然后调用一个过程将帧中连续的6个以上字节与当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
CRC产生过程中,每个8位字符都单独和寄存器内容相异或(XOR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值相异或,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相异或。最终寄存器中的值,是帧中所有的字节都执行之后的CRC值。
CRC的这种计算方法,采用的是国际标准的CRC校验法则,用户在编辑CRC算法时,可以参考相关标准的CRC算法,编写出真正符合要求的CRC计算程序。
现在提供一个CRC计算的简单函数给用户参考(用C语言编程):
unsigned int crc_cal_value(unsigned char *data_value,unsigned char data_length)
{
int i;
unsigned int crc_value=0xffff;
while(data_length--)
{
crc_value^=*data_value++;
for(i=0;i<8;i++)
{
if(crc_value&0x0001)
crc_value=(crc_value>>1)^0xa001;
else
crc_value=crc_value>>1;
}
}
return(crc_value);
}
在阶梯逻辑中,CKSM根据帧内容计算CRC值,采用查表法计算,这种方法程序简单,运算速度快,但程序所占用ROM空间较大,对程序空间有要求的场合,请谨慎使用。
10.3.4.3 ASCII模式的校验(LRC Check)
校验码(LRC Check)由Address到Data Content结果加起来的值,例如上面2.2.2通讯信息的校验码:0x02+0x06+0x00+0x08+0x13+0x88=0xAB,然后取2的补码=0x55。
现在提供一个LRC计算和简单函数给用户参考(用C语言编程):
Static unsigned char
LRC(auchMsg,usDataLen)
unsigned char *auchMsg;
unsigned short usDataLen;
{
unsigned char uchLRC=0;
while(usDataLen--)
uchLRC+=*auchMsg++;
return((unsigned char)(~((char)uchLRC)));
}