modbus协议添加软件版本寄存器,添加PAD模式超时退出功能,优化定时事件触发处理逻辑 zsxfly20240907

This commit is contained in:
zsx 2024-09-07 12:25:32 +08:00
parent 572d57647d
commit 8f78a1e13b
5 changed files with 213 additions and 5258 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -17,6 +17,11 @@ void Event_Handle(uint16_t Event_List ,bool isOn,void *Parameter){
case Buzzer_Event: case Buzzer_Event:
Set_Status(IO_TTL_TX,isOn); Set_Status(IO_TTL_TX,isOn);
break; break;
case Pmode_Timeout_Event:
if(!isOn){
sys_sta.Pmode =0;
}
break;
case GRB_WS2812_Event: case GRB_WS2812_Event:
GRB_WS2812_Write_color(WS2812_GRBs.len, isOn ? WS2812_GRBs.GRBs : 0x0); GRB_WS2812_Write_color(WS2812_GRBs.len, isOn ? WS2812_GRBs.GRBs : 0x0);
break; break;
@ -30,7 +35,9 @@ static tmr_tk_t Time_Event_Handle(tmr_id_t id) {
for (uint16_t i = 0; i < Time_Event_MAX; i++) { for (uint16_t i = 0; i < Time_Event_MAX; i++) {
Time_Events_t *Events = &Time_Events[i]; Time_Events_t *Events = &Time_Events[i];
if (Events->delay == 1) { if(1 < Events->delay){
Events->delay--;
}else if (1 == Events->delay--) {
switch (Events->mode) { switch (Events->mode) {
case Time_MODE_OFF: case Time_MODE_OFF:
// 关闭 // 关闭
@ -50,11 +57,11 @@ static tmr_tk_t Time_Event_Handle(tmr_id_t id) {
if (Events->blinkCount > 0) { if (Events->blinkCount > 0) {
if (Events->isOn) { if (Events->isOn) {
Events->isOn = false; Events->isOn = false;
Events->delay =1 + Events->Ms_off;
if(0xffff != Events->blinkCount) {Events->blinkCount--;} if(0xffff != Events->blinkCount) {Events->blinkCount--;}
Events->delay =1 + Events->Ms_off / Time_delay_interval;
} else { } else {
Events->isOn = true; Events->isOn = true;
Events->delay =1 + Events->Ms_on / Time_delay_interval; Events->delay =1 + Events->Ms_on;
} }
} else { } else {
Events->mode = Time_MODE_OFF; Events->mode = Time_MODE_OFF;
@ -63,9 +70,7 @@ static tmr_tk_t Time_Event_Handle(tmr_id_t id) {
} }
Event_Handle(i, Events->isOn,Events->Parameter); Event_Handle(i, Events->isOn,Events->Parameter);
} }
if(Events->delay >= 1){
Events->delay--;
}
} }
return (Time_delay_interval / 10); return (Time_delay_interval / 10);
} }
@ -73,7 +78,7 @@ static tmr_tk_t Time_Event_Handle(tmr_id_t id) {
void Time_Event_Init(void) { void Time_Event_Init(void) {
for (uint16_t i = 0; i < Time_Event_MAX; i++) { for (uint16_t i = 0; i < Time_Event_MAX; i++) {
Time_Events[i].mode = Time_MODE_OFF; Time_Events[i].mode = Time_MODE_OFF;
Time_Events[i].delay = 1; Time_Events[i].delay = 0;
Time_Events[i].Ms_on = 0; Time_Events[i].Ms_on = 0;
Time_Events[i].Ms_off = 0; Time_Events[i].Ms_off = 0;
Time_Events[i].blinkCount = 0; Time_Events[i].blinkCount = 0;
@ -83,13 +88,6 @@ void Time_Event_Init(void) {
Time_Event_tmr_id = sftmr_start(10, Time_Event_Handle); Time_Event_tmr_id = sftmr_start(10, Time_Event_Handle);
} }
void Time_Event_DelayOff(uint16_t ledIndex ,uint16_t Ms_delayoff,void *Parameter) {
Time_Events[ledIndex].mode = Time_MODE_ON;
Time_Events[ledIndex].delay = 1;
Time_Events[ledIndex].Ms_delayoff =1 + Ms_delayoff;
Time_Events[ledIndex].Parameter=Parameter;
}
void Time_Event_On(uint16_t ledIndex,void *Parameter) { void Time_Event_On(uint16_t ledIndex,void *Parameter) {
Time_Events[ledIndex].mode = Time_MODE_ON; Time_Events[ledIndex].mode = Time_MODE_ON;
Time_Events[ledIndex].delay = 1; Time_Events[ledIndex].delay = 1;
@ -102,10 +100,23 @@ void Time_Event_Off(uint16_t ledIndex,void *Parameter) {
Time_Events[ledIndex].Parameter=Parameter; Time_Events[ledIndex].Parameter=Parameter;
} }
void Time_Event_DelayOff(uint16_t ledIndex ,uint16_t Ms_delayoff,void *Parameter) {
Time_Events[ledIndex].mode = Time_MODE_ON;
Time_Events[ledIndex].delay = 1;
Time_Events[ledIndex].Ms_delayoff =Ms_delayoff / Time_delay_interval;
Time_Events[ledIndex].Parameter=Parameter;
}
void Time_Event_Cancel_DelayOff(uint16_t ledIndex) {
Time_Events[ledIndex].delay = 0;
Time_Events[ledIndex].Ms_delayoff =0;
Time_Events[ledIndex].Parameter =NULL;
}
void Time_Event_Blink(uint16_t ledIndex, uint16_t Ms_on, uint16_t Ms_off, uint16_t blinkCount,void *Parameter) { void Time_Event_Blink(uint16_t ledIndex, uint16_t Ms_on, uint16_t Ms_off, uint16_t blinkCount,void *Parameter) {
Time_Events[ledIndex].mode = Time_MODE_BLINK; Time_Events[ledIndex].mode = Time_MODE_BLINK;
Time_Events[ledIndex].Ms_on = Ms_on; Time_Events[ledIndex].Ms_on = Ms_on / Time_delay_interval;
Time_Events[ledIndex].Ms_off = Ms_off; Time_Events[ledIndex].Ms_off = Ms_off / Time_delay_interval;
Time_Events[ledIndex].blinkCount = blinkCount; Time_Events[ledIndex].blinkCount = blinkCount;
Time_Events[ledIndex].delay =1 + Ms_on / Time_delay_interval; Time_Events[ledIndex].delay =1 + Ms_on / Time_delay_interval;
Time_Events[ledIndex].Parameter=Parameter; Time_Events[ledIndex].Parameter=Parameter;

View File

@ -22,6 +22,7 @@ typedef struct {
typedef enum { typedef enum {
Buzzer_Event, Buzzer_Event,
Pmode_Timeout_Event,
GRB_WS2812_Event, GRB_WS2812_Event,
Time_Event_MAX Time_Event_MAX
} Time_Event_List; } Time_Event_List;
@ -32,6 +33,8 @@ void Time_Event_Init(void);
void Time_Event_DelayOff(uint16_t ledIndex ,uint16_t Ms_delayoff, void *Parameter); void Time_Event_DelayOff(uint16_t ledIndex ,uint16_t Ms_delayoff, void *Parameter);
void Time_Event_Cancel_DelayOff(uint16_t ledIndex);
void Time_Event_On(uint16_t ledIndex, void *Parameter); void Time_Event_On(uint16_t ledIndex, void *Parameter);
void Time_Event_Off(uint16_t ledIndex, void *Parameter); void Time_Event_Off(uint16_t ledIndex, void *Parameter);

View File

@ -113,8 +113,22 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR & 0xff; MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR & 0xff;
break; break;
} }
case 0x0002: // 设备的软件版本号
if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_conf.VERSION >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.VERSION & 0xff;
MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){
break;
}
}else if(CMDCode == 0x06){
sys_conf.VERSION =reg_val_num;
MODBUS_Sent_BUF[len_count++] =sys_conf.VERSION >> 8;
MODBUS_Sent_BUF[len_count++] =sys_conf.VERSION & 0xff;
break;
}
{ // 0x0101-0x0002 { // 0x0101-0x0002
case 0x0101: // // 读写系统配置 case 0x0101: // // 写系统配置
if(CMDCode == 0x03){ // # 读 - 保持寄存器 if(CMDCode == 0x03){ // # 读 - 保持寄存器
break; break;
@ -224,21 +238,27 @@ void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_
{ // 0x0109-0x010D { // 0x0109-0x010D
case 0x0201: //PAD模式寄存器 case 0x0201: //PAD模式寄存器
if(CMDCode == 0x03){ if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode >> 8; MODBUS_Sent_BUF[len_count++] =0;
MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode & 0xff; MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode & 0xff;
MODBUS_Sent_BUF[2] +=2; MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){ if(0 == --reg_val_num){
break; break;
} }
}else if(CMDCode == 0x06){ }else if(CMDCode == 0x06){
uint8_t Pmode_Timeout =((reg_val_num >> 8) & 0xff);
if(0 == Pmode_Timeout){
Time_Event_Cancel_DelayOff(Pmode_Timeout_Event);
}else{
Time_Event_DelayOff(Pmode_Timeout_Event ,1000 * Pmode_Timeout ,NULL);
}
sys_sta.Pmode =reg_val_num & 0x03; sys_sta.Pmode =reg_val_num & 0x03;
MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode >> 8; MODBUS_Sent_BUF[len_count++] =reg_val_num >> 8;
MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode & 0xff; MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode & 0xff;
break; break;
} }
case 0x0202: //系统模式寄存器(只读) case 0x0202: //系统模式寄存器(只读)
if(CMDCode == 0x03){ if(CMDCode == 0x03){
MODBUS_Sent_BUF[len_count++] =sys_sta.Smode >> 8; MODBUS_Sent_BUF[len_count++] =0;
MODBUS_Sent_BUF[len_count++] =sys_sta.Smode & 0xff; MODBUS_Sent_BUF[len_count++] =sys_sta.Smode & 0xff;
MODBUS_Sent_BUF[2] +=2; MODBUS_Sent_BUF[2] +=2;
if(0 == --reg_val_num){ if(0 == --reg_val_num){
@ -388,7 +408,7 @@ bool app_modbus_CheckData(uint8_t *dat , uint8_t len){//检查数据
len = 8; len = 8;
} }
if(dat[0] ==MODBUS_ADDR){//验证从机地址 if(dat[0] ==MODBUS_ADDR || dat[0] == 0xff){//验证从机地址
CRC16 =crc16_modbus(dat ,len-2);//计算CRC CRC16 =crc16_modbus(dat ,len-2);//计算CRC
DEBUG("CRC16:0x%X\n",CRC16); DEBUG("CRC16:0x%X\n",CRC16);
#if !ModbusCRC16_EN #if !ModbusCRC16_EN