#include "proto_SECS2.h" #include "string.h" #include "stdio.h" #include "bsp_DS1302.h" #include "proto_PM100.h" #include "bsp_Flash.h" #include "os_timer.h" #include "bsp_W5500.h" #define PROTO_SECS2_MESSAGE_DATA_NUM (50) /*解析的最多的数据类型*/ #define PROTO_SECS2_MESSAGE_DATA_BUFFER_NUM (255) /*解析的数据类型的最多字节数量*/ u8 proto_SECS2_Tx_Buffer[2048]; /*数据接收解析*/ static proto_SECS2_MessageData_t proto_SECS2_Rx_MessageData[PROTO_SECS2_MESSAGE_DATA_NUM]; static u8 proto_SECS2_Rx_MessageDataBuffer[PROTO_SECS2_MESSAGE_DATA_BUFFER_NUM]; // 发送正常状态项 static void send_normal_alarm_item(proto_SECS2_MessageData_t *MessageData, u8 *Tx, u16 *TxLen); // 发送单个报警项 static void send_alarm_item(proto_SECS2_MessageData_t *MessageData, u8 *Tx, u16 *TxLen, u8 index, u8 is_alarm, const char *start_str, const char *duration_str); /*发送的数据*/ static proto_SECS2_MessageData_t proto_SECS2_Tx_MessageData[PROTO_SECS2_MESSAGE_DATA_NUM]; static u8 proto_SECS2_Rx_MessageDataAnalysis_List(u8 *pData,u16 Len); static u16 proto_HSMS_AddData(u8 *pTxData,proto_SECS2_MessageData_t *pData); static void proto_SECS2_Rx_Task(proto_HSMS_Header_Data_t *pHeader_Data,u8 *pData,u16 Len); static void proto_SECS2_Tx_Alarm_Task(void); static void proto_SECS2_Tx_Dev_State_Task(void); proto_SECS2_t SECS2 = { .Rx_DataAnalysis = proto_SECS2_Rx_Task, .Tx_Alarm_Task = proto_SECS2_Tx_Alarm_Task, .Tx_Dev_State_Task = proto_SECS2_Tx_Dev_State_Task, }; proto_SECS2_t *pSECS2 = &SECS2; static void proto_SECS2_Send(proto_HSMS_Header_Data_t *pHeader_Data,u8 *pData,u16 Len) { HSMS.Tx_RsqData(pHeader_Data,pData,Len,NULL); } /*时间秒数转换*/ // 判断闰年 static u8 is_leap_year(u16 year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // 将年月日时分秒转换为从2000-01-01 00:00:00开始的秒数 static u32 datetime_to_seconds(u16 year, u8 month, u8 day, u8 hour, u8 minute, u8 second) { const u8 month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; u32 days = 0; u16 y; for (y = 2000; y < year; y++) { days += 365; if (is_leap_year(y)) days++; } for (u8 m = 1; m < month; m++) { days += month_days[m-1]; if (m == 2 && is_leap_year(year)) days++; } days += (day - 1); return days * 86400UL + hour * 3600UL + minute * 60UL + second; } // 获取当前时间的秒数 static u32 get_current_seconds(void) { u16 year = 2000 + DS1302.Time.Year; return datetime_to_seconds(year, DS1302.Time.Month, DS1302.Time.Day, DS1302.Time.Hour, DS1302.Time.Minute, DS1302.Time.Second); } // 格式化当前时间为 YYYYMMDDHHMMSS 字符串 static void format_current_time_str(char *buf, u16 len) { snprintf(buf, len, "20%02d%02d%02d%02d%02d%02d", DS1302.Time.Year, DS1302.Time.Month, DS1302.Time.Day, DS1302.Time.Hour, DS1302.Time.Minute, DS1302.Time.Second); } /** * @brief 发送 S1F3 响应(单个数据、多个数据、全部数据) * @param pHeader_Data HSMS 消息头 * @param pIndexArray 请求的索引数组(uint32) * @param IndexCount 索引数量 */ void proto_SECS2_Tx_S1F3(proto_HSMS_Header_Data_t *pHeader_Data, u32 *pIndexArray, u8 IndexCount) { u8 *Tx = proto_SECS2_Tx_Buffer; u16 TxLen = 0; u8 i; u8 list_count; u8 has_all_data_request = 0; u64 Temp; pHeader_Data->Header_Byte3++; /* 响应消息的 Function 加 1 */ pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0; Temp = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code; /* 检查是否有全部数据请求(0xFFFFFFFF) */ for (i = 0; i < IndexCount; i++) { if (pIndexArray[i] == 0xFFFFFFFF) { has_all_data_request = 1; break; } } if (has_all_data_request) { /* ========== 全部数据响应 ========== */ u8 Get_Data_NUM = 0; proto_SECS2_MessageData_t MessageData; /* 统计使能的数据项 */ for (i = 0; i < 32; i++) { if ((PROTO_PM100_GET_DATA_CODE >> i) & 0x00000001) { Get_Data_NUM++; } } /* 外层列表:Get_Data_NUM + 4(状态项)+ 1(9527 SN号) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = Get_Data_NUM + 4 + 1; /* 增加9527 SN号项 */ MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 实时数据项(0~31) */ for (i = 0; i < 32; i++) { if ((PROTO_PM100_GET_DATA_CODE >> i) & 0x00000001) { /* 子列表:2个元素(索引 + 数据) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 2; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 索引 uint16 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_2Byte_uint; u16 index = i; MessageData.pData = (void *)(&index); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 数据 float */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_float; float *pAnalogData = (float *)&PM100.AnalogData; float value = pAnalogData[i]; MessageData.pData = (void *)(&value); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } } /* 状态项 3001~3005 */ for (i = 0; i < 4; i++) { u32 status_index = 3001 + i; u8 status_value = 0; /* 获取状态值 */ switch (status_index) { case 3001: if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_NORMAL) status_value = PROTO_PM100_MODE_NORMAL; else if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_POWER_SAVING) status_value = PROTO_PM100_MODE_POWER_SAVING; break; case 3002: if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_RUNING) status_value = PROTO_PM100_MODE_RUNING; else if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_STOP) status_value = PROTO_PM100_MODE_STOP; break; case 3003: if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_RUNING) status_value = PROTO_PM100_MODE_RUNING; else if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_STOP) status_value = PROTO_PM100_MODE_STOP; break; case 3004: if(PM100.error_code & PROTO_PM100_ERROR_CODE_TIMEOUT) { status_value = PROTO_PM100_MODE_OFFLINE; } else { if(Temp!=0) { status_value = PROTO_PM100_MODE_ALARM; }else if(PROTO_PM100_MODE_RUNING == PM100.Opera_Status.BP_Status && PROTO_PM100_MODE_RUNING == PM100.Opera_Status.MP_Status) { status_value = PROTO_PM100_MODE_RUN; }else if(PROTO_PM100_MODE_STOP == PM100.Opera_Status.BP_Status || PROTO_PM100_MODE_STOP == PM100.Opera_Status.MP_Status) { status_value = PROTO_PM100_MODE_IDIE; }else { status_value = PROTO_PM100_MODE_ONLINE; } } break; case 3005: /* 警告报警码特殊处理,返回 8 字节 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 2; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); MessageData.DataType = PROTO_SECS2_DATA_TYPE_2Byte_uint; u16 idx = 3005; MessageData.pData = (void *)(&idx); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); u64 warning_alarm = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code; MessageData.DataType = PROTO_SECS2_DATA_TYPE_8Byte_uint; MessageData.pData = (void *)(&warning_alarm); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); continue; /* 跳过后续 ASCII 处理 */ } /* 子列表:2个元素(索引 + 数据) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 2; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 索引 uint16 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_2Byte_uint; u16 index = status_index; MessageData.pData = (void *)(&index); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 数据 (单字符) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_1Byte_uint; MessageData.pData = (void *)(&status_value); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } /* 子列表:2个元素(索引 + 数据) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 2; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 索引 uint16(9527) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_2Byte_uint; u16 sn_index = 9527; MessageData.pData = (void *)(&sn_index); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 数据 ASCII(字符串"SN100000011") */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; // char sn_string[] = "SN100000011"; // MessageData.pData = (void *)sn_string; MessageData.pData = (void *)Usr_Flash.FlashData.Device_SN; MessageData.DataNum = strlen(Usr_Flash.FlashData.Device_SN); // MessageData.DataNum = sizeof(sn_string) - 1; /* 长度11,不包括null终止符 */ TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } else if (IndexCount == 1) { /* ========== 单个数据响应 ========== */ proto_SECS2_MessageData_t MessageData; u32 index = pIndexArray[0]; /* 外层列表:1个元素(数据) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 1; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 根据索引类型返回数据 */ if (index <= 31) { /* 模拟数据 float */ float *pAnalogData = (float *)&PM100.AnalogData; float value = pAnalogData[index]; MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_float; MessageData.pData = (void *)(&value); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } else if (index >= 3001 && index <= 3005) { /* 状态数据 */ if (index == 3005) { /* 警告报警码(8字节) */ u64 warning_alarm = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code; MessageData.DataType = PROTO_SECS2_DATA_TYPE_8Byte_uint; MessageData.pData = (void *)(&warning_alarm); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } else { /* 状态字符(ASCII) */ u8 status_value = 0; switch (index) { case 3001: if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_NORMAL) status_value = PROTO_PM100_MODE_NORMAL; else if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_POWER_SAVING) status_value = PROTO_PM100_MODE_POWER_SAVING; break; case 3002: if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_RUNING) status_value = PROTO_PM100_MODE_RUNING; else if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_STOP) status_value = PROTO_PM100_MODE_STOP; break; case 3003: if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_RUNING) status_value = PROTO_PM100_MODE_RUNING; else if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_STOP) status_value = PROTO_PM100_MODE_STOP; break; case 3004: if(PM100.error_code & PROTO_PM100_ERROR_CODE_TIMEOUT) { status_value = PROTO_PM100_MODE_OFFLINE; } else { if(Temp!=0) { status_value = PROTO_PM100_MODE_ALARM; }else if(PROTO_PM100_MODE_RUNING == PM100.Opera_Status.BP_Status && PROTO_PM100_MODE_RUNING == PM100.Opera_Status.MP_Status) { status_value = PROTO_PM100_MODE_RUN; }else if(PROTO_PM100_MODE_STOP == PM100.Opera_Status.BP_Status || PROTO_PM100_MODE_STOP == PM100.Opera_Status.MP_Status) { status_value = PROTO_PM100_MODE_IDIE; }else { status_value = PROTO_PM100_MODE_ONLINE; } } break; } MessageData.DataType = PROTO_SECS2_DATA_TYPE_1Byte_uint; MessageData.pData = (void *)(&status_value); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } } else if (index == 9527) { /* 9527 SN号(ASCII字符串) */ // char sn_string[] = "SN100000011"; MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; // MessageData.pData = (void *)sn_string; // MessageData.DataNum = 11; /* 长度11,不包括null终止符 */ MessageData.pData = (void *)Usr_Flash.FlashData.Device_SN; MessageData.DataNum = strlen(Usr_Flash.FlashData.Device_SN); TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } } else { /* ========== 多个数据响应 ========== */ proto_SECS2_MessageData_t MessageData; /* 外层列表:IndexCount 个元素 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = IndexCount; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); for (i = 0; i < IndexCount; i++) { u32 index = pIndexArray[i]; if (index <= 31) { /* 模拟数据 float */ float *pAnalogData = (float *)&PM100.AnalogData; float value = pAnalogData[index]; MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_float; MessageData.pData = (void *)(&value); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } else if (index >= 3001 && index <= 3005) { if (index == 3005) { /* 警告报警码(8字节) */ u64 warning_alarm = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code; MessageData.DataType = PROTO_SECS2_DATA_TYPE_8Byte_uint; MessageData.pData = (void *)(&warning_alarm); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } else { /* 状态字符(ASCII) */ u8 status_value = 0; switch (index) { case 3001: if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_NORMAL) status_value = PROTO_PM100_MODE_NORMAL; else if (PM100.Opera_Status.Run_Status == PROTO_PM100_MODE_POWER_SAVING) status_value = PROTO_PM100_MODE_POWER_SAVING; break; case 3002: if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_RUNING) status_value = PROTO_PM100_MODE_RUNING; else if (PM100.Opera_Status.MP_Status == PROTO_PM100_MODE_STOP) status_value = PROTO_PM100_MODE_STOP; break; case 3003: if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_RUNING) status_value = PROTO_PM100_MODE_RUNING; else if (PM100.Opera_Status.BP_Status == PROTO_PM100_MODE_STOP) status_value = PROTO_PM100_MODE_STOP; break; case 3004: if(PM100.error_code & PROTO_PM100_ERROR_CODE_TIMEOUT) { status_value = PROTO_PM100_MODE_OFFLINE; } else { if(Temp!=0) { status_value = PROTO_PM100_MODE_ALARM; }else if(PROTO_PM100_MODE_RUNING == PM100.Opera_Status.BP_Status && PROTO_PM100_MODE_RUNING == PM100.Opera_Status.MP_Status) { status_value = PROTO_PM100_MODE_RUN; }else if(PROTO_PM100_MODE_STOP == PM100.Opera_Status.BP_Status || PROTO_PM100_MODE_STOP == PM100.Opera_Status.MP_Status) { status_value = PROTO_PM100_MODE_IDIE; }else { status_value = PROTO_PM100_MODE_ONLINE; } } break; } MessageData.DataType = PROTO_SECS2_DATA_TYPE_1Byte_uint; MessageData.pData = (void *)(&status_value); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } } else if (index == 9527) { /*9527 SN号(ASCII字符串) */ // char sn_string[] = "SN100000011"; MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData.pData = (void *)Usr_Flash.FlashData.Device_SN; MessageData.DataNum = strlen(Usr_Flash.FlashData.Device_SN); // MessageData.pData = (void *)sn_string; // MessageData.DataNum = sizeof(sn_string) - 1; /* 长度11,不包括null终止符 */ TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); } } } /* 发送数据 */ proto_SECS2_Send(pHeader_Data, Tx, TxLen); } void proto_SECS2_Tx_S2F49(proto_HSMS_Header_Data_t *pHeader_Data,void *pData,u16 Len) { u8 *Tx = proto_SECS2_Tx_Buffer,TxLen = 0; u8 Tx_Data = 1; proto_SECS2_MessageData_t MessageData; pHeader_Data->Header_Byte3++; pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0; MessageData.DataType = PROTO_SECS2_DATA_TYPE_Bool; MessageData.pData = (void *)(&Tx_Data); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData); /*将发送数据拼接到HSMS后面*/ proto_SECS2_Send(pHeader_Data,Tx,TxLen); } void proto_SECS2_Tx_S1F1(proto_HSMS_Header_Data_t *pHeader_Data,void *pData,u16 Len) { u8 *Tx = proto_SECS2_Tx_Buffer,TxLen=0; u8 list_count = 0; proto_SECS2_MessageData_t MessageData; pHeader_Data->Header_Byte3++; pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0; /*List 2 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 2; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData); /*ASCII Station_Type[8] */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData.pData = (void *)Usr_Flash.FlashData.Station_Type; MessageData.DataNum = strlen(Usr_Flash.FlashData.Station_Type); TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData); /*ASCII "2025.ver12" */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData.pData = (void *)Usr_Flash.FlashData.Version; MessageData.DataNum = strlen(Usr_Flash.FlashData.Version); TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData); /*将发送数据拼接到HSMS后面*/ proto_SECS2_Send(pHeader_Data,Tx,TxLen); } void proto_SECS2_Tx_S6F11(proto_HSMS_Header_Data_t *pHeader_Base, u8 index, u8 is_alarm, const char *start_str, u32 duration_sec) { u8 *Tx = proto_SECS2_Tx_Buffer; u16 TxLen = 0; u8 list_count; proto_SECS2_MessageData_t MessageData; proto_HSMS_Header_Data_t Header = *pHeader_Base; Header.Header_Byte2.Analysis_Data.Wait = PROTO_ALARM_CHANGE_RX_WAIT; /* 外层列表:3个元素 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 3; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* Data ID 从 Flash 读取 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData.pData = (void *)&Usr_Flash.FlashData.Data_ID1; MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* Collection Event ID 从 Flash 读取 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData.pData = (void *)&Usr_Flash.FlashData.Collection_event_ID1; MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 第三层列表:1个元素 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 1; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 第四层列表:2个元素 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 2; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* Report ID - 置空(或从 Flash 读取) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; u32 empty_report_id = 0; MessageData.pData = (void *)&empty_report_id; MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 报警数据列表:只包含 1 个报警项 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 1; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); char duration_str[20]; snprintf(duration_str, sizeof(duration_str), "%lu", duration_sec); // 调用send_alarm_item 发送单个报警项 send_alarm_item(&MessageData, Tx, &TxLen, index, is_alarm, start_str, duration_str); /* 发送消息 */ proto_SECS2_Send(&Header, Tx, TxLen); } char alarm_description[32]; char ip_description[32]; // 发送单个报警项 static void send_alarm_item(proto_SECS2_MessageData_t *MessageData, u8 *Tx, u16 *TxLen, u8 index, u8 is_alarm, const char *start_str, const char *duration_str) { u8 list_count; u32 alarm_id_to_send; char alarm_type[20]; char empty_ascii[1] = ""; u32 empty_uint = 0; char begin_warning[6] = "Begin"; char end_warning[6] = "End"; // 设置报警ID和描述 if(90 == index && 1 == is_alarm) { alarm_id_to_send = 90; snprintf(alarm_description, sizeof(alarm_description), "%s", "Pump Offline"); strncpy(alarm_type, "Major Alarm", sizeof(alarm_type)); } else if (is_alarm) { alarm_id_to_send = 50 + index; // 报警ID从50开始 snprintf(alarm_description, sizeof(alarm_description), "%s", proto_PM100_Str_AlarmCode[index]); strncpy(alarm_type, "Major Alarm", sizeof(alarm_type)); } else { alarm_id_to_send = index; // 警告ID从0开始 snprintf(alarm_description, sizeof(alarm_description), "%s", proto_PM100_Str_WarmingCode[index]); strncpy(alarm_type, "Major Warning", sizeof(alarm_type)); } /* 单个报警项列表:19个元素 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 19; MessageData->pData = (void *)(&list_count); MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 1. AlarmID */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData->pData = (void *)&alarm_id_to_send; MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 2. 报警类型 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)alarm_type; MessageData->DataNum = strlen(alarm_type); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 3. 报警机台和位置 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)Usr_Flash.FlashData.Device_Model; MessageData->DataNum = strlen(Usr_Flash.FlashData.Device_Model); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 4. IP+port*/ sprintf(ip_description,"%d.%d.%d.%d:%d",W5500.IP_Addr[0],W5500.IP_Addr[1],W5500.IP_Addr[2],W5500.IP_Addr[3],(W5500.IP_Addr[2],W5500.W5500_Class[0].ConfigData.Port[0] << 8) | W5500.W5500_Class[0].ConfigData.Port[1]); MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)ip_description; MessageData->DataNum = strlen(ip_description); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 5. 设备型号 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)Usr_Flash.FlashData.Device_ID; MessageData->DataNum = strlen(Usr_Flash.FlashData.Device_ID); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 6. 报警描述 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)alarm_description; MessageData->DataNum = strlen(alarm_description); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 7. Over Trigger */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)empty_ascii; MessageData->DataNum = 0; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 8. Equipment */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)empty_ascii; MessageData->DataNum = 0; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 9. Begin Warning */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; if(strcmp(duration_str,"0") == 0) { MessageData->pData = (void *)begin_warning; MessageData->DataNum = strlen(begin_warning); }else { MessageData->pData = (void *)end_warning; MessageData->DataNum = strlen(end_warning); } *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 10. Variable data 2 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)empty_ascii; MessageData->DataNum = 0; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 11. 设备类型 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData->pData = (void *)&empty_uint; MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 12. Sensor名称 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData->pData = (void *)&empty_uint; MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 13. 报警值 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData->pData = (void *)&empty_uint; MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 14. 报警单位 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData->pData = (void *)&empty_uint; MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 15. 开始时间 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)start_str; MessageData->DataNum = strlen(start_str); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 16. 报警时长 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)duration_str; MessageData->DataNum = strlen(duration_str); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 17. 报警类型 (策略报警/机台报警) - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)empty_ascii; MessageData->DataNum = 0; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 18. 机台名称(flash) */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)Usr_Flash.FlashData.Station_Name; MessageData->DataNum = strlen(Usr_Flash.FlashData.Station_Name); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 19. 腔体名称(flash) */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)Usr_Flash.FlashData.Chamber_Name; MessageData->DataNum = strlen(Usr_Flash.FlashData.Chamber_Name); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); } // 发送正常状态项 static void send_normal_alarm_item(proto_SECS2_MessageData_t *MessageData, u8 *Tx, u16 *TxLen) { u8 list_count; u32 alarm_id_to_send = 0; char alarm_description[32] = "Normal"; char alarm_type[20] = "Normal"; char empty_ascii[1] = ""; u32 empty_uint = 0; char begin_warning[6] = "Begin"; /* 单个报警项列表:19个元素 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 19; MessageData->pData = (void *)(&list_count); MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 1. AlarmID */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData->pData = (void *)&alarm_id_to_send; MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 2. 报警类型 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)alarm_type; MessageData->DataNum = strlen(alarm_type); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 3. 报警机台和位置 (前10位字符) */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)Usr_Flash.FlashData.Device_Model; MessageData->DataNum = strlen(Usr_Flash.FlashData.Device_Model); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 4. IP+port*/ sprintf(alarm_description,"%d.%d.%d.%d:%d",W5500.IP_Addr[0],W5500.IP_Addr[1],W5500.IP_Addr[2],W5500.IP_Addr[3],(W5500.IP_Addr[2],W5500.W5500_Class[0].ConfigData.Port[0] << 8) | W5500.W5500_Class[0].ConfigData.Port[1]); MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)alarm_description; MessageData->DataNum = strlen(alarm_description); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 5. 设备型号 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)Usr_Flash.FlashData.Device_ID; MessageData->DataNum = strlen(Usr_Flash.FlashData.Device_ID); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 6. 报警描述 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)alarm_description; MessageData->DataNum = strlen(alarm_description); *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 7. Over Trigger - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)empty_ascii; MessageData->DataNum = 0; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 8. Equipment - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)empty_ascii; MessageData->DataNum = 0; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 9. Begin Warning - 固定为"Begin" */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)begin_warning; MessageData->DataNum = 5; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 10. Variable data 2 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)empty_ascii; MessageData->DataNum = 0; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 11. 设备类型 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData->pData = (void *)&empty_uint; MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 12. Sensor名称 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData->pData = (void *)&empty_uint; MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 13. 报警值 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData->pData = (void *)&empty_uint; MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 14. 报警单位 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; MessageData->pData = (void *)&empty_uint; MessageData->DataNum = 1; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 15. 开始时间 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)empty_ascii; MessageData->DataNum = 0; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 16. 报警时长 - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)empty_ascii; MessageData->DataNum = 0; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); /* 17. 报警类型 (策略报警/机台报警) - 置空 */ MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData->pData = (void *)empty_ascii; MessageData->DataNum = 0; *TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData); } void proto_SECS2_Tx_S1F13(proto_HSMS_Header_Data_t *pHeader_Data,void *pData,u16 Len) { u8 *Tx = proto_SECS2_Tx_Buffer,TxLen=0; u8 list_count; proto_SECS2_MessageData_t MessageData; pHeader_Data->Header_Byte3++; pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0; /*List 2*/ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 2; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData); /*Bool 0*/ u8 bool_value = 1; MessageData.DataType = PROTO_SECS2_DATA_TYPE_Bool; MessageData.pData = (void *)(&bool_value); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData); /*List 2*/ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 2; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData); /*ASCII PK1143*/ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; //MessageData.pData = (void *)(PK_string); MessageData.pData = (void *)Usr_Flash.FlashData.Manufacturer; MessageData.DataNum = strlen(Usr_Flash.FlashData.Manufacturer); TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData); /*ASCII 001181*/ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; // MessageData.pData = (void *)(CODE_string); MessageData.pData = (void *)Usr_Flash.FlashData.Version; MessageData.DataNum = strlen(Usr_Flash.FlashData.Version); TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData); /*将发送数据拼接到HSMS后面*/ proto_SECS2_Send(pHeader_Data,Tx,TxLen); } void proto_SECS2_Tx_S2F31(proto_HSMS_Header_Data_t *pHeader_Data,void *pData,u16 Len,u8 bool) { u8 *Tx = proto_SECS2_Tx_Buffer,TxLen = 0; // u8 binary_value = 1; // char binary_value[8]="Ture"; proto_SECS2_MessageData_t MessageData; pHeader_Data->Header_Byte3++; pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0; MessageData.DataType = PROTO_SECS2_DATA_TYPE_Bool; MessageData.pData = (void *)(&bool); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen],&MessageData); /*将发送数据拼接到HSMS后面*/ proto_SECS2_Send(pHeader_Data,Tx,TxLen); } void proto_SECS2_Tx_Device_S6F11(proto_HSMS_Header_Data_t *pHeader_Data, void *pData, u16 Len) { u8 *Tx = proto_SECS2_Tx_Buffer; u16 TxLen = 0; u8 list_count,status_value; u64 Temp; Temp = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code; // 构建状态字符串 char status_buffer[20] = ""; char time_string[15]; // 14位时间字符串 + 1个null终止符 proto_SECS2_MessageData_t MessageData; /* 外层列表:3个元素 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 3; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 第一个元素: Data ID (U4) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; u32 data_id=1; //MessageData.pData = (void *)&Usr_Flash.FlashData.Data_ID1; MessageData.pData=(void *)data_id; MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 第二个元素: Collection event ID (U4) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; //MessageData.pData = (void *)&Usr_Flash.FlashData.Collection_event_ID1; u32 collection_event_id=2; MessageData.pData=(void *)collection_event_id; MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 第三层列表:1个元素 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 1; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 第四层列表:2个元素 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 2; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* Report ID (U4) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint; //MessageData.pData = (void *)&Usr_Flash.FlashData.Report_ID1; u32 report_id=3; MessageData.pData=(void *)report_id; MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 第五层列表:7个元素 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_List; list_count = 7; MessageData.pData = (void *)(&list_count); MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 1. 机台名称(flash) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData.pData = (void *)Usr_Flash.FlashData.Station_Name; MessageData.DataNum = strlen(Usr_Flash.FlashData.Station_Name); TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 2. 腔体名称(flash) */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData.pData = (void *)Usr_Flash.FlashData.Chamber_Name; MessageData.DataNum = strlen(Usr_Flash.FlashData.Chamber_Name); TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 3. 附属设备类型 - 固定为'PUMP' */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData.pData = (void *)"PUMP"; MessageData.DataNum = 4; // "PUMP"的长度 TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 4. 附属设备状态 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; // BP状态改变 // if (PM100.Dev_Status_Control.Opera_Status_Last.BP_Status != PM100.Opera_Status.BP_Status) { // if (PROTO_PM100_MODE_RUNING == PM100.Opera_Status.BP_Status) { // strcat(status_buffer, "BP run"); // } else { // strcat(status_buffer, "BP stop"); // } // } // // // MP状态改变 // if (PM100.Dev_Status_Control.Opera_Status_Last.MP_Status != PM100.Opera_Status.MP_Status) { // if (PROTO_PM100_MODE_RUNING == PM100.Opera_Status.MP_Status) { // strcat(status_buffer, "MP run"); // } else { // strcat(status_buffer, "MP stop"); // } // } // // // 运行模式改变 // if (PM100.Dev_Status_Control.Opera_Status_Last.Run_Status != PM100.Opera_Status.Run_Status) { // if (PROTO_PM100_MODE_POWER_SAVING == PM100.Opera_Status.Run_Status) { // strcat(status_buffer, "Power-saving mode"); // } else { // strcat(status_buffer, "Normal mode"); // } // } if(PM100.error_code & PROTO_PM100_ERROR_CODE_TIMEOUT) { status_value = PROTO_PM100_MODE_OFFLINE; } else { if(Temp!=0) { status_value = PROTO_PM100_MODE_ALARM; }else if(PROTO_PM100_MODE_RUNING == PM100.Opera_Status.BP_Status && PROTO_PM100_MODE_RUNING == PM100.Opera_Status.MP_Status) { status_value = PROTO_PM100_MODE_RUN; }else if(PROTO_PM100_MODE_STOP == PM100.Opera_Status.BP_Status || PROTO_PM100_MODE_STOP == PM100.Opera_Status.MP_Status) { status_value = PROTO_PM100_MODE_IDIE; }else { status_value = PROTO_PM100_MODE_PE; } } MessageData.pData = (void *)&status_value; MessageData.DataNum = 1; TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 5. 状态切换成功时间 - 从DS1302获取 */ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; // bsp_DS1302_Time_t current_time; snprintf(time_string, sizeof(time_string), "20%02d%02d%02d%02d%02d%02d", DS1302.Time.Year, DS1302.Time.Month, DS1302.Time.Day, DS1302.Time.Hour, DS1302.Time.Minute, DS1302.Time.Second); MessageData.pData = (void *)time_string; MessageData.DataNum = 14; // 14位时间字符串长度 TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 6. 腔体位置 - 设为空(ALL表示没有具体位置)*/ MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData.pData = (void *)"ALL"; MessageData.DataNum = 3; // "ALL"的长度 TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); sprintf(alarm_description,"%d.%d.%d.%d:%d",W5500.IP_Addr[0],W5500.IP_Addr[1],W5500.IP_Addr[2],W5500.IP_Addr[3],(W5500.W5500_Class[0].ConfigData.Port[0] << 8) | W5500.W5500_Class[0].ConfigData.Port[1]); MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII; MessageData.pData = (void *)alarm_description; MessageData.DataNum = strlen(alarm_description); TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); /* 将发送数据拼接到HSMS后面 */ proto_SECS2_Send(pHeader_Data, Tx, TxLen); } /*警报主动上传*/ static void proto_SECS2_Tx_Alarm_Task(void) { static u32 Sys_Byte; u32 now_sec; char now_str[15]; u8 offline; static u8 last_offline_state = 0; // 上一次离线状态 static u32 offline_start_sec = 0; // 离线开始秒数 static char offline_start_str[15] = {0};// 离线开始时间字符串 /*1s判断一次*/ if (TIME_TRUE == OsTimer_CheckTimeOut(PM100.Alarm_Control.StartTime, osTime_MSecTick, 1000)) { u64 Temp,activated_bits,changed_bits,deactivated_bits; PM100.Alarm_Control.StartTime = osTime_MSecTick; Temp = ((u64)PM100.Opera_Status.Warming_Code << 32) | (u64)PM100.Opera_Status.Alarm_Code; offline = (PM100.error_code & PROTO_PM100_ERROR_CODE_TIMEOUT) ? 1 : 0; if(offline != last_offline_state) /*超时*/ { proto_HSMS_Header_Data_t Header_Data; Header_Data.Device_Id = HSMS.Flash_ConfigData.Device_Id; Header_Data.Header_Byte2.Analysis_Data.Stream = 6; Header_Data.Header_Byte2.Analysis_Data.Wait = PROTO_ALARM_CHANGE_RX_WAIT; Header_Data.Header_Byte3 = 11; Header_Data.PType = proto_HSMS_PTYPE_SECS2; Header_Data.SType = PROTO_HSMS_STYPE_Data_Message; now_sec = get_current_seconds(); format_current_time_str(now_str, sizeof(now_str)); if (offline == 1 && last_offline_state == 0) // 在线 → 离线 { offline_start_sec = now_sec; strcpy(offline_start_str, now_str); pSECS2->sys_count++; Header_Data.Sys_Byte = pSECS2->sys_count; proto_SECS2_Tx_S6F11(&Header_Data, 90, 1, now_str, 0); } else if (offline == 0 && last_offline_state == 1) // 离线 → 在线 { u32 duration = now_sec - offline_start_sec; pSECS2->sys_count++; Header_Data.Sys_Byte = pSECS2->sys_count; proto_SECS2_Tx_S6F11(&Header_Data, 90, 1, offline_start_str, duration); offline_start_sec = 0; offline_start_str[0] = '\0'; } last_offline_state = offline; } else if(PM100.Alarm_Control.Code_Last != Temp) { changed_bits = Temp ^ PM100.Alarm_Control.Code_Last; activated_bits = changed_bits & Temp; // 新激活的位 deactivated_bits = changed_bits & PM100.Alarm_Control.Code_Last; // 消失的位 // if(0 != Temp) // { now_sec = get_current_seconds(); format_current_time_str(now_str, sizeof(now_str)); proto_HSMS_Header_Data_t Header_Data; Header_Data.Device_Id = HSMS.Flash_ConfigData.Device_Id; Header_Data.Header_Byte2.Analysis_Data.Stream = 6; Header_Data.Header_Byte2.Analysis_Data.Wait = PROTO_ALARM_CHANGE_RX_WAIT; Header_Data.Header_Byte3 = 11; Header_Data.PType = proto_HSMS_PTYPE_SECS2; Header_Data.SType = PROTO_HSMS_STYPE_Data_Message; pSECS2->sys_count++; Header_Data.Sys_Byte = pSECS2->sys_count; // 处理激活的报警(开始事件,时长0) for (u8 i = 0; i < 32; i++) { if (activated_bits & ((u64)1 << i)) { strcpy(PM100.Opera_Status.alarm_start_str[i], now_str); PM100.Opera_Status.alarm_start_sec[i] = now_sec; pSECS2->sys_count++; Header_Data.Sys_Byte = pSECS2->sys_count; proto_SECS2_Tx_S6F11(&Header_Data, i, 1, now_str, 0); } } for (u8 i = 32; i < 64; i++) { if (activated_bits & ((u64)1 << i)) { u8 idx = i - 32; strcpy(PM100.Opera_Status.warning_start_str[idx], now_str); PM100.Opera_Status.warning_start_sec[idx] = now_sec; pSECS2->sys_count++; Header_Data.Sys_Byte = pSECS2->sys_count; proto_SECS2_Tx_S6F11(&Header_Data, idx, 0, now_str, 0); } } // 处理消失的报警(结束事件,计算时长) for (u8 i = 0; i < 32; i++) { if (deactivated_bits & ((u64)1 << i)) { u32 duration = now_sec - PM100.Opera_Status.alarm_start_sec[i]; pSECS2->sys_count++; Header_Data.Sys_Byte = pSECS2->sys_count; proto_SECS2_Tx_S6F11(&Header_Data, i, 1, PM100.Opera_Status.alarm_start_str[i], duration); // 清空记录 PM100.Opera_Status.alarm_start_str[i][0] = '\0'; PM100.Opera_Status.alarm_start_sec[i] = 0; } } for (u8 i = 32; i < 64; i++) { if (deactivated_bits & ((u64)1 << i)) { u8 idx = i - 32; u32 duration = now_sec - PM100.Opera_Status.warning_start_sec[idx]; pSECS2->sys_count++; Header_Data.Sys_Byte = pSECS2->sys_count; proto_SECS2_Tx_S6F11(&Header_Data, idx, 0, PM100.Opera_Status.warning_start_str[idx], duration); PM100.Opera_Status.warning_start_str[idx][0] = '\0'; PM100.Opera_Status.warning_start_sec[idx] = 0; } } // } PM100.Alarm_Control.Code_Last = Temp; // PM100.Alarm_Control.Reset(); } } } /*设备状态*/ static void proto_SECS2_Tx_Dev_State_Task(void) { /*1s判断一次*/ if (TIME_TRUE == OsTimer_CheckTimeOut(PM100.Dev_Status_Control.StartTime, osTime_MSecTick, 1000)) { u64 Temp; PM100.Dev_Status_Control.StartTime = osTime_MSecTick; if( PM100.Dev_Status_Control.Opera_Status_Last.BP_Status != PM100.Opera_Status.BP_Status || PM100.Dev_Status_Control.Opera_Status_Last.MP_Status != PM100.Opera_Status.MP_Status || PM100.Dev_Status_Control.Opera_Status_Last.Run_Status != PM100.Opera_Status.Run_Status ) { proto_HSMS_Header_Data_t Header_Data; Header_Data.Device_Id = HSMS.Flash_ConfigData.Device_Id; Header_Data.Header_Byte2.Analysis_Data.Stream = 6; /*S6*/ Header_Data.Header_Byte2.Analysis_Data.Wait = PROTO_STATE_CHANGE_RX_WAIT; Header_Data.Header_Byte3 = 11; /*F11*/ Header_Data.PType = proto_HSMS_PTYPE_SECS2; Header_Data.SType = PROTO_HSMS_STYPE_Data_Message; pSECS2->sys_count++; Header_Data.Sys_Byte = pSECS2->sys_count; proto_SECS2_Tx_Device_S6F11(&Header_Data,&Temp,8); PM100.Dev_Status_Control.Reset(); } } } static void proto_SECS2_Rx_Task(proto_HSMS_Header_Data_t *pHeader_Data,u8 *pData,u16 Len) { u16 SnFm; u8 DataNum; /* 获取 Stream 和 Function */ SnFm = pHeader_Data->Header_Byte2.Analysis_Data.Stream << 8 | pHeader_Data->Header_Byte3; //无需回复 if(1 != pHeader_Data->Header_Byte2.Analysis_Data.Wait) { if(PROTO_SECS2_S6F12 == SnFm) { /* 处理 S5F2 */ } else { return; } } DataNum = proto_SECS2_Rx_MessageDataAnalysis_List(pData,Len); if(PROTO_SECS2_S1F1 == SnFm || PROTO_SECS2_S1F13 == SnFm) /*S1F1不进行数据判断*/ { } else if(0 == DataNum)/*没有解析数据*/ { return; } /*记录系统计数*/ pSECS2->sys_count = pHeader_Data->Sys_Byte; /*回复对应指令*/ switch(SnFm) { case PROTO_SECS2_S1F3 : { if (DataNum == 0) return; u32 index_array[PROTO_SECS2_MESSAGE_DATA_NUM]; u8 index_count = 0; u8 i; /* 提取所有索引(假设为 4Byte_uint 类型) */ for (i = 0; i < DataNum; i++) { if (proto_SECS2_Rx_MessageData[i].DataType == PROTO_SECS2_DATA_TYPE_4Byte_uint) { u32 *pIndex = (u32 *)proto_SECS2_Rx_MessageData[i].pData; index_array[index_count++] = *pIndex; } } if (index_count > 0) { proto_SECS2_Tx_S1F3(pHeader_Data, index_array, index_count); } }break; case PROTO_SECS2_S2F49 : { u8 Cmd,Dev,Mode; u16 Speed; u8 *pCmdData; char pText[10]; /*Device Status*/ pCmdData = proto_SECS2_Rx_MessageData[3].pData; snprintf(pText,10,"%s",pCmdData); if(0 == strncmp(pText,BP_ON,strlen(BP_ON))) { Dev = PROTO_PM100_DEV_BP; PM100.Control.Start(Dev); }else if(0 == strncmp(pText,MP_ON,strlen(MP_ON))) { Dev = PROTO_PM100_DEV_MP; PM100.Control.Start(Dev); }else if(0 == strncmp(pText,ALL_RESET,strlen(ALL_RESET))) { PM100.Control.Reset(); }else if(0 == strncmp(pText,BP_STOP,strlen(BP_STOP))) { Dev = PROTO_PM100_DEV_BP; PM100.Control.Stop(Dev); }else if(0 == strncmp(pText,MP_STOP,strlen(MP_STOP))) { Dev = PROTO_PM100_DEV_MP; PM100.Control.Stop(Dev); }else if(0 == strncmp(pText,NORMAL,strlen(NORMAL))) { Mode = PROTO_PM100_MODE_NORMAL; PM100.Control.Set_Mode(Mode); }else if(0 == strncmp(pText,POWER_SAVE,strlen(POWER_SAVE))) { Mode = PROTO_PM100_MODE_POWER_SAVING; PM100.Control.Set_Mode(Mode); }else if(0 == strncmp(pText,MP_NORMAL_SPEED,strlen(MP_NORMAL_SPEED))) { Dev = PROTO_PM100_DEV_MP; Mode = PROTO_PM100_MODE_NORMAL; sscanf(pText,"MN%hu",&Speed); PM100.Control.Set_Speed(Dev,Mode,Speed); }else if(0 == strncmp(pText,MP_SAVE_SPEED,strlen(MP_SAVE_SPEED))) { Dev = PROTO_PM100_DEV_MP; Mode = PROTO_PM100_MODE_POWER_SAVING; sscanf(pText,"MS%hu",&Speed); PM100.Control.Set_Speed(Dev,Mode,Speed); }else if(0 == strncmp(pText,BP_NORMAL_SPEED,strlen(BP_NORMAL_SPEED))) { Dev = PROTO_PM100_DEV_BP; Mode = PROTO_PM100_MODE_NORMAL; sscanf(pText,"BN%hu",&Speed); PM100.Control.Set_Speed(Dev,Mode,Speed); }else if(0 == strncmp(pText,BP_SAVE_SPEED,strlen(BP_SAVE_SPEED))) { Dev = PROTO_PM100_DEV_BP; Mode = PROTO_PM100_MODE_POWER_SAVING; sscanf(pText,"BS%hu",&Speed); PM100.Control.Set_Speed(Dev,Mode,Speed); } // /*CMD*/ // pCmdData = proto_SECS2_Rx_MessageData[0].pData; // snprintf(pText,10,"%s",pCmdData); // if(0 == strncmp(pText,PROTO_PM100_CMD_STR_START,strlen(PROTO_PM100_CMD_STR_START)) ) // { // Cmd = PROTO_PM100_CMD_START; // } // else if(0 == strncmp(pText,PROTO_PM100_CMD_STR_STOP,strlen(PROTO_PM100_CMD_STR_STOP)) ) // { // Cmd = PROTO_PM100_CMD_STOP; // } // else if(0 == strncmp(pText,PROTO_PM100_CMD_STR_RESET,strlen(PROTO_PM100_CMD_STR_RESET)) ) // { // Cmd = PROTO_PM100_CMD_RESET; // } // else if(0 == strncmp(pText,PROTO_PM100_CMD_STR_SET_MODE,strlen(PROTO_PM100_CMD_STR_SET_MODE)) ) // { // Cmd = PROTO_PM100_CMD_SET_MODE; // } // else if(0 == strncmp(pText,PROTO_PM100_CMD_STR_SET_SPEED,strlen(PROTO_PM100_CMD_STR_SET_SPEED)) ) // { // Cmd = PROTO_PM100_CMD_SET_SPEED; // } // /*Dev*/ // pCmdData = proto_SECS2_Rx_MessageData[1].pData; // if(PROTO_PM100_DEV_CHAR_MP == pCmdData[0]) // { // Dev = PROTO_PM100_DEV_MP; // } // else if(PROTO_PM100_DEV_CHAR_BP == pCmdData[0]) // { // Dev = PROTO_PM100_DEV_BP; // } // // /*MOD*/ // pCmdData = proto_SECS2_Rx_MessageData[2].pData; // if(PROTO_PM100_MODE_CHAR_NORMAL == pCmdData[0]) // { // Mode = PROTO_PM100_MODE_NORMAL; // } // else if(PROTO_PM100_MODE_CHAR_POWER_SAVING == pCmdData[0]) // { // Mode = PROTO_PM100_MODE_POWER_SAVING; // } // // /*speed*/ // pCmdData = proto_SECS2_Rx_MessageData[3].pData; // Speed = *(u16 *)pCmdData; // // switch(Cmd) // { // case PROTO_PM100_CMD_START: // { // PM100.Control.Start(Dev); // }break; // case PROTO_PM100_CMD_STOP: // { // PM100.Control.Stop(Dev); // }break; // case PROTO_PM100_CMD_RESET: // { // PM100.Control.Reset(); // }break; // case PROTO_PM100_CMD_SET_MODE: // { // PM100.Control.Set_Mode(Mode); // }break; // case PROTO_PM100_CMD_SET_SPEED: // { // PM100.Control.Set_Speed(Dev,Mode,Speed); // }break; // } proto_SECS2_Tx_S2F49(pHeader_Data,NULL,0); }break; case PROTO_SECS2_S1F1 : { proto_SECS2_Tx_S1F1(pHeader_Data,NULL,0); }break; case PROTO_SECS2_S6F12 : // 修改:S5F2改为S6F12 { if(PROTO_SECS2_DATA_TYPE_Binary == proto_SECS2_Rx_MessageData[0].DataType) { u8 *pMessageData = proto_SECS2_Rx_MessageData[0].pData; if(0 == pMessageData[0]) { PM100.Alarm_Control.Reset(); /*消除当前报警*/ } } }break; case PROTO_SECS2_S1F13 : { proto_SECS2_Tx_S1F13(pHeader_Data,NULL,0); }break; case PROTO_SECS2_S2F31 : /*时间校准*/ { if(PROTO_SECS2_DATA_TYPE_ASCII == proto_SECS2_Rx_MessageData[0].DataType) { bsp_DS1302_Time_t time; u8 *pMessageData = proto_SECS2_Rx_MessageData[0].pData; DS1302.Time.Year = (u16)(pMessageData[2] - '0') * 10 + (u16)(pMessageData[3] - '0'); DS1302.Time.Month = (u16)(pMessageData[4] - '0') * 10 + (u16)(pMessageData[5] - '0'); DS1302.Time.Day = (u16)(pMessageData[6] - '0') * 10 + (u16)(pMessageData[7] - '0'); DS1302.Time.Hour = (u16)(pMessageData[8] - '0') * 10 + (u16)(pMessageData[9] - '0'); DS1302.Time.Minute = (u16)(pMessageData[10] - '0') * 10 + (u16)(pMessageData[11] - '0'); DS1302.Time.Second = (u16)(pMessageData[12] - '0') * 10 + (u16)(pMessageData[13] - '0'); if(USR_FALSE == DS1302.Set(&DS1302.Time)) /*时间异常*/ { /* 时间设置失败 */ proto_SECS2_Tx_S2F31(pHeader_Data,NULL,0,0); } else /*时间正常*/ { proto_SECS2_Tx_S2F31(pHeader_Data,NULL,0,1); } } }break; default:/*无需处理的命令*/ { /* 不处理 */ }break; } } /*进行List的数据分包处理*/ static u8 proto_SECS2_Rx_MessageDataAnalysis_List(u8 *pData,u16 Len) { u8 RecursionNum = 0; /*递归次数*/ u8 MessageDataNum = 0; /*数据项数量*/ u16 LenIndex = 0; u8 i, k; /* 遍历接收的数据 */ while (LenIndex < Len) { RecursionNum++; if (RecursionNum > 100) { break; } u8 format_byte = pData[LenIndex]; u8 data_type = format_byte >> 2; u8 length_bytes_count = format_byte & 0x03; // 长度字节数 /* 跳过格式字节 */ LenIndex++; /* 读取长度 */ u16 data_length = 0; if (length_bytes_count == 1) { /* 1字节长度 */ data_length = pData[LenIndex]; LenIndex++; } else if (length_bytes_count == 2) { /* 2字节长度(大端序) */ data_length = (pData[LenIndex] << 8) | pData[LenIndex + 1]; LenIndex += 2; } else { /* 不支持其他长度格式 */ return 0; } /* 如果是list类型,记录并跳过 */ if (data_type == PROTO_SECS2_DATA_TYPE_List) { // 列表长度就是元素个数 proto_SECS2_Rx_MessageData[MessageDataNum].DataType = data_type; proto_SECS2_Rx_MessageData[MessageDataNum].ByteLen = data_length; proto_SECS2_Rx_MessageData[MessageDataNum].pData = &pData[LenIndex]; MessageDataNum++; // 对于列表,data_length 是元素个数,不是字节数 // 这里需要特殊处理,或者将列表视为特殊项 } else { /* 记录数据类型和地址 */ proto_SECS2_Rx_MessageData[MessageDataNum].DataType = data_type; proto_SECS2_Rx_MessageData[MessageDataNum].ByteLen = data_length; proto_SECS2_Rx_MessageData[MessageDataNum].pData = &pData[LenIndex]; LenIndex += data_length; MessageDataNum++; } } /*将数据重新排序为小端序方便进行数据解析*/ LenIndex = 0; for(i=0;ipData; /* 计算数据字节长度 */ switch(pData->DataType) { case PROTO_SECS2_DATA_TYPE_Binary: case PROTO_SECS2_DATA_TYPE_Bool: case PROTO_SECS2_DATA_TYPE_JIS_8: case PROTO_SECS2_DATA_TYPE_1Byte_uint: case PROTO_SECS2_DATA_TYPE_1Byte_int: data_length = 1 * pData->DataNum; break; case PROTO_SECS2_DATA_TYPE_ASCII: data_length = pData->DataNum; break; case PROTO_SECS2_DATA_TYPE_2Byte_uint: case PROTO_SECS2_DATA_TYPE_2Byte_int: case PROTO_SECS2_DATA_TYPE_2Byte_char: data_length = 2 * pData->DataNum; break; case PROTO_SECS2_DATA_TYPE_4Byte_uint: case PROTO_SECS2_DATA_TYPE_4Byte_float: case PROTO_SECS2_DATA_TYPE_4Byte_int: data_length = 4 * pData->DataNum; break; case PROTO_SECS2_DATA_TYPE_8Byte_uint: case PROTO_SECS2_DATA_TYPE_8Byte_float: case PROTO_SECS2_DATA_TYPE_8Byte_int: data_length = 8 * pData->DataNum; break; case PROTO_SECS2_DATA_TYPE_List: data_length = 1; // 列表元素个数占1字节 break; default: data_length = 0; break; } /* 根据数据长度选择长度字节数 */ if (data_length <= 255) { /* 长度范围为1(1个长度字节) */ pTxData[0] = (pData->DataType << 2) | 0x01; pTxData[1] = (u8)data_length; Byte_Len = 2 + data_length; } else { /* 长度范围为2(2个长度字节) */ pTxData[0] = (pData->DataType << 2) | 0x02; pTxData[1] = (u8)(data_length >> 8); // 高字节 pTxData[2] = (u8)(data_length); // 低字节 Byte_Len = 3 + data_length; } switch(pData->DataType) { /* 添加List */ case PROTO_SECS2_DATA_TYPE_List: { u8 length_byte_count = (pTxData[0] & 0x03); // 获取长度字节数 if (length_byte_count == 1) { pTxData[1] = *(u8 *)pData->pData; /* 列表元素个数 */ return 2; // 格式字节 + 长度字节 } else { pTxData[1] = 0; // 高位字节为0(元素个数不会超过255) pTxData[2] = *(u8 *)pData->pData; /* 列表元素个数 */ return 3; // 格式字节 + 2个长度字节 } }break; /* 1字节类型 */ case PROTO_SECS2_DATA_TYPE_Binary: case PROTO_SECS2_DATA_TYPE_Bool: case PROTO_SECS2_DATA_TYPE_JIS_8: case PROTO_SECS2_DATA_TYPE_1Byte_uint: case PROTO_SECS2_DATA_TYPE_1Byte_int: { u8 offset = (pTxData[0] & 0x03) + 1; // 计算数据偏移 if (pData->DataNum == 1) { pTxData[offset] = p[0]; } else { memcpy(&pTxData[offset], p, pData->DataNum); } }break; case PROTO_SECS2_DATA_TYPE_ASCII: { u8 offset = (pTxData[0] & 0x03) + 1; // 计算数据偏移 memcpy(&pTxData[offset], p, pData->DataNum); }break; /* 2字节类型 - 需要字节序转换 */ case PROTO_SECS2_DATA_TYPE_2Byte_uint: case PROTO_SECS2_DATA_TYPE_2Byte_int: case PROTO_SECS2_DATA_TYPE_2Byte_char: { u8 offset = (pTxData[0] & 0x03) + 1; // 计算数据偏移 if (pData->DataNum == 1) { // 单个元素 pTxData[offset] = p[1]; // 高位字节 pTxData[offset + 1] = p[0]; // 低位字节 } else { // 多个元素 - 需要批量转换 for (i = 0; i < pData->DataNum; i++) { pTxData[offset + i*2] = p[i*2 + 1]; pTxData[offset + i*2 + 1] = p[i*2]; } } }break; /* 4字节类型 - 需要字节序转换 */ case PROTO_SECS2_DATA_TYPE_4Byte_uint: case PROTO_SECS2_DATA_TYPE_4Byte_float: case PROTO_SECS2_DATA_TYPE_4Byte_int: { u8 offset = (pTxData[0] & 0x03) + 1; // 计算数据偏移 if (pData->DataNum == 1) { // 单个元素 pTxData[offset] = p[3]; pTxData[offset + 1] = p[2]; pTxData[offset + 2] = p[1]; pTxData[offset + 3] = p[0]; } else { // 多个元素 - 需要批量转换 for (i = 0; i < pData->DataNum; i++) { pTxData[offset + i*4] = p[i*4 + 3]; pTxData[offset + i*4 + 1] = p[i*4 + 2]; pTxData[offset + i*4 + 2] = p[i*4 + 1]; pTxData[offset + i*4 + 3] = p[i*4]; } } }break; /* 8字节类型 - 需要字节序转换 */ case PROTO_SECS2_DATA_TYPE_8Byte_uint: case PROTO_SECS2_DATA_TYPE_8Byte_float: case PROTO_SECS2_DATA_TYPE_8Byte_int: { u8 offset = (pTxData[0] & 0x03) + 1; // 计算数据偏移 if (pData->DataNum == 1) { // 单个元素 for (i = 0; i < 8; i++) { pTxData[offset + i] = p[7 - i]; } } else { // 多个元素 - 需要批量转换 for (i = 0; i < pData->DataNum; i++) { for (u8 j = 0; j < 8; j++) { pTxData[offset + i*8 + j] = p[i*8 + 7 - j]; } } } }break; } return Byte_Len; }