使用stm32f429 ucosiii,需要一个错误报警机制,我在程序运行中可能会发生错误,或者警告,需要将错误或者警告通过modbus tcp将错误码传递给上位机,如果是错误,我会停止程序运行,我会等待上位机发送清除错误码数值写到某个寄存器地址,我收到这个数据后会运行此错误码的应对程序,如果是警告,则只通过modbus tcp向上位机发送警告码,完成这个程序的设计。
/* error_handler.h */
#ifndef ERROR_HANDLER_H
#define ERROR_HANDLER_H
#include "includes.h"
// 错误码和警告码定义
typedef enum {
ERR_NONE = 0,
ERR_SENSOR_TIMEOUT = 0x1001,
ERR_MOTOR_FAULT = 0x1002,
ERR_COMMUNICATION = 0x1003,
// 添加更多错误码...
} ErrorCode_t;
typedef enum {
WARN_NONE = 0,
WARN_BATTERY_LOW = 0x2001,
WARN_TEMP_HIGH = 0x2002,
WARN_SENSOR_UNSTABLE = 0x2003,
// 添加更多警告码...
} WarningCode_t;
// 错误处理状态
typedef struct {
ErrorCode_t currentError;
WarningCode_t currentWarning;
uint8_t isSystemStopped;
OS_SEM errorHandlingSem;
} ErrorHandler_t;
// 函数声明
void ErrorHandler_Init(void);
void ErrorHandler_SetError(ErrorCode_t errorCode);
void ErrorHandler_SetWarning(WarningCode_t warningCode);
void ErrorHandler_ClearError(void);
void ErrorHandler_Task(void *p_arg);
#endif
/* error_handler.c */
#include "error_handler.h"
static ErrorHandler_t errorHandler;
#define MODBUS_ERROR_REG_ADDR 1000 // Modbus错误寄存器地址
#define MODBUS_WARNING_REG_ADDR 1001 // Modbus警告寄存器地址
#define MODBUS_CLEAR_REG_ADDR 1002 // Modbus清除错误寄存器地址
void ErrorHandler_Init(void)
{
OS_ERR err;
errorHandler.currentError = ERR_NONE;
errorHandler.currentWarning = WARN_NONE;
errorHandler.isSystemStopped = 0;
// 初始化错误处理信号量
OSSemCreate(&errorHandler.errorHandlingSem,
"Error Handling Sem",
0,
&err);
}
void ErrorHandler_SetError(ErrorCode_t errorCode)
{
OS_ERR err;
if(errorCode != ERR_NONE) {
errorHandler.currentError = errorCode;
errorHandler.isSystemStopped = 1;
// 通过Modbus TCP发送错误码
ModbusTCP_WriteRegister(MODBUS_ERROR_REG_ADDR, errorCode);
// 停止系统运行
// TODO: 实现具体的系统停止逻辑
// 发送信号等待错误处理
OSSemPost(&errorHandler.errorHandlingSem, OS_OPT_POST_1, &err);
}
}
void ErrorHandler_SetWarning(WarningCode_t warningCode)
{
if(warningCode != WARN_NONE) {
errorHandler.currentWarning = warningCode;
// 通过Modbus TCP发送警告码
ModbusTCP_WriteRegister(MODBUS_WARNING_REG_ADDR, warningCode);
}
}
void ErrorHandler_ClearError(void)
{
errorHandler.currentError = ERR_NONE;
errorHandler.isSystemStopped = 0;
ModbusTCP_WriteRegister(MODBUS_ERROR_REG_ADDR, ERR_NONE);
}
// 错误处理任务
void ErrorHandler_Task(void *p_arg)
{
OS_ERR err;
uint16_t clearCommand;
while(DEF_TRUE) {
// 等待错误发生
OSSemPend(&errorHandler.errorHandlingSem,
0, // 无限等待
OS_OPT_PEND_BLOCKING,
NULL,
&err);
if(err == OS_ERR_NONE) {
while(errorHandler.isSystemStopped) {
// 检查Modbus清除寄存器
clearCommand = ModbusTCP_ReadRegister(MODBUS_CLEAR_REG_ADDR);
if(clearCommand == errorHandler.currentError) {
// 执行错误恢复程序
switch(errorHandler.currentError) {
case ERR_SENSOR_TIMEOUT:
// 处理传感器超时错误
Handle_SensorTimeout();
break;
case ERR_MOTOR_FAULT:
// 处理电机故障
Handle_MotorFault();
break;
case ERR_COMMUNICATION:
// 处理通信错误
Handle_CommunicationError();
break;
default:
break;
}
// 清除错误状态
ErrorHandler_ClearError();
}
// 等待一段时间再次检查
OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, &err);
}
}
}
}
使用stm32f429 ucosiii,需要一个错误报警机制,我在程序运行中可能会发生错误,或者警告,需要将错误或者警告通过modbus tcp将错误码传递给上位机,如果是错误,我会停止程序运行,我会等待上位机发送清除错误码数值写到某个寄存器地址,我收到这个数据后会运行此错误码的应对程序,如果是警告,则只通过modbus tcp向上位机发送警告码,各有5个modbus寄存器存储错误码和警报码,使用链表管理错误码和警报码,用函数dev_post_err(dev_err_code err_num) 向链表添加错误码,dev_post_warn(dev_warn_code err_num)添加警报码,再设计获取当前错误码、获取警报码个数的函数,还需要按索引获取链表中错误码、警告码的函数以便以向寄存器中更新错误码,还需要清除链表中某个错误码的函数