迈特仪表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校验计算程序 ---------------------------------------