当前位置:文档之家› 精密空调协议规范(Modbus)

精密空调协议规范(Modbus)

精密空调需要测的数据(假如有)

01、温度

02、湿度

03、温度设定点

04、湿度设定点

05、工作模式

06、过滤网是否堵塞

07、电源是否故障

08、报警信号

09、机组是否过热

精密空调命令格式(Modbus协议)

1、发送

地址功能码数据起始地址高字节数据起始地址低字节数据数量高字节数据数量低字节CRC校验高字节CRC校验低字节

2、接收

地址功能码数据数量数据1 数据2 数据3……CRC校验高字节

CRC校验低字节

例:台达精密空调(意义相同的字段标上了相同的颜色)

1、发送:010200 0200 6659 E0

接收:01020D15 A0 11 23 00 00 00 00 00 00 01 00 00B0 61

01020D17A01123000000000000010000B061

112233445566778899aabbccddeeff112233

作用:读开关量输入输出与报警状态

备注:功能代码02的操作,功能代码02的所有参数都是数字量,每一位都代表一个状态。动作为1,原始状态为0。对字节中的对应位做判断。

处理:第四个字节为数据段的开始。需要判断的有

1)第四个字节的1位,是否制冷模式,第四个字节为0x15,转换成二进制为00010101,第1位为0,制冷模式信号没有动作;

2)第五个字节的1位,过滤网是否堵塞,第五个字节为0xA0,转换成二进制为10010000,1位为0,过滤网堵塞信号没有动作;

3)第五个字节的4位,电源(相序保护器)是否故障,第五个字节为0xA0,转换成二进制为10010000,4位为1,电源故障信号有动作;

4)第七个字节的7位,是否总报警,第七个字节为0x23,转换成二进制为001000117,7位为0,总报警信号没有动作;

5)第八个字节的2位,室内温度是否过低,第八个字节为0x00,转换成二进制为00000000,2位为0,室内温度过低信号没有动作;

6)第十个字节的7位,室内温度是否过高,第十个字节为0x00,转换成二进制为00000000,7位为0,室内温度过高信号没有动作;

7)第十一个字节的0位,机组是否过热,第十一个字节为0x00,转换成二进制为00000000,0位为0,机组没有过热信号没有动作。

代码:memcpy(ReceiveData2,myCOM[localCOM].buffer,18);//共18个字节数据拷贝到接

收数组中

if(aucReceiveData02[3] & 0x02)

{

stAirCondition.CoolingMode = 1;

}

if(aucReceiveData02[4] & 0x02)

{

stAirCondition.FilterBlocking = 1;

}

if(aucReceiveData02[4] & 0x10)

{

stAirCondition.PowerError = 1;

}

if(aucReceiveData02[6] & 0x80)

{

stAirCondition.GeneralAlarm = 1;

}

if(aucReceiveData02[7] & 0x04)

{

stAirCondition.HighRoomTemperature = 1;

}

if(aucReceiveData02[9] & 0x80)

{

stAirCondition.LowRoomTemperature = 1;

}

if(aucReceiveData02[10] & 0x01)

{

stAirCondition.UnitOverheat = 1;

}

2、发送:010300 0200 1124 06

接收:01032E FF B6 00 00 00 32 00 36 00 26 00 00 00 00 00 00 00 00 01 DA 00 F3 01 F4

00 DC 00 00 00 FA 00 F0 00 0A 00 32 00 0A 00 AA 00 64 00 82 00 1935 A0

01032E FFB60000003200360026000000000000000001DA00F301F400DC000000FA00F000 0A0032000A00AA00640082001935A0

112233445566778899aabbccddeeff112233445566778899aabbccddeeff112233445566778899 aabbccddeeff112233445566

作用:读模拟量参数

备注:功能代码03的操作,将输入值除以10即为实际值。

处理:第四个字节为数据段的开始。每两个字节代表空调的一个参数。这部分实测和协议上有所出入,需要得到的数据有

1)第22、23两个字节01DA,表示室内湿度,转换为十进制除以10为47.4;

2)第24、25两个字节00F3,表示室内温度,转换为十进制除以10为24.3;

3)第26、27两个字节01F4,表示设定湿度,转换为十进制除以10为50.0;

4)第28、29两个字节00DC,表示设定温度,转换为十进制除以10为22.0.

代码:memcpy(ReceiveData3,myCOM[localCOM].buffer,51);//共51个数据拷贝到接收数

组中,很多数据是无效的,

后期再修改

/*表示室内湿度*/,

AnalogInput03_Info.RoomHumidity = (float)(ReceiveData3[21] / 0x16 << 8 +

ReceiveData3[22]);

/*表示室内温度*/

AnalogInput03_Info.RoomTemperature = (float)(ReceiveData3[23] << 8 +

ReceiveData3[24]) / 10.0;

/*表示设定湿度*/

AnalogInput03_Info.HumiditySetpoint = (float)(ReceiveData3[25] << 8 +

ReceiveData3[26]) / 10.0;

/*表示设定温度*/

AnalogInput03_Info.TemperatureSetpoint = (float)((ReceiveData3[27] << 8 +

ReceiveData3[28] % 0x16)) / 10.0;

附:

1、CRC16校验

见《电量仪协议规范(Modbus)》。

2、命令发送代码

/*因为发送命令的数据比较固定,因此CRC就不在程序中计算了*/

/*底层串口卡的驱动分为SP3739和16C554两种,分别用于2代机与3代机,以下写法是2代机的16C554驱动的写法*/

char S endData02[8] = {0x01,0x02,0x00,0x02,0x00,0x66,0x59,0xE0};//功能码02

char SendData03[8] = {0x01,0x03,0x00,0x02,0x00,0x11,0x24,0x06};//功能码03

//当任务为写任务的时候,因此要分两次发送数据,所以做一个变量FunctionCount,判断当前是功能码多少从而发送相应的数据,发送完FunctionCount自加1,假如超过3了,则FunctionCount变回2。

if(TASK_FLAG == TASK_WRITE)

{

switch(FunctionCount)

{

case 2:

相关主题