功能域代码告诉了被寻址到的终端执行何种功能。下表列出了该系列仪表用到的功能码,以及它们的意义和功能。
代码
意义
行为
03
读数据寄存器
获得一个或多个寄存器的当前二进制值
16
预置多寄存器
设定二进制值到一系列多寄存器中(不对ACRE开放)
9.数据(Data)域
数据域包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这些数据的内容可能是数值、参考地址或者设置值。例如:功能域码告诉终端读取一个寄存器,数据域则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机之间的不同内容而有所不同。
10.错误校验(Check)域
该域允许主机和终端检查传输过程中的错误。有时,由于电噪声和其它干扰,一组数据在从一个设备传输到另一个设备时在线路上可能会发生一些改变,出错校验能够保证主机或者终端不去响应那些传输过程中发生了改变的数据,这就提高了系统的安全性和效率,错误校验使用了16位循环冗余的方法(CRC16)。
11.错误检测的方法
错误校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传输设备计算出来,附加到数据帧上,接收设备在接收数据时重新计算CRC值,与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。
CRC运算时,将一个16位的寄存器预置为全1,连续把数据帧中的每个字节中的8位与该寄存器的当前值进行运算,仅仅每个字节的8个数据位参与生成CRC,起始位和终止位以及可能使用的奇偶位都不影响CRC。在生成CRC时,每个字节的8位与寄存器中的内容进行异或,将结果向低位移位,高位则用“0”补充,Zui低位(LSB)移出并检测,如果是1,该寄存器就与一个预设的固定值(0A001H)进行一次异或运算,如果Zui低位为0,不作任何处理。
上述处理重复进行,直到执行完了8次移位操作,当Zui后一位(第8位)移完以后,下一个8位字节与寄存器的当前值进行异或运算,同样进行上述的另一个8次移位异或操作,当数据帧中的所有字节都作了处理,生成的Zui终值就是CRC值。
12.生成一个CRC的流程为:
Ø 预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。
Ø 把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。
Ø 将CRC寄存器向右移一位,Zui高位填以0,Zui低位移出并检测。
Ø 如果Zui低位为0:重复第三步(下一次移位);如果Zui低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。
Ø 重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。
Ø 重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。
Ø Zui终CRC寄存器的值就是CRC的值。
还有一种利用预设的表格计算CRC的方法,它的主要特点是计算速度快,表格需要较大的存储空间,该方法此处不再赘述,请参阅相关资料。
13.通讯应用格式祥解
本节所举实例将尽可能的使用如图所示的格式,(数字为16进制)。
Addr
Fun
Data start reg hi
Data start reg lo
Data #of regs hi
Data #of regs lo
CRC16 lo
CRC16hi
01H
03H
00H
00H
00H
03H
05H
CBH
Addr:从机地址
Fun:功能码
Data start reg hi:数据起始地址 寄存器高字节
Data start reg lo:数据起始地址 寄存器低字节
Data #of reg hi:数据读取个数 寄存器高字节
Data #of reg lo:数据读取个数 寄存器低字节
CRC16 Hi: 循环冗余校验 高字节
CRC16 Lo: 循环冗余校验 低字节
14.读数据(功能码03)
查询数据帧
此功能允许用户获得设备采集与记录的数据及系统参数。主机一次请求的数据个数没有限制,但不能超出定义的地址范围。
下面的例子是从01号从机读3个采集到的基本数据(数据帧中每个地址占用2个字节)UA、UB、UC,其中UA的地址为0025H,UB的地址为0026H,UC的地址为0027H。
Addr
Fun
Data start
Addr hi
Datastart
Addr lo
Data#of
regs hi
Data #of
regs lo
CRC16 lo
CRC16 hi
01H
03H
00H
25H
00H
03H
14H
00H
响应数据帧
响应包含从机地址、功能码、数据的数量和CRC错误校验。
下面的例子是读取UA、UB、UC(UA=082CH,UB=082AH,UC=082CH的响应。
Addr
Fun
Byte count
Data1 hi
Data1 lo
Data2 hi
Data2 lo
Data3 hi
Data3 lo
CRC16 lo
CRC16 hi
01H
03H
06H
08H
2CH
08H
2AH
08H
2CH
94H
4EH
错误指示码
如果主机请求的地址不存在则返回错误指示码:FFH。