隧道亮度检测仪说明及MODBUS通讯设置.docx
《隧道亮度检测仪说明及MODBUS通讯设置.docx》由会员分享,可在线阅读,更多相关《隧道亮度检测仪说明及MODBUS通讯设置.docx(17页珍藏版)》请在冰豆网上搜索。
![隧道亮度检测仪说明及MODBUS通讯设置.docx](https://file1.bdocx.com/fileroot1/2022-12/16/860ec730-3496-4861-b212-254ec4ddfbd1/860ec730-3496-4861-b212-254ec4ddfbd11.gif)
隧道亮度检测仪说明及MODBUS通讯设置
隧道亮度检测仪
TunnelBringhtnessDetector
1、安装示意图
隧道亮度为一体式传感器,无任何移动部件。
安装位置要求车行方向,离洞口一个行车视距(见下图)位置处,高度以一个洞门为宜,检测器探测方向应指向洞口外路面。
晴天≥3000cd/m2云天≥1500cd/m2阴天≥750cd/m2重阴天≥350cd/m2
5、面板组成
2、面板组成
(1)五位数码管显示数值;
(2)2个按键:
设定按键SET和调节按键REG,查看和设置报警点;
(3)电源接口:
220VAC,50Hz;
(4)电源指示灯:
指示电源是否正常;
(5)短路保护:
1A熔断保险
(6)电源开关:
打开/关闭仪器电源;
(7)信号接口:
两路报警开关量输出JD1和JD2,
一路RS485数字输出口
一路模拟量4-20mA输出。
3、设置报警值
(1)正常工作时,数码管实时测量值;
(2)按键用于查看和设置报警值;
(3)工作状态下,短按REG查看报警设定值,3秒后显示实测值;
(4)工作状态下,长按SET键(长按2秒以上,直至听到嘀音)进入报警值设定:
●数码管共有5位,从左至右依次为1、2、3、4、5,首先第5位数码管闪烁;如图最后个2不停闪烁;
●通过REG按键循环数值0-9;
●通过SET按键循环数码位5-1;
●设定好报警值后,长按SET键(长按2秒以上,直至听到嘀声音),保存报警值;
●每次按键均有声音提示,表示按键操作成功;
●设置的报警值,在下次开机后生效;
4、电流转换参数对照表
模拟量输出
隧道照度传感器模拟量输
出为4-20毫安电流,阻抗不超过
500欧姆,电流与照度呈线性关系
5、隧道亮度检测仪技术参数
型号
HY-CDP22
测试范围
0-7000cd/m2
测量角度
垂直≥20º水平≥20º
测试精度
1%-5%
环境温度
-40℃---65℃
环境湿度
0-100%RH(无冷凝)
数值显示
LCD实时显示
通信接口
一路4-20mA,最大阻抗500欧姆
一路数字量RS485输出
两路继电器输出:
故障报警、量程报警
供电电压
220V50HZ
功耗
≤5W
防护等级
IP66
安装方式
立柱安装
整机重量
3KG
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值相比较。
如果两个值不相等,则为错误。
附录含有CRC生成的详细示例。
(二)MODBUS通讯模型
图5.MODBUS事务处理(无差错)
图5中,此处的客户机指的就是要查询仪器信息的主机。
而服务器就是仪器。
图6.MODBUS事务处理(异常响应)
数据编码
MODBUS使用一个”big-Endian”表示地址和数据项。
这意味着当发射多个字节时,首先发送最高有效位。
例如:
寄存器大小值
值
16bit
0x1234
发送的第一字节为0x12然后0x34
注:
具体MODBUS协议,请参照MODBUS标准。
(三)本仪器协议支持
●支持的功能码
数据访问
字长
功能码
描述
16bit
03
内部寄存器读出
写单个线圈
16bit
05
雨刮继电器(仅照度仪)
●仪器内部寄存器描述
本仪器有一个量可供读取:
cd/lux(照度或亮度)。
内部用2个寄存器表示这个量。
寄存器
字长
值数据类型
值定义
值范围
寄存器1
16bit
32bit浮点型
CD/LUX
0至7000cd/㎡
0至20000Lux
寄存器2
16bit
●32bit浮点型存储方式
D3
D2
D1
D0
高字节
低字节
●寄存器中存储方式
数值定义
寄存器
Bit
字节位置
CD/LUX
寄存器1-高字节
8bit
D1
寄存器1-低字节
8bit
D0
寄存器2-高字节
8bit
D3
寄存器2-低字节
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
例:
读取内部2个寄存器的实例
请求
响应
域名
(十六进制)
域名
(十六进制)
功能码
03
功能码
03
起始地址-高字节
00
字节数
04
起始地址-低字节
00
寄存器1值-高字节
EB
读取数量-高字节
00
寄存器1值-低字节
85
读取数量-低字节
02
寄存器2值-高字节
40
寄存器2值-低字节
51
如上,实际通讯系列为:
Ø请求系列:
(HEX)010300000002C40B
Ø应答系列:
(HEX)010304EB8540512E02
●浮点型解析
D3
D2
D1
D0
寄存器2高字节
寄存器2低字节
寄存器1高字节
寄存器1低字节
40
51
EB
85
高字节
低字节
转换为浮点数后,值为:
3.28
●
功能码(0x05)描述-写单个线圈(雨刮继电器)
内部雨刮器继电器操作:
地址为0x0000
0xff00打开继电器
0x0000关闭继电器(不支持,因为雨刮器有延时自动关闭功能。
)
请求
功能码
1个字节
0x05
输出地址
2个字节
0x0000至0x0000
输出值
2个字节
0xff00或0x0000
响应
功能码
1个字节
0x05
输出地址
2个字节
0x0000至0x0000
输出值
2个字节
0xff00或0x0000
错误
差错码
1个字节
0x85
异常码
1个字节
01或02或03或04
例:
请求
响应
域名
(十六进制)
域名
(十六进制)
功能码
05
功能码
05
输出地址-高字节
00
输出地址-高字节
00
输出地址-低字节
00
输出地址-低字节
00
输出值-高字节
FF
输出值-高字节
FF
输出值-低字节
00
输出值-低字节
00
如上,实际通讯系列为:
Ø请求系列:
(HEX)01050000FF008C3A
Ø应答系列:
(HEX)01050000FF008C3A
附录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是基于小端模式存储,故低地址字节存储数据低字节,高地址字节存储数据高字节。
在实际应用中,根据实际存储模式,决定存储浮点型高低字节的位置。