1915 lines
72 KiB
C
1915 lines
72 KiB
C
#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;i<MessageDataNum;i++)
|
||
{
|
||
switch(proto_SECS2_Rx_MessageData[i].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 :
|
||
case PROTO_SECS2_DATA_TYPE_ASCII :
|
||
{
|
||
memcpy(&proto_SECS2_Rx_MessageDataBuffer[LenIndex],
|
||
proto_SECS2_Rx_MessageData[i].pData,
|
||
proto_SECS2_Rx_MessageData[i].ByteLen);
|
||
proto_SECS2_Rx_MessageData[i].DataNum = proto_SECS2_Rx_MessageData[i].ByteLen;
|
||
proto_SECS2_Rx_MessageData[i].pData = &proto_SECS2_Rx_MessageDataBuffer[LenIndex];
|
||
LenIndex += proto_SECS2_Rx_MessageData[i].ByteLen;
|
||
}break;
|
||
|
||
case PROTO_SECS2_DATA_TYPE_2Byte_uint :
|
||
case PROTO_SECS2_DATA_TYPE_2Byte_int :
|
||
case PROTO_SECS2_DATA_TYPE_2Byte_char :
|
||
{
|
||
u8 *p = proto_SECS2_Rx_MessageData[i].pData;
|
||
for(k = 0;k<2;k++)
|
||
{
|
||
proto_SECS2_Rx_MessageDataBuffer[LenIndex + k] = p[1 - k];
|
||
}
|
||
proto_SECS2_Rx_MessageData[i].DataNum = proto_SECS2_Rx_MessageData[i].ByteLen / 2;
|
||
proto_SECS2_Rx_MessageData[i].pData = &proto_SECS2_Rx_MessageDataBuffer[LenIndex];
|
||
LenIndex += proto_SECS2_Rx_MessageData[i].ByteLen;
|
||
}break;
|
||
|
||
case PROTO_SECS2_DATA_TYPE_4Byte_uint :
|
||
case PROTO_SECS2_DATA_TYPE_4Byte_float :
|
||
case PROTO_SECS2_DATA_TYPE_4Byte_int :
|
||
{
|
||
u8 *p = proto_SECS2_Rx_MessageData[i].pData;
|
||
for(k = 0;k<4;k++)
|
||
{
|
||
proto_SECS2_Rx_MessageDataBuffer[LenIndex + k] = p[3 - k];
|
||
}
|
||
|
||
proto_SECS2_Rx_MessageData[i].DataNum = proto_SECS2_Rx_MessageData[i].ByteLen / 4;
|
||
proto_SECS2_Rx_MessageData[i].pData = &proto_SECS2_Rx_MessageDataBuffer[LenIndex];
|
||
LenIndex += proto_SECS2_Rx_MessageData[i].ByteLen;
|
||
}break;
|
||
|
||
case PROTO_SECS2_DATA_TYPE_8Byte_uint :
|
||
case PROTO_SECS2_DATA_TYPE_8Byte_float :
|
||
case PROTO_SECS2_DATA_TYPE_8Byte_int :
|
||
{
|
||
u8 *p = proto_SECS2_Rx_MessageData[i].pData;
|
||
for(k = 0;k<8;k++)
|
||
{
|
||
proto_SECS2_Rx_MessageDataBuffer[LenIndex + k] = p[7 - k];
|
||
}
|
||
|
||
proto_SECS2_Rx_MessageData[i].DataNum = proto_SECS2_Rx_MessageData[i].ByteLen / 8;
|
||
proto_SECS2_Rx_MessageData[i].pData = &proto_SECS2_Rx_MessageDataBuffer[LenIndex];
|
||
LenIndex += proto_SECS2_Rx_MessageData[i].ByteLen;
|
||
}break;
|
||
|
||
default:
|
||
/* 其他类型不处理 */
|
||
break;
|
||
}
|
||
}
|
||
return MessageDataNum;
|
||
}
|
||
|
||
|
||
|
||
static u16 proto_HSMS_AddData(u8 *pTxData,proto_SECS2_MessageData_t *pData)
|
||
{
|
||
u8 *p, i;
|
||
u16 Byte_Len = 0;
|
||
u16 data_length;
|
||
p = (u8 *)pData->pData;
|
||
|
||
/* 计算数据字节长度 */
|
||
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;
|
||
}
|