modbus协议添加软件版本寄存器,添加PAD模式超时退出功能,优化定时事件触发处理逻辑 zsxfly20240907
This commit is contained in:
parent
572d57647d
commit
8f78a1e13b
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue