Files
2026-09-09 14:54:40 +08:00

1421 lines
49 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "proto_SECS2.h"
#include "string.h"
#include "stdio.h"
#include "bsp_DS1302.h"
#include "bsp_Flash.h"
#include "bsp_W5500.h"
#include "proto_modbus_tcp_master.h"
#include "os_timer.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_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);
static void proto_SECS2_Tx_Set_Ask_Task(void);
proto_SECS2_t SECS2 =
{
.Set_Ask.flag = 0,
.Rx_DataAnalysis = proto_SECS2_Rx_Task,
.Tx_Alarm_Task = proto_SECS2_Tx_Alarm_Task,
.Tx_Dev_State_Task = proto_SECS2_Tx_Dev_State_Task,
.Tx_Set_Ask_Task = proto_SECS2_Tx_Set_Ask_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);
}
/**
* @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;
proto_SECS2_MessageData_t MessageData;
u8 list_count;
u8 i;
pHeader_Data->Header_Byte3++; /* 响应 Function 加 1 */
pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0;
u8 has_all = 0;
for (i = 0; i < IndexCount; i++) {
if (pIndexArray[i] == 0xFFFFFFFF) {
has_all = 1;
break;
}
}
/* 辅助宏:只添加数据值(不包含索引) */
#define ADD_VALUE(type, value_ptr, data_num) \
do { \
MessageData.DataType = type; \
MessageData.pData = value_ptr; \
MessageData.DataNum = data_num; \
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData); \
} while(0)
u8 total_items = 0;
if (has_all) {
total_items = 26 + 4 + 1; // 浮点 + 整数 + SN
} else {
for (i = 0; i < IndexCount; i++) {
u32 idx = pIndexArray[i];
if ((idx >= 40050 && idx <= 40100 && ((idx - 40050) % 2 == 0)) ||
(idx >= 40250 && idx <= 40252) ||
(idx == 9527) || (idx == 3001)) {
total_items++;
}
}
}
/* 外层列表 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = total_items;
MessageData.pData = &list_count;
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
if (has_all) {
/* 浮点数据 */
for (i = 0; i < 26; i++) {
float val = modbus_tcp.data.float_values[i];
ADD_VALUE(PROTO_SECS2_DATA_TYPE_4Byte_float, &val, 1);
}
/* 整数数据(3个) */
for (i = 0; i < 3; i++) {
u16 val = modbus_tcp.data.int_values[i];
ADD_VALUE(PROTO_SECS2_DATA_TYPE_2Byte_uint, &val, 1);
}
/* SN(9527):从 40253 读取整数并转为字符串 */
ADD_VALUE(PROTO_SECS2_DATA_TYPE_ASCII, modbus_tcp.data.sn_str, strlen(modbus_tcp.data.sn_str));
} else {
for (i = 0; i < IndexCount; i++) {
u32 idx = pIndexArray[i];
if (idx == 9527) {
ADD_VALUE(PROTO_SECS2_DATA_TYPE_ASCII, modbus_tcp.data.sn_str, strlen(modbus_tcp.data.sn_str));
}
else if (idx >= 40050 && idx <= 40100 && ((idx - 40050) % 2 == 0)) {
u8 float_idx = (idx - 40050) / 2;
if (float_idx < 26) {
float val = modbus_tcp.data.float_values[float_idx];
ADD_VALUE(PROTO_SECS2_DATA_TYPE_4Byte_float, &val, 1);
}
}
else if (idx >= 40250 && idx <= 40252) {
u8 int_idx = idx - 40250;
u16 val = modbus_tcp.data.int_values[int_idx];
ADD_VALUE(PROTO_SECS2_DATA_TYPE_2Byte_uint, &val, 1);
}
else if(idx == 3001)/*设备状态查询*/
{
ADD_VALUE(PROTO_SECS2_DATA_TYPE_2Byte_uint,&modbus_tcp.status_ctx.device_status,1);
}
/* 其他索引忽略(不添加到列表) */
}
}
#undef ADD_VALUE
proto_SECS2_Send(pHeader_Data, Tx, TxLen);
}
void proto_SECS2_Tx_S2F49(proto_HSMS_Header_Data_t *pHeader_Data, void *pData, u16 Len)
{
u8 list_count = 0;
char empty_ascii_1[] = "";
u8 *Tx = proto_SECS2_Tx_Buffer, TxLen = 0;
u8 Tx_Data = (u8)pData;
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);
MessageData.DataType = PROTO_SECS2_DATA_TYPE_Binary;
MessageData.pData = (void *)(&Tx_Data);
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
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);
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)&empty_ascii_1;
MessageData.DataNum = strlen(empty_ascii_1);
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)&empty_ascii_1;
MessageData.DataNum = strlen(empty_ascii_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);
/*软件版本号 */
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;
u8 data_id = 0;
u32 alarm_all = 111101;
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 *)&data_id;
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 *)&alarm_all;
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 = 2329004;
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), "%u", 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[40];
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] = "";
u8 empty_uint1 = 3;
u8 empty_uint2 = 1;
char fixed_ascii[2] = "1";
char fixed_ip[] = "IDS_16403_ALERT_61411";
char begin_warning[6] = "Begin";
char end_warning[6] = "End";
char device_type[6] = "PUMP";
char fixed_value1[] = "Over Trigger(High)";
char fixed_value2[] = "Equipment";
char fixed_value3[] = "{e957e31d-3e46-4a66-a6ab-144c0b71d400}";
// 设置报警ID和描述
if (90 == index && 1 == is_alarm) {
// 特殊:离线报警(仅用于设备状态,但也可保留)
alarm_id_to_send = 90;
snprintf(alarm_description, sizeof(alarm_description), "%s", "SCRUBBER Offline");
strncpy(alarm_type, "Major Alarm", sizeof(alarm_type));
} else if (is_alarm) {
// 普通报警:index 0~23
alarm_id_to_send = index;
const char *desc = (index < 24) ? proto_modbus_master_alarm[index] : "Unknown Alarm";
snprintf(alarm_description, sizeof(alarm_description), "%s", desc);
strncpy(alarm_type, "Major Alarm", sizeof(alarm_type));
} else {
// 警告:index 0~63
alarm_id_to_send = 24 + index;
const char *desc = (index < 65) ? proto_modbus_master_warning[index] : "Unknown Warning";
snprintf(alarm_description, sizeof(alarm_description), "%s", desc);
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占位改为传文档固定值*/
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.W5500_Class[0].ConfigData.Port[0] << 8) | W5500.W5500_Class[0].ConfigData.Port[1]);
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)fixed_ip;
MessageData->DataNum = strlen(fixed_ip);
*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 *)fixed_value1;
MessageData->DataNum = strlen(fixed_value1);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 8. Equipment 传文档固定值*/
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)fixed_value2;
MessageData->DataNum = strlen(fixed_value2);
*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 *)fixed_value3;
MessageData->DataNum = strlen(fixed_value3);
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 11. 设备类型 */
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);
/* 12. Sensor名称 -使用报警索引表示传感器名称 */
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);
/* 13. 报警值 - 置3 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&empty_uint1;
MessageData->DataNum = 1;
*TxLen += proto_HSMS_AddData(&Tx[*TxLen], MessageData);
/* 14. 报警单位 - 置1 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_4Byte_uint;
MessageData->pData = (void *)&empty_uint2;
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. 报警类型 (策略报警/机台报警) - 置1 */
MessageData->DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData->pData = (void *)fixed_ascii;
MessageData->DataNum = 1;
*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);
}
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);
/*Binary 0*/
u8 bool_value = 0;
MessageData.DataType = PROTO_SECS2_DATA_TYPE_Binary;
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 *)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 *)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;
proto_SECS2_MessageData_t MessageData;
pHeader_Data->Header_Byte3++;
pHeader_Data->Header_Byte2.Analysis_Data.Wait = 0;
MessageData.DataType = PROTO_SECS2_DATA_TYPE_Binary;
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,u8 device_status, u16 Len)
{
u8 *Tx = proto_SECS2_Tx_Buffer;
u16 TxLen = 0;
u8 list_count;
char temp_buffer[5] = "";
// 构建状态字符串
char status_buffer[20] = "";
char time_string[17]; // 16位时间字符串 + 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);
/* 第五层列表:6个元素 */
MessageData.DataType = PROTO_SECS2_DATA_TYPE_List;
list_count = 6;
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. 附属设备类型 */
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);
/* 4. 附属设备状态 */
sprintf(temp_buffer, "%d", device_status);
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)&temp_buffer;
MessageData.DataNum = 1;
TxLen += proto_HSMS_AddData(&Tx[TxLen], &MessageData);
/* 5. 状态切换成功时间 - 从DS1302获取 */
DS1302.GetTimeWithMs(time_string, sizeof(time_string));
MessageData.DataType = PROTO_SECS2_DATA_TYPE_ASCII;
MessageData.pData = (void *)&time_string;
MessageData.DataNum = strlen(time_string); // 16位时间字符串长度
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);
/* 将发送数据拼接到HSMS后面 */
proto_SECS2_Send(pHeader_Data, Tx, TxLen);
}
/*警报主动上传*/
static void proto_SECS2_Tx_Alarm_Task(void)
{
static u32 Sys_Byte;
/*1s判断一次*/
if (TIME_TRUE == OsTimer_CheckTimeOut(modbus_tcp.alarm_ctx.alarm_task_tick, osTime_MSecTick, 1000))
{
modbus_tcp.alarm_ctx.alarm_task_tick = osTime_MSecTick;
// ----- 读取报警位(24位)-----
u64 alarm_now = ((u64)(modbus_tcp.data.reg_status[2] & 0xFF) << 0) |
((u64)modbus_tcp.data.reg_status[3] << 8);
// ----- 读取警告位(64位)-----
u64 warning_now = ((u64)modbus_tcp.data.reg_status[4] << 0) |
((u64)modbus_tcp.data.reg_status[5] << 16) |
((u64)modbus_tcp.data.reg_status[6] << 32) |
((u64)modbus_tcp.data.reg_status[7] << 48);
warning_now &= ~((u64)0xFC << 48);/*清除bit2,3,4,5,6,7这些是状态控制*/
u64 changed_alarm = alarm_now ^ modbus_tcp.alarm_ctx.alarm_status_last;
u64 changed_warning = warning_now ^ modbus_tcp.alarm_ctx.warning_status_last;
u32 now_sec = DS1302.GetCurrentSeconds();
char now_str[17];
DS1302.GetTimeWithMs(now_str, sizeof(now_str));
proto_HSMS_Header_Data_t Header;
Header.Device_Id = HSMS.Flash_ConfigData.Device_Id;
Header.Header_Byte2.Analysis_Data.Stream = 6;
Header.Header_Byte2.Analysis_Data.Wait = PROTO_ALARM_CHANGE_RX_WAIT;
Header.Header_Byte3 = 11;
Header.PType = proto_HSMS_PTYPE_SECS2;
Header.SType = PROTO_HSMS_STYPE_Data_Message;
/*处于PM状态时不上传报警,但更新状态*/
u8 pm_status = (modbus_tcp.data.reg_status[0] >> 8) & PROTO_MODBUS_DEVICE_STATUS_PM;
if(pm_status == PROTO_MODBUS_DEVICE_STATUS_PM)
{
modbus_tcp.alarm_ctx.pm_status = PROTO_MODBUS_MASTER_MODE_PM;
modbus_tcp.alarm_ctx.alarm_status_last = alarm_now;
modbus_tcp.alarm_ctx.warning_status_last = warning_now;
return;
}else
{
modbus_tcp.alarm_ctx.pm_status = 0;
}
/*处理离线报警*/
if(modbus_tcp.alarm_ctx.offline != modbus_tcp.alarm_ctx.last_offline_state)
{
if(modbus_tcp.alarm_ctx.offline == 1 && modbus_tcp.alarm_ctx.last_offline_state == 0)/*在线->离线*/
{
modbus_tcp.alarm_ctx.offline_start_sec = now_sec;
strcpy(modbus_tcp.alarm_ctx.offline_start_str,now_str);
pSECS2->sys_count++;
Header.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header, 90, 1, now_str, 0);
}else if(modbus_tcp.alarm_ctx.offline == 0 && modbus_tcp.alarm_ctx.last_offline_state == 1)
{
u32 duration = now_sec - modbus_tcp.alarm_ctx.offline_start_sec;
pSECS2->sys_count++;
Header.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header, 90, 1, modbus_tcp.alarm_ctx.offline_start_str, duration);
memset(modbus_tcp.alarm_ctx.offline_start_str,0,15);
modbus_tcp.alarm_ctx.offline_start_sec = 0;
}
modbus_tcp.alarm_ctx.last_offline_state = modbus_tcp.alarm_ctx.offline;
}
if (changed_alarm == 0 && changed_warning == 0) {
modbus_tcp.alarm_ctx.alarm_status_last = alarm_now;
modbus_tcp.alarm_ctx.warning_status_last = warning_now;
return;
}
static u8 alarm_active = 0;
// ----- 处理报警(24个)-----
for (u8 i = 0; i < 24; i++) {
if (changed_alarm & ((u64)1 << i)) {
if (alarm_now & ((u64)1 << i)) { // 激活
alarm_active += 1;
strcpy(modbus_tcp.alarm_ctx.alarm_start_str[i], now_str);
modbus_tcp.alarm_ctx.alarm_start_sec[i] = now_sec;
pSECS2->sys_count++;
Header.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header, i, 1, now_str, 0);
} else { // 消失
if(alarm_active >= 1)
{
alarm_active -= 1;
}
u32 duration = now_sec - modbus_tcp.alarm_ctx.alarm_start_sec[i];
pSECS2->sys_count++;
Header.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header, i, 1,
modbus_tcp.alarm_ctx.alarm_start_str[i], duration);
// 清空记录
modbus_tcp.alarm_ctx.alarm_start_str[i][0] = '\0';
modbus_tcp.alarm_ctx.alarm_start_sec[i] = 0;
}
}
}
// ----- 处理警告(64个)-----
for (u8 i = 0; i < 64; i++) {
if (changed_warning & ((u64)1 << i)) {
if (warning_now & ((u64)1 << i)) { // 激活
strcpy(modbus_tcp.alarm_ctx.warning_start_str[i], now_str);
modbus_tcp.alarm_ctx.warning_start_sec[i] = now_sec;
pSECS2->sys_count++;
Header.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header, i, 0, now_str, 0);
} else { // 消失
u32 duration = now_sec - modbus_tcp.alarm_ctx.warning_start_sec[i];
pSECS2->sys_count++;
Header.Sys_Byte = pSECS2->sys_count;
proto_SECS2_Tx_S6F11(&Header, i, 0,
modbus_tcp.alarm_ctx.warning_start_str[i], duration);
modbus_tcp.alarm_ctx.warning_start_str[i][0] = '\0';
modbus_tcp.alarm_ctx.warning_start_sec[i] = 0;
}
}
}
// 更新缓存
modbus_tcp.alarm_ctx.alarm_status_last = alarm_now;
modbus_tcp.alarm_ctx.warning_status_last = warning_now;
modbus_tcp.alarm_ctx.alarm = alarm_active > 0?PROTO_MODBUS_MASTER_MODE_ALARM:PROTO_MODBUS_MASTER_MODE_RUN;
}
}
/*设备状态*/
static void proto_SECS2_Tx_Dev_State_Task(void)
{
/*1s判断一次*/
if (TIME_TRUE == OsTimer_CheckTimeOut(modbus_tcp.status_ctx.status_task_tick, osTime_MSecTick, 1000))
{
modbus_tcp.status_ctx.status_task_tick = osTime_MSecTick;
u8 device_status = PROTO_MODBUS_MASTER_MODE_IDLE; // 默认空闲
u16 reg = modbus_tcp.data.reg_status[7]; // 40007 寄存器
// ----- 按优先级判断状态 -----
// 1. 离线(由 alarm_ctx.offline 标识)
if (modbus_tcp.alarm_ctx.offline) {
device_status = PROTO_MODBUS_MASTER_MODE_OFFLINE;
}
// 2. PM 状态
else if (modbus_tcp.alarm_ctx.pm_status == PROTO_MODBUS_MASTER_MODE_PM) {
device_status = PROTO_MODBUS_MASTER_MODE_PM;
}
// 3. 报警(有激活的一级报警)
else if (modbus_tcp.alarm_ctx.alarm == PROTO_MODBUS_MASTER_MODE_ALARM) {
device_status = PROTO_MODBUS_MASTER_MODE_ALARM;
}
// 4. IDLE 模式(IDLE开位=1)
else if ((modbus_tcp.data.reg_status[2] >> 8) & (1 << 6)) {
device_status = PROTO_MODBUS_MASTER_MODE_IDLE;
}
// 5. 运行状态:启动位=1 且 停止位=0 且 IDLE关=0,绿灯亮
else if ((modbus_tcp.data.reg_status[2] >> 8) & 2) {
device_status = PROTO_MODBUS_MASTER_MODE_RUN;
}
// 其他情况(如停止位=1,或无效组合)默认视为 IDLE
else {
device_status = PROTO_MODBUS_MASTER_MODE_IDLE;
}
// 保存当前状态到上下文
modbus_tcp.status_ctx.device_status = device_status;
// 检测状态是否变化
if (device_status != modbus_tcp.status_ctx.device_status_last) {
// 发送 S6F11 状态变更消息
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_STATE_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;
// 发送设备状态信息(device_status 直接作为状态值传给发送函数)
proto_SECS2_Tx_Device_S6F11(&Header_Data, NULL, device_status, 0);
// 更新 last 值
modbus_tcp.status_ctx.device_status_last = device_status;
}
// 特别处理离线状态的 last_offline_state(保持同步)
if (modbus_tcp.alarm_ctx.offline != modbus_tcp.alarm_ctx.last_offline_state) {
modbus_tcp.alarm_ctx.last_offline_state = modbus_tcp.alarm_ctx.offline;
}
}
}
/*设备响应*/
static void proto_SECS2_Tx_Set_Ask_Task(void)
{
if(modbus_tcp.alarm_ctx.offline == 1 && pSECS2->Set_Ask.flag != 0)
{
proto_HSMS_Header_Data_t Header_Data;
Header_Data.Device_Id = HSMS.Flash_ConfigData.Device_Id;
Header_Data.Header_Byte2.Analysis_Data.Stream = 2; /*S2*/
Header_Data.Header_Byte2.Analysis_Data.Wait = PROTO_STATE_CHANGE_RX_WAIT;
Header_Data.Header_Byte3 = 49; /*F49*/
Header_Data.PType = proto_HSMS_PTYPE_SECS2;
Header_Data.SType = PROTO_HSMS_STYPE_Data_Message;
Header_Data.Sys_Byte = pSECS2->Set_Ask.sys_count;
proto_SECS2_Tx_S2F49(&Header_Data, 1, 0);
pSECS2->Set_Ask.flag = 0;
modbus_tcp.write_result = 0;
}
if(modbus_tcp.write_pending == 2 || modbus_tcp.write_pending == 0)
{
return;
}
proto_HSMS_Header_Data_t Header_Data;
Header_Data.Device_Id = HSMS.Flash_ConfigData.Device_Id;
Header_Data.Header_Byte2.Analysis_Data.Stream = 2; /*S2*/
Header_Data.Header_Byte2.Analysis_Data.Wait = PROTO_STATE_CHANGE_RX_WAIT;
Header_Data.Header_Byte3 = 49; /*F49*/
Header_Data.PType = proto_HSMS_PTYPE_SECS2;
Header_Data.SType = PROTO_HSMS_STYPE_Data_Message;
Header_Data.Sys_Byte = pSECS2->Set_Ask.sys_count;
/*0为成功,1为失败*/
if(modbus_tcp.write_result == 1 && pSECS2->Set_Ask.flag == 1)
{
proto_SECS2_Tx_S2F49(&Header_Data, 0, 0);
pSECS2->Set_Ask.flag = 0;
modbus_tcp.write_result = 0;
}else if(modbus_tcp.write_result == 1 && pSECS2->Set_Ask.flag == 2)
{
proto_SECS2_Tx_S2F49(&Header_Data, 0, 0);
pSECS2->Set_Ask.flag = 0;
modbus_tcp.write_result = 0;
}else if(modbus_tcp.write_result == 1 && pSECS2->Set_Ask.flag == 3)
{
proto_SECS2_Tx_S2F49(&Header_Data, 0, 0);
pSECS2->Set_Ask.flag = 0;
modbus_tcp.write_result = 0;
}else if(modbus_tcp.write_result == 1 && pSECS2->Set_Ask.flag == 4 )
{
proto_SECS2_Tx_S2F49(&Header_Data, 0, 0);
pSECS2->Set_Ask.flag = 0;
modbus_tcp.write_result = 0;
}else if(modbus_tcp.write_result == 0 && pSECS2->Set_Ask.flag != 0)
{
proto_SECS2_Tx_S2F49(&Header_Data, 1, 0);
pSECS2->Set_Ask.flag = 0;
modbus_tcp.write_result = 0;
}
}
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 *pCmdData;
char pText[11];
/*Device Status*/
pCmdData = proto_SECS2_Rx_MessageData[3].pData;
snprintf(pText, 11, "%s", pCmdData);
if (0 == strncmp(pText, DEVICE_START, strlen(DEVICE_START)))
{
modbus_tcp.write(CONTROL_BIT_START);
pSECS2->Set_Ask.flag = 1;
}
else if (0 == strncmp(pText, DEVICE_STOP, strlen(DEVICE_STOP)))
{
modbus_tcp.write(CONTROL_BIT_STOP);
pSECS2->Set_Ask.flag = 2;
}
else if (0 == strncmp(pText, DEVICE_IDLE_OPEN, strlen(DEVICE_IDLE_OPEN)))
{
modbus_tcp.write(CONTROL_BIT_IDLE_OPEN);
pSECS2->Set_Ask.flag = 3;
}
else if (0 == strncmp(pText, DEVICE_IDLE_CLOSE, strlen(DEVICE_IDLE_CLOSE)))
{
modbus_tcp.write(CONTROL_BIT_IDLE_CLOSE);
pSECS2->Set_Ask.flag = 4;
}
else /*错误指令*/
{
proto_SECS2_Tx_S2F49(pHeader_Data, 0, 0);
return;
}
pSECS2->Set_Ask.sys_count = pSECS2->sys_count;
}
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)
{
u8 *pMessageData = proto_SECS2_Rx_MessageData[0].pData;
u16 year = 2000 + (u16)(pMessageData[2] - '0') * 10 + (u16)(pMessageData[3] - '0');
u8 month = (u16)(pMessageData[4] - '0') * 10 + (u16)(pMessageData[5] - '0');
u8 day = (u16)(pMessageData[6] - '0') * 10 + (u16)(pMessageData[7] - '0');
u8 hour = (u16)(pMessageData[8] - '0') * 10 + (u16)(pMessageData[9] - '0');
u8 min = (u16)(pMessageData[10] - '0') * 10 + (u16)(pMessageData[11] - '0');
u8 sec = (u16)(pMessageData[12] - '0') * 10 + (u16)(pMessageData[13] - '0');
u32 ms = 0;
ms = (u32)(pMessageData[14] - '0') * 10 + (u32)(pMessageData[15] - '0');
if (DS1302.SetTimeWithMs(year,month,day,hour,min,sec,ms)) /*时间返回*/
{
/* 时间设置成功 */
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;
}