#include "app_task_485.h" #include "../msp/uart0.h" #include "../msp/uart2.h" #include "../app/app_common.h" //#define MODBUS_SLAVER_DW20_REG_START 0x02 //#define MODBUS_SLAVER_DW20_REG_NUM 0x02 #define MODBUS_SLAVER_RETRY_MAX_TIME 2 TS_485 ts_485; void L3_task_485_init(void) { L1_task_init(&ts_485.task); L3_task_s_go(ts_485,D_task_init); ts_485.slaverIndex = 0; ts_485.pkglen = 0; ts_485.retryTimes = 0; ts_485.ackFlag = 0; } #define D_task_485_constructor_modbus_pkg 0x51 #define D_task_485_send_modbus_pkg 0x52 #define D_task_485_wait_modbus_ack 0x53 #define D_task_485_switch_next_slaver 0x54 void L3_task_485_handle(TS_485 *s) { TTSS_Task_init(); L2_task_go(D_task_485_constructor_modbus_pkg); TTSS_Task_step(D_task_485_constructor_modbus_pkg) if(G.md_slaver_info[s->slaverIndex].mask > 0) { s->pkglen = L3_pack_modbus(&s->loopPkg,G.md_slaver_info + s->slaverIndex); s->ackFlag = 0; s->retryTimes = 0; L2_task_go(D_task_485_send_modbus_pkg); } else { L2_task_go(D_task_485_switch_next_slaver); } TTSS_Task_step(D_task_485_send_modbus_pkg) L0_uart2_sendArray((U8*)&s->loopPkg,s->pkglen); s->sendStamp = s_nos_tick.t_5ms; L2_task_go(D_task_485_wait_modbus_ack); TTSS_Task_step(D_task_485_wait_modbus_ack) if(s_uart2_rec.ok)//接收到ack { s_uart2_rec.ok = 0; s->pAckPkg = (TS_PH4_modbus*)(s_uart2_rec.buf); if((s->pAckPkg->salver != G.md_slaver_info[s->slaverIndex].slaver) || (s->pAckPkg->oper != G.md_slaver_info[s->slaverIndex].oper)) { return; } if(G.md_slaver_info[s->slaverIndex].mask == 1) { G.md_slaver_info[s->slaverIndex].mask = 0; } switch(s->slaverIndex) { case 0: G.total_weight = (S32)(s->pAckPkg->buf[1]) << 24 | (S32)(s->pAckPkg->buf[2]) << 16 | (S32)(s->pAckPkg->buf[3]) << 8 | (S32)(s->pAckPkg->buf[4]); G.ch_weight[0] = (S32)(s->pAckPkg->buf[5]) << 24 | (S32)(s->pAckPkg->buf[6]) << 16 | (S32)(s->pAckPkg->buf[7]) << 8 | (S32)(s->pAckPkg->buf[8]); G.ch_weight[1] = (S32)(s->pAckPkg->buf[9]) << 24 | (S32)(s->pAckPkg->buf[10]) << 16 | (S32)(s->pAckPkg->buf[11]) << 8 | (S32)(s->pAckPkg->buf[12]); G.ch_weight[2] = (S32)(s->pAckPkg->buf[13]) << 24 | (S32)(s->pAckPkg->buf[14]) << 16 | (S32)(s->pAckPkg->buf[15]) << 8 | (S32)(s->pAckPkg->buf[16]); G.ch_weight[3] = (S32)(s->pAckPkg->buf[17]) << 24 | (S32)(s->pAckPkg->buf[18]) << 16 | (S32)(s->pAckPkg->buf[19]) << 8 | (S32)(s->pAckPkg->buf[20]); G.jing_weight = (G.total_weight <= G.pi_weight) ? (0) :(G.total_weight - G.pi_weight) ; break; case 1: G.asga.xaxis = (U16)(s->pAckPkg->buf[1]) << 8 | (U16)(s->pAckPkg->buf[2]); G.asga.yaxis = (U16)(s->pAckPkg->buf[3]) << 8 | (U16)(s->pAckPkg->buf[4]); G.asga.zaxis = (U16)(s->pAckPkg->buf[5]) << 8 | (U16)(s->pAckPkg->buf[6]); break; case 4: if(s->pAckPkg->buf[2] != G._keyled) //按键发生改变 { G._keyled = s->pAckPkg->buf[2]; L0_uart0_uchex(G._keyled); if(G._keyled == 0) { //TODO } else if(G._keyled == 0x1e) { L0_uart0_uc('#'); G.pi_weight = G.total_weight; } else { //G.rfid = G._keyled; U32 rfid = key_rfid_map_out(G._keyled); G.rfid[0] = D_CAR_HOSPITAL_NO >> 8 & 0xFF; G.rfid[1] = D_CAR_HOSPITAL_NO >> 0 & 0xFF;; G.rfid[2] = rfid >> 24 & 0xFF; G.rfid[3] = rfid >> 16 & 0xFF; G.rfid[4] = rfid >> 8 & 0xFF; G.rfid[5] = rfid >> 0 & 0xFF; } } break; case 5: G.asga_02.xaxis = (U16)(s->pAckPkg->buf[1]) << 8 | (U16)(s->pAckPkg->buf[2]); G.asga_02.yaxis = (U16)(s->pAckPkg->buf[3]) << 8 | (U16)(s->pAckPkg->buf[4]); G.asga_02.zaxis = (U16)(s->pAckPkg->buf[5]) << 8 | (U16)(s->pAckPkg->buf[6]); break; } //TODO 这里可以根据modbus协议让代码通用 L2_task_go(D_task_485_switch_next_slaver); } else if(s_nos_tick.t_5ms - s->sendStamp >= 8) //超时 { if(++s->retryTimes >= MODBUS_SLAVER_RETRY_MAX_TIME) { L2_task_go(D_task_485_switch_next_slaver); } else { L2_task_go(D_task_485_send_modbus_pkg); } } else//未收到未超时 { //继续等待 } TTSS_Task_step(D_task_485_switch_next_slaver) if(++ s->slaverIndex >= MD_SLAVER_INFO_MAX) { s->slaverIndex = 0; } L2_task_go(D_task_485_constructor_modbus_pkg); TTSS_Task_end(); }