迈特仪表Modbus通讯协议-101218
- 格式:doc
- 大小:211.00 KB
- 文档页数:6
迈特仪表M版通讯协议
本仪表的通讯协议遵照Modbus-RTU,Modbus作为一个标准通讯协议,由施奈德公司在1979年首次提出的,它是一个标准的、真正开放的、在工业自动化领域应用最广泛的网络通讯协议,历经近30年的考验,经久不衰。至今仍是工业、建筑、基础设施等领域中应用最广泛的标准协议之一。
仪表的波特率一般为9600bps(其他波特率订货时注明),8bit数据,1bit停止位,无奇偶校验。Modbus协议中,数据存储、传输均以“寄存器”为单位,每个寄存器都是2字节数据,高字节在先。通讯帧中,除CRC校验低字节在先以外,其余双字节数据均高字节在先。
Modbus协议概述:
Modbus协议的每次通讯请求必须由主机发起,主机按下述格式发送8字节通讯请求帧,帧结构如下:
字节1 字节2 字节3 字节4 字节5 字节6 字节7 字节8
设备地址 读命令 (读)起始地址 (读)寄存器数N CRC校验
其中,各字节含义如下:
字节1:呼叫的设备地址。只有地址一致的仪表才响应通讯请求。可订货时说明若仪表地址,或联网前用地址设置软件进行地址设置(部分表可用按键在菜单里面修改地址)。
字节2:通讯命令 03H表示读命令。
字节3、4:寄存器地址。在读操作中,表示本次请求读回的寄存器的起始地址。
字节4、5:在读命令中,表示本次请求需要连续读出的寄存器数N。
字节 7、8:循环冗余校验码(CRC校验码)前6字节的CRC校验和。计算方法见附录。
读操作成功,返回数据帧格式如下:
字节1 字节2 字节3 字节4 字节5 „„ 字节2N+3 字节2N+4 字节2N+5
设备地址 命令 字节数 返回的N个寄存器值(2N字节数据) CRC校验
其中,各字节含义如下:
字节1:回应的设备地址。和请求的设备地址应一致
字节2:若指令正确重复一遍读命令(03H),若错误返回83H
字节3:本次返回的字节数(2N)
字节4~2N+3:返回的N个寄存器值(共2N字节)。
字节2N+4、2N+5:前2N+3字节的CRC校验和。
寄存器地址表:
寄存器地址 内容 数据格式 数值范围 含义
0000H 产品代号
(仪表类型) ASCII 如:0x4156
即“A”“V”的ASCII码 AV:交流电压表 AA:交流电流表
DV:直流电压表 DA:直流电流表
HW:温控表或温度模块
1H:单相功率因数表
PH:相位表
1P:单相有功功率表
LR:低电阻表(200mΩ~20KΩ)
MR:中电阻表(200Ω~20MΩ)
HR:兆欧表(2000MΩ)
SM:传感器表
CM:电容表
TM:计时器(0~999.999~999999S)
CN:计数器(0~999999)
FR:频率表
RS:转速表(单位RPM)
0001H 显示数值 有符号整型 -20001~+20001 对于4、5位数码管的仪表均按四位半采样值输出,数值范围:-19999 ~
+19999(B1E1H~4E1FH),超量程时输出20001(4E21H)。对于6位数码管的计时器和计数器此寄存器为6位显示值的前三位。
0002H 小数点位数 无符号整型 0~4 小数点位数。例1234.5 (1位) 123.45 (2位) ;1.2345(4位)。对于6位数码管的计时器和计数器此寄存器为6位显示值的后三位。
0003H 数值单位 无符号整型 0~7 0:p 皮 (10-12)
1:n 纳 (10-9)
2:μ 微 (10-6)
3:m 毫 (10-3)
4:1无单位 (100)
5:k 千 (103)
6:M 兆 (106)
7:G 吉 (109)
0004H 读数稳定标志 无符号整型 0~1 自动量程的电流、电压、电阻表及计数器有效,其他表该位为超量程指示。
0:通讯距切换量程不到2秒钟,读数尚未稳定;超量程
1:有效数据
0005H 6数码管表有效 无符号整型 0~5 对于6数码管的仪表,本寄存器为小数点位数。对于其它表无意义(不可读)。 若主机发出的读命令超出以上寄存器地址范围,则产生出错信息,错误代码02(无效地址),返回数据如下:
读操作失败:
字节1 字节2 字节3 字节4 字节5
设备地址 83H 失败原因(02H) CRC校验
通讯范例:
例如,主机读取1号仪表的全部数据,则主机向485总线上发送:
字节 字节1 字节2 字节3 字节4 字节5 字节6 字节7 字节8
数据 0x01 0x03 0x00 0x00 0x00 0x05 0x85 0xC9
含义 设备地址 读 从寄存器0000开始 共读取0005个寄存器 CRC校验
=0xC985
只有1号仪表响应,返回数据:
字节 字节1 字节2 字节3 字节4 字节5 字节6 字节7 字节8 字节9
数据 0x01 0x03 0x0A 0x41 0x56 0x30 0x39 0x00 0x02
含义 设备地址 读成功 返回数据10字节 “AV”交流电压表 读数值=0x3039
=12345 小数点=2位
即读数=123.45
字节 字节10 字节11 字节12 字节13 字节14 字节15
数据 0x00 0x03 0x00 0x01 0x42 0x13
含义 数值单位 = m
显示值=123.45mV 读数稳定标志=1
数据有效 CRC校验
=0x4213
地址设置软件使用说明:
对于大多数仪表可以用我们配置的地址修改软件来修改地址,将需要被设置或更改地址的仪表单独通过485/232转接器和PC机连接,先不要接通仪表电源,打开MeterConfig软件,界面如上图。点击“打开串口”按钮,弹出串口设置窗口(下图),设置串口号、波特率。若串口正确被打开,主界面的指示灯变绿、地址设置框被激活,可以输入设备地址(新地址),Modbus协议允许的地址范围是十进制1~247(请注意进制转换,表身贴签上出厂默认的地址为十六进制)。
此时,可以将仪表通电,10秒内,点击“设置”按钮。若地址写入正确,下方状态栏变绿并提示“地址设置成功”。
迈特通讯测试软件
为方便用户进行简单的通讯测试,我们提供 一个通用测试软件,如右图:
设定仪表地址(选项栏中左侧为十进制,右侧为十六进制),端口号,波特率等,即可进行测试。软件会根据仪表的特征字自动加上单位显示,方便用户读数。对于自动量程的仪表在量程转换时,测试软件的示值要等到量程转换完毕后才刷新,并不显示转换的过程,因此转换时仪表示值和上位机示值不同步。
用Modbus-Poll 软件测试通讯
用户也可以使用Modbus-IDA(国际自动化接口)组织提供的官方测试软件Modbus-Poll来测试Modbus设备与485网络通讯状况。
设置设备参数
设置串口参数
安装后运行,显示如上图界面。点击“新建”按钮,可以添加新的待测设备(最多支持同时测试10个设备),添加后点击Setup->Poll Defination菜单,设置设备参数。包括设备地址,读寄存器起始地址,连续读寄存器数,时间间隔等信息。
最后点击Connect菜单,设置串口参数(9600,8,None,1),RTU模式、通讯超时等待时间、两次通讯间延迟等参数。
通讯连接后,ModbusPoll软件会按照设定的时间间隔,自动扫描所有设备,每个窗口可以看到对应设备的寄存器数值,以及通讯次数(TX),错误次数(Err),错误原因(红色提示信息)、串口数据流(标有“101”按钮)、错误统计信息(Display->ErrCounter)。还可实现错误自动暂停等高级触发功能,对分析网络通讯错误有着极大的帮助。
用串口调试工具测试
用户也可以用串口调试工具依照通讯协议敲入代码来进行通讯测试,注意CRC校验值为低字节在前(可以直接把CRC计算器的计算结果复制到串口输入窗口)。 附录1:CRC-16校验码计算方法
1. CRC循环冗余校验的计算方法
CRC-16C(循环冗余错误校验)生成CRC-16校验字节的步聚如下:
(1)装入一个16位寄存器,所有数位均为1。
(2)该16位寄存器的高位字节与开始8位字节进行“异或”运算。运算结果放入这个16位寄存器。
(3)把这个16位寄存器向右移1位。
(4a)若向右(标记位)移出的数位是1,则将这个寄存器和多项式1010000000000001(A001H)进行“异或”运算。
(4b)若向右移出的数位是0,则返回(3)。
(5)重处处(3)和(4),直至移出8位。
(6)另外8位与该16位寄存器进行“异或”运算。
(7)重处处(3)-(6),直至该报文所有字节均与16位寄存器进行“异或”运算,并移位8次。
(8)这个16位寄存器的内容即2字节CRC校验值。
2. CRC循环冗余校验参考例程(C语言):
//----------- CRC-16循环冗余效验函数---------------
unsigned int Caculate_CRC16(unsigned char *DAT, unsigned char Lenth)
{
// *DAT指向要计算CRC的数组, Lenth为数据的有效长度
unsigned int CRC = 0xffff;// CRC的初始值为FFFF
unsigned char i;
unsigned char j;
for(i=0; i
{
CRC = CRC ^ DAT[i]; // 和当前字节异或一次
for(j=0; j<8; j++) // 每个字节循环8次
{
if(CRC & 0x01) // 判断最低位,如果为1
{
CRC = CRC >> 1; // 右移一位
CRC = CRC ^ 0xA001; // 和多相式异或
}
else // 判断最低位,如果为0
{
CRC = CRC >> 1; // 右移一位
}
}
}
return(CRC); //返回结果
}
例如:某数组ReceiveBuff[N]中存有接收到的15字节数据,需要计算这15字节的CRC校验和,结果存放于CrcResult中
unsigned int CrcResult;
CrcResult= Caculate_CRC16(ReceiveBuff,15);
一个正确的数据帧,所有数据(包括CRC校验),计算CRC校验应该等于0。
3. CRC循环冗余校验参考例程(Visual-Basic):
'---- 1字节CRC校验计算程序 ---------------------------------------