隧道风速风向检测仪说明及MODBUS通讯设置.docx
《隧道风速风向检测仪说明及MODBUS通讯设置.docx》由会员分享,可在线阅读,更多相关《隧道风速风向检测仪说明及MODBUS通讯设置.docx(21页珍藏版)》请在冰豆网上搜索。
隧道风速风向检测仪说明及MODBUS通讯设置
隧道风速风向检测仪
1简述
使用仪器前请认真阅读本说明书,它能帮你更
快更好的熟悉并使用风速风向检测仪。
隧道风速风向传感器为隧道专用型,
传感器安装在隧道边墙上,为隧道自动化控制提供
隧道内风速、风向检测值,作为通风和营运的基本依据。
隧道风速风向传感器,具有质量轻、坚固耐用的特点,没有任何移动部件,不需维护和现场校准,能同时输出风速和风向。
隧道风速风向传感器可以与自动化控制系统或其它具有与传感器通讯一致的采集设备连用。
具有三种数据输出模式,即数字量RS485、模拟量4-20mA以及开关量输出。
2工作原理
测量超声波从传感器A到传感器B传输的时间,并与传感器B到传感器A传输的时间相比较。
例如,风从隧道入口吹来,超声波从A到B的时间就会比从B到A的时间短,通过计算超声波在两点之间的传输的时间差,就可以计算出风的速度和方向。
超声波时间差越大,表明流速越大,流速由时间差决定,压力和温度的波动不对测量值有影响(如下图)。
3安装示意图
根据联合设计图纸要求,传感器直接安装在隧道车行方向右侧,安装高度建议3-4米。
传感器支持220V供电,电缆要求3*2.5m²标准电缆且可靠接地,传输信号线缆建议使用4*1m²RVVP屏蔽线。
4传感器外形及尺寸平面图
5安装步骤
隧道风速风向为一体式传感器,无任何移动部件。
直接安装在车行方向右侧的侧壁上;安装位置要求前后无任何遮档,以免气流产生障碍或者导致紊流(如下图)。
6线缆连接
电源输入按下图所示接入AC220V50Hz交流电源。
数据输出:
该仪器具有3种数据输出接口:
1、一路4-20mA电流环输出;
2、RS485输出;
3、一组继电器输出。
如下图
7电流转换参数对照表
(1)
正向风速与电流成线性关系
正向风速(米/秒)
输出电流(4~20mA)
0
4.0
30
20.0
正向风速和输出电流呈线性关系,如右表
(2)
负向风速与电流成线性关系
负向风速(米/秒)
输出电流(4~20mA)
0
4.0
30
20.0
正向风速和输出电流呈线性关系,如右表
8主要技术指标
风速
测量范围
0-30m/s
精度
±2%
分辨率
0.01m/s
风向
仪器所测角度
正向及负向
分辨率
1°
数字输出
RS485
模拟量输出
4-20mA电流隔离输出,最大负债阻抗500Ω
防护等级
IP67
工作温度
-45℃-+75℃
工作湿度
0-100%
电源需求
220VAC±10%,50Hz/60Hz
电源功耗
1W
MODBUS协议-RTU模式
一、通讯端口定义
起始位
1bit
数据位
8bit
奇偶校验位
EVEN(偶校验)
停止位
1bit
波特率
9600
二、通讯方式
仪器与外部设备通讯方式为RS485或RS232,默认通讯方式为RS485。
三、通讯协议
MODBUS协议-RTU模式。
四、协议简介
MODBUS是一个请求/应答协议,并且提供功能码规定的服务。
MODBUS功能码是MODBUS请求/应答PDU的元素。
它是一项应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。
图1
五、协议描述
MODBUS协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。
特定总线或网络上的MODBUS协议映射能够在应用数据单元(ADU)上引入一些附加域。
图2.通用MODBUS帧
MODBUS有两种传输模式,RTU和ASCII。
本仪器采用RTU传输模式。
(一)RTU传输模式
当设备使用RTU(RemoteTerminalUnit)模式在Modbus串行链路通信,报文中每个8位字节含有两个4位十六进制字符。
这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII模式有更高的吞吐率。
每个报文必须以连续的字符流传送。
●RTU模式串行位系列
图3.RTU模式串行位序列
●ModbusRTU报文帧
图4.ASCII报文帧
●CRC校验
在RTU模式包含一个对全部报文内容执行的,基于循环冗余校验
(CRC-CyclicalRedundancyChecking)算法的错误检验域。
CRC域检验整个报文的内容。
不管报文有无奇偶校验,均执行此检验。
CRC包含由两个8位字节组成的一个16位值。
CRC域作为报文的最后的域附加在报文之后。
计算后,首先附加低字节,然后是高字节。
CRC高字节为报文发送的最后一个子节。
附加在报文后面的CRC的值由发送设备计算。
接收设备在接收报文时重新计算CRC的值,并将计算结果于实际接收到的CRC值相比较。
如果两个值不相等,则为错误。
附录含有LRC生成的详细示例。
(二)MODBUS通讯模型
图5.MODBUS事务处理(无差错)
图5中,此处的客户机指的就是要查询仪器信息的主机。
而服务器就是仪器。
图6.MODBUS事务处理(异常响应)
数据编码
MODBUS使用一个”big-Endian”表示地址和数据项。
这意味着当发射多个字节时,首先发送最高有效位。
例如:
寄存器大小值
值
16bit
0x1234
发送的第一字节为0x12然后0x34
注:
具体MODBUS协议,请参照MODBUS标准。
(三)本仪器协议支持
●支持的功能码
功能码类型
字长
功能码
描述
数据访问
16bit
03
内部寄存器读出
●仪器内部寄存器描述
本仪器有两个量可供读取:
隧道模式:
1.风向(恒为0)。
2.风速(-30m/s到+30m/s)
风标模式:
1.风向(0到359°)。
2.风速(0到30m/s)
注:
1.读取周期不宜过快,风速更新周期为1~2秒。
2.风向为0是为了兼容其他模式。
内部用3个寄存器表示这2个量。
寄存器
字长
值数据类型
值定义
值范围
寄存器1
16bit
16bit整形
风向
0
寄存器2
16bit
32bit浮点型
风速
-30m/s到+30m/s
寄存器3
16bit
注:
风速的正负表示风吹过仪器方向的正反。
●32bit浮点型存储方式
D3
D2
D1
D0
高字节
中间字节1
中间字节2
低字节
●寄存器中存储方式
数值定义
寄存器
Bit
字节位置
风速
寄存器2-高字节
8bit
D1
寄存器2-低字节
8bit
D0
寄存器3-高字节
8bit
D3
寄存器3-低字节
8bit
D2
●功能码(0x03)描述-读保持寄存器
在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。
请求PDU说明了起始寄存器地址和寄存器数量。
从零地址开始寻址寄存器。
因此,寻址寄存器1-3对应地址为0-2。
将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。
对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。
请求
功能码
1个字节
0x03
起始地址
2个字节
0x0000至0x0002
寄存器数量
2个字节
1至3
响应
功能码
1个字节
0x03
字节数
1个字节
N*2
寄存器值
N*2个字节
注:
N表示寄存器个数
错误响应
差错码
1个字节
0x83
异常码
1个字节
01,02,03,04,06
通讯实例:
读取内部3个寄存器的实例
请求
响应
域名
(十六进制)
域名
(十六进制)
功能码
03
功能码
03
起始地址-高字节
00
字节数
06
起始地址-低字节
00
寄存器1值-高字节
00
读取数量-高字节
00
寄存器1值-低字节
FF
读取数量-低字节
03
寄存器2值-高字节
23
寄存器2值-低字节
A1
寄存器3值-高字节
3C
寄存器3值-低字节
DB
如上,实际通讯系列为:
Ø请求系列:
(HEX)01030000000305CB
Ø应答系列:
(HEX)01030600FF23A13CDB3E5C
●整型解析
D1
D0
寄存器1高字节
寄存器1低字节
00
FF
高字节
低字节
转换为整形后,值为:
255
●浮点型解析
D3
D2
D1
D0
寄存器2高字节
寄存器2低字节
寄存器1高字节
寄存器1低字节
3C
DB
23
A1
高字节
中间字节1
中间字节2
低字节
转换为浮点数后,值为:
0.02675(约等于0.027)
附录1.-CRC的生成
循环冗余校验(CRC)域为两个字节,包含一个二进制16位值。
附加在报文后面的CRC的值由发送设备计算。
接收设备在接收报文时重新计算CRC的值,并将计算结果于实际接收到的CRC值相比较。
如果两个值不相等,则为错误。
CRC的计算,开始对一个16位寄存器预装全1.然后将报文中的连续的8位子节对其进行后续的计算。
只有字符中的8个数据位参与生成CRC的运算,起始位,停止位和校验位不参与CRC计算。
CRC的生成过程中,每个8–位字符与寄存器中的值异或。
然后结果向最低有效位(LSB)方向移动(Shift)1位,而最高有效位(MSB)位置充零。
然后提取并检查LSB:
如果LSB为1,则寄存器中的值与一个固定的预置值异或;如果LSB为0,则不进行异或操作。
这个过程将重复直到执行完8次移位。
完成最后一次(第8次)移位及相关操作后,下一个8位字节与寄存器的当前值异或,然后又同上面描述过的一样重复8次。
当所有报文中子节都运算之后得到的寄存器中的最终值,就是CRC.
生成CRC的过程为:
1.将一个16位寄存器装入十六进制FFFF(全1).将之称作CRC寄存器.
2.将报文的第一个8位字节与16位CRC寄存器的低字节异或,结果置于CRC寄存器.
3.将CRC寄存器右移1位(向LSB方向),MSB充零.提取并检测LSB.
4.(如果LSB为0):
重复步骤3(另一次移位).
(如果LSB为1):
对CRC寄存器异或多项式值0xA001(1010000000000001).
5.重复步骤3和4,直到完成8次移位。
当做完此操作后,将完成对8位字节的完整操作。
6.对报文中的下一个字节重复步骤2到5,继续此操作直至所有报文被处理完毕。
7.CRC寄存器中的最终内容为CRC值.
8.当放置CRC值于报文时,如下面描述的那样,高低字节必须交换。
将CRC放置于报文
当16位CRC(2个8位字节)在报文中传送时,低位字节首先发送,然后是高位字节。
例如,如果CRC值为十六进制1241(0001001001000001):
例
执行CRC生成的C语言的函数在下面示出。
所有的可能的CRC值都被预装在两个数组中,当计算报文内容时可以简单的索引即可。
一个数组含有16位CRC域的所有256个可能的高位字节,另一个数组含有地位字节的值。
这种索引访问CRC的方式提供了比对报文缓冲区的每个新字符都计算新的CRC更快的方法。
注意:
此函数内部执行高/低CRC字节的交换。
此函数返回的是已经经过交换的CRC值。
也就是说,从该函数返回的CRC值可以直接放置于报文用于发送。
(低字节首先发送,接着发送高字节)
函数使用两个参数:
unsignedchar*puchMsg;指向含有用于生成CRC的二进制数据报文缓冲区的指针
unsignedshortusDataLen;报文缓冲区的字节数.
CRC生成函数
unsignedshortCRC16(puchMsg,usDataLen)/*函数以unsignedshort类型返回CRC*/
unsignedchar*puchMsg;/*用于计算CRC的报文*/
unsignedshortusDataLen;/*报文中的字节数*/
{
unsignedcharuchCRCHi=0xFF;/*CRC的高字节初始化*/
unsignedcharuchCRCLo=0xFF;/*CRC的低字节初始化*/
unsigneduIndex;/*CRC查询表索引*/
while(usDataLen--)/*完成整个报文缓冲区*/
{
uIndex=uchCRCLo^*puchMsg++;/*计算CRC*/
uchCRCLo=uchCRCHi^auchCRCHi[uIndex];
uchCRCHi=auchCRCLo[uIndex];
}
return(uchCRCHi<<8|uchCRCLo);
}
高字节表
/*高位字节的CRC值*/
staticunsignedcharauchCRCHi[]=
{
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40
};
低字节表
/*低位字节的CRC值*/
staticcharauchCRCLo[]=
{
0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,
0xDF,0x1F,0xDD,
0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,
0x37,0xF5,0x35,0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,
0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,
0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,
0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,
0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,
0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,0x78,0xB8,0xB9,0x79,0xBB,
0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,
0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,0x50,0x90,0x91,
0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,
0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,0x88,
0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40
};
附录2.4个字节转换为浮点数。
(基于C语言)
union//共用体
{
floatTestData_Float;//浮点数(4个字节)
unsignedcharTestArray[4];//数值
}TData;
注:
在共用体中,上例中的浮点数和四个字节的字符数组共用一段存储空间。
解析:
D3
D2
D1
D0
寄存器2高字节
寄存器2低字节
寄存器1高字节
寄存器1低字节
40
AC
19
DF
高字节
中间字节1
中间字节2
低字节
转换为浮点数后,值为:
5.378
程序:
floatTempfloat;
TData.TestArray[3]=0x40;//输入高字节
TData.TestArray[2]=0xac;//
TData.TestArray[1]=0x19;//
TData.TestArray[0]=0xdf;//低字节
Tempfloat=TData.TestData_Float;//得到浮点数5.378
注:
以上实例在VC6.0测试通过,因PC是基于小端模式存储,故低地址字节存储数据低字节,高地址字节存储数据高字节。
在实际应用中,根据实际存储模式,决定存储浮点型高低字节的位置。