You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.8 KiB
143 lines
3.8 KiB
#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.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();
|
|
}
|
|
|
|
|
|
|