精密空调需要测的数据(假如有)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 6101020D17A01123000000000000010000B061112233445566778899aabbccddeeff112233作用:读开关量输入输出与报警状态备注:功能代码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 F400 DC 00 00 00 FA 00 F0 00 0A 00 32 00 0A 00 AA 00 64 00 82 00 1935 A001032E FFB60000003200360026000000000000000001DA00F301F400DC000000FA00F000 0A0032000A00AA00640082001935A0112233445566778899aabbccddeeff112233445566778899aabbccddeeff112233445566778899 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};//功能码02char 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:{COMWrites(localCOM,SendData02,8);TASK_FLAG = TASK_NULL;break;}case 3:{COMWrites(localCOM,SendData03,8);TASK_FLAG = TASK_NULL;}default:{break;}}}3、数据打包代码//测试用,未完全处理sprintf(OutString,"Result:%02X %02X %02X %02X %02X %02X %02X %02X %02X %02 X RoomTemperature=%.1f TempatureSetpoint=%.1f\r\n,OnOffAlarm_Info.On_Off[0],OnOffAlarm_Info.On_Off[1],OnOffAlarm_Info.On_Off[2], OnOffAlarm_Info.On_Off[3],OnOffAlarm_Info.On_Off[4],OnOffAlarm_Info.On_Off[5],OnOffAlarm_Info.On_Off[6],OnOffAlarm_Info.On_Off[7],OnOffAlarm_Info.On_Off[8], OnOffAlarm_Info.On_Off[9],AnalogInput03_Info.RoomTemperature,AnalogInput03_Info.TemperatureSetpoint);\r\nCoolMode=%02X FilterBlock=%02X PowerError=%02X Alarm=%02X LowTemperature=%02XHighTemperatur=%02X Overheat=%02X\r\nHumidity=%.1f Temperature=%.1f HumiditySet=%.1fstAirCondition.CoolingMode,stAirCondition.FilterBlocking,stAirCondition.PowerError,stAir Condition.GeneralAlarm,stAirCondition.LowRoomTemperature,stAirCondition.HighRoomTemperature,stAirCondition.UnitOverheat,stAirCondition.RoomH umidity,stAirCondition.RoomTemperature,stAirCondition.HumiditySetpoint,。