private void RecvDataDecode(Byte inData) { // 逐个字节进行解析 switch (recvStatus) { case RECV_STATUS.STATE_IDLE: if (inData == 0xAA) { recvStatus = RECV_STATUS.STATE_GOT_HEAD1; // 获得了 HEAD1 commState = COMM_STATE.RECVING; // 状态转变为正在接收 } break; case RECV_STATUS.STATE_GOT_HEAD1: if (inData == 0x55) { recvStatus = RECV_STATUS.STATE_GOT_HEAD2; // 获得了 HEAD2 RecvDataIndex = 0; } else { recvStatus = RECV_STATUS.STATE_IDLE; // 错误,返回初始状态 } break; case RECV_STATUS.STATE_GOT_HEAD2: recvBuff[RecvDataIndex + 2] = inData; RecvDataIndex++; if (RecvDataIndex >= PayloadDataNum) { recvStatus = RECV_STATUS.STATE_GOT_DATA; // 获得了 数据 RecvDataIndex = 0; } break; case RECV_STATUS.STATE_GOT_DATA: if (inData == 0xA5) { recvStatus = RECV_STATUS.STATE_GOT_END1; // 获得了 END1 } else { recvStatus = RECV_STATUS.STATE_IDLE; // 错误,返回初始状态 } break; case RECV_STATUS.STATE_GOT_END1: if (inData == 0x5A) { recvStatus = RECV_STATUS.STATE_IDLE; // 重新恢复到IDLE状态 // 成功获得了所有数据 //recvBuff[0] commState = COMM_STATE.IDLE; // 成功收到数据,切换为通信空闲状态 // GenericOp.xPos = 5 * BitConverter.ToInt16(recvBuff, 4); // 转化为 mm 单位 GenericOp.zPos = 5 * BitConverter.ToInt16(recvBuff, 6); // 转化为 mm 单位 GenericOp.xPos_servo = -5 * BitConverter.ToInt16(recvBuff, 8); // 转化为 mm 单位 GenericOp.zPos_servo = -5 * BitConverter.ToInt16(recvBuff, 10); // 转化为 mm 单位 gtryState = BitConverter.ToUInt32(recvBuff, 12); // 龙门机构状态 GenericOp.weight = (int)BitConverter.ToInt16(recvBuff, 16); // 载重量 // 龙门机构的急停状态的获取 if (SerialWireless.GetGtryState(SerialWireless.GTRY_STATE_ESTOP_STATE)) { gtry_estop_state_cntr++; if (gtry_estop_state_cntr % 20 == 0) // 每20包数据,检查一下PLC的急停状态 { GenericOp.EStop_Soft = true; // 根据 龙门急停状态 给 软急停标识 赋值,只赋值10次就不重复赋值。为了避免反复被刷新。 } } else { //gtry_estop_state_cntr = 0; } // 龙门原点回归请求 if (SerialWireless.GetGtryState(SerialWireless.GTRY_STATE_REQUEST_ZRN)) { gtry_request_zrn_cntr++; if (gtry_request_zrn_cntr > 5) { gtry_request_zrn_cntr = 5; GenericOp.RequestZRN = true; // 请求原点回归标识 置位 } } else { gtry_request_zrn_cntr = 0; GenericOp.RequestZRN = false; } } else { recvStatus = RECV_STATUS.STATE_IDLE; // 错误,返回初始状态 } break; } }
private const int PayloadDataNum = RecvDataNum - 4; // 除去 AA 55 A5 5A头4字节后的有效数据长度。 private void RecvDataDecode(Byte inData) { // 逐个字节进行解析 switch (recvStatus) { case RECV_STATUS.STATE_IDLE: if (inData == 0xAA) { recvStatus = RECV_STATUS.STATE_GOT_HEAD1; // 获得了 HEAD1 commState = COMM_STATE.RECVING; // 状态转变为正在接收 } break; case RECV_STATUS.STATE_GOT_HEAD1: if (inData == 0x55) { recvStatus = RECV_STATUS.STATE_GOT_HEAD2; // 获得了 HEAD2 RecvDataIndex = 0; } else { recvStatus = RECV_STATUS.STATE_IDLE; // 错误,返回初始状态 } break; case RECV_STATUS.STATE_GOT_HEAD2: recvBuff[RecvDataIndex + 2] = inData; RecvDataIndex++; if (RecvDataIndex >= PayloadDataNum) { recvStatus = RECV_STATUS.STATE_GOT_DATA; // 获得了 数据 RecvDataIndex = 0; } break; case RECV_STATUS.STATE_GOT_DATA: if (inData == 0xA5) { recvStatus = RECV_STATUS.STATE_GOT_END1; // 获得了 END1 } else { recvStatus = RECV_STATUS.STATE_IDLE; // 错误,返回初始状态 } break; case RECV_STATUS.STATE_GOT_END1: if (inData == 0x5A) { recvStatus = RECV_STATUS.STATE_IDLE; // 重新恢复到IDLE状态 // 成功获得了所有数据 //recvBuff[0] commState = COMM_STATE.RECV; // 成功收到数据,切换为通信接受状态 //获取水槽温度 GenericOp.temperature1 = BitConverter.ToInt16(recvBuff, 2) / 10; // 1号水槽温度 GenericOp.temperature2 = BitConverter.ToInt16(recvBuff, 4) / 10; // 2号水槽温度 GenericOp.temperature3 = BitConverter.ToInt16(recvBuff, 6) / 10; // 3号水槽温度 GenericOp.temperature41 = BitConverter.ToInt16(recvBuff, 8) / 10; //4号炉子上温区温度 GenericOp.temperature42 = BitConverter.ToInt16(recvBuff, 10) / 10; //4号炉子下温区温度 GenericOp.temperature51 = BitConverter.ToInt16(recvBuff, 12) / 10; //5号炉子上温区温度 GenericOp.temperature52 = BitConverter.ToInt16(recvBuff, 14) / 10; //5号炉子下温区温度 GenericOp.temperature61 = BitConverter.ToInt16(recvBuff, 16) / 10; //6号炉子上温区温度 GenericOp.temperature62 = BitConverter.ToInt16(recvBuff, 18) / 10; //6号炉子下温区温度 GenericOp.temperature71 = BitConverter.ToInt16(recvBuff, 20) / 10; //7号炉子上温区温度 GenericOp.temperature72 = BitConverter.ToInt16(recvBuff, 22) / 10; //7号炉子上温区温度 GenericOp.temperature111 = BitConverter.ToInt16(recvBuff, 24) / 10; //11号炉子上温区温度 GenericOp.temperature112 = BitConverter.ToInt16(recvBuff, 26) / 10; //11号炉子下温区温度 GenericOp.temperature121 = BitConverter.ToInt16(recvBuff, 28) / 10; //12号炉子上温区温度 GenericOp.temperature122 = BitConverter.ToInt16(recvBuff, 30) / 10; //12号炉子下温区温度 GenericOp.temperature131 = BitConverter.ToInt16(recvBuff, 32) / 10; //13号炉子温度 } else { recvStatus = RECV_STATUS.STATE_IDLE; // 错误,返回初始状态 } break; } }
private void RecvDataDecode(Byte inData) { // 逐个字节进行解析 switch (recvStatus) { case RECV_STATUS.STATE_IDLE: if (inData == 0xAA) { recvStatus = RECV_STATUS.STATE_GOT_HEAD1; // 获得了 HEAD1 commState = COMM_STATE.RECVING; // 状态转变为正在接收 } break; case RECV_STATUS.STATE_GOT_HEAD1: if (inData == 0x55) { recvStatus = RECV_STATUS.STATE_GOT_HEAD2; // 获得了 HEAD2 RecvDataIndex = 0; } else { recvStatus = RECV_STATUS.STATE_IDLE; // 错误,返回初始状态 } break; case RECV_STATUS.STATE_GOT_HEAD2: recvBuff[RecvDataIndex + 2] = inData; RecvDataIndex++; if (RecvDataIndex >= PayloadDataNum) { recvStatus = RECV_STATUS.STATE_GOT_DATA; // 获得了 数据 RecvDataIndex = 0; } break; case RECV_STATUS.STATE_GOT_DATA: if (inData == 0xA5) { recvStatus = RECV_STATUS.STATE_GOT_END1; // 获得了 END1 } else { recvStatus = RECV_STATUS.STATE_IDLE; // 错误,返回初始状态 } break; case RECV_STATUS.STATE_GOT_END1: if (inData == 0x5A) { recvStatus = RECV_STATUS.STATE_IDLE; // 重新恢复到IDLE状态 // 成功获得了所有数据 //recvBuff[0] commState = COMM_STATE.IDLE; // 成功收到数据,切换为通信空闲状态 // // X00 - X15 stoveLidState[0] = (STOVE_LID_STATE)(recvBuff[2] & 0x3); // 1#炉盖 X0 - X01 stoveLidState[1] = (STOVE_LID_STATE)((recvBuff[2] >> 2) & 0x3); // 2#炉盖 stoveLidState[2] = (STOVE_LID_STATE)((recvBuff[2] >> 4) & 0x3); // 3#炉盖 stoveLidState[3] = (STOVE_LID_STATE)((recvBuff[2] >> 6) & 0x3); // 4#炉盖 stoveLidState[4] = (STOVE_LID_STATE)(recvBuff[3] & 0x3); // 5#炉盖 stoveLidState[5] = (STOVE_LID_STATE)((recvBuff[3] >> 2) & 0x3); // 6#炉盖 stoveLidState[6] = (STOVE_LID_STATE)((recvBuff[3] >> 4) & 0x3); // 7#炉盖 stoveLidState[7] = (STOVE_LID_STATE)(recvBuff[4] & 0x3); //后门 stoveLidState[8] = (STOVE_LID_STATE)((recvBuff[4] >> 2) & 0x3); //前门 // X30 自动 X31手动 //if ((recvBuff[5] & 0x01) == 0) //{ //automode_change_cntr_manual = 0; /* * automode_change_cntr_auto++; * if (automode_change_cntr_auto < 10) * { * GenericOp.AutoMode = true;// 自动模式 * } * else * { * automode_change_cntr_auto = 10; * }*/ // } // else // { //automode_change_cntr_auto = 0; // automode_change_cntr_manual++; // if (automode_change_cntr_manual < 10) // { // GenericOp.AutoMode = false;// 手动模式 // } // else // { // automode_change_cntr_manual = 10; // } // } // 手动控制柜用于控制龙门的前进、后退、上下、抓放,对应PLC的X41 - X46 GenericOp.manual_gtry_action = GenericOp.GTRY_ACTION_TYPE.NONE; // 初始为不做任何动作 //if ((recvBuff[6] & 0x02) !=0) GenericOp.manual_gtry_action = GenericOp.GTRY_ACTION_TYPE.FORWARD; // X41 //else if ((recvBuff[6] & 0x04) !=0) GenericOp.manual_gtry_action = GenericOp.GTRY_ACTION_TYPE.BAKWARD; // X42 //else if ((recvBuff[6] & 0x08) != 0) GenericOp.manual_gtry_action = GenericOp.GTRY_ACTION_TYPE.UP; // X43 //else if ((recvBuff[6] & 0x10) != 0) GenericOp.manual_gtry_action = GenericOp.GTRY_ACTION_TYPE.DOWN;// X44 //else if ((recvBuff[6] & 0x20) != 0) GenericOp.manual_gtry_action = GenericOp.GTRY_ACTION_TYPE.CLAMP;// X45 //else if ((recvBuff[6] & 0x40) != 0) GenericOp.manual_gtry_action = GenericOp.GTRY_ACTION_TYPE.CLAMP_RELAX;// X46 //GenericOp.EStop_Manual = ((recvBuff[6] >> 7) == 0);// X47 急停信号 } else { recvStatus = RECV_STATUS.STATE_IDLE; // 错误,返回初始状态 } break; } }