Initial commit: my SECS2 project

This commit is contained in:
2026-06-12 14:19:01 +08:00
commit 2c3e2c4dc2
1138 changed files with 603966 additions and 0 deletions

274
usr/protocol/proto_CS200.c Normal file
View File

@@ -0,0 +1,274 @@
#include "proto_CS200.h"
#include "proto_Modbus.h"
#include "stdio.h"
#include "string.h"
#include "bsp_Uart.h"
/*CS200<30><30><EFBFBD><EFBFBD>*/
#define CS200_RANGE (2.0)
#define CS200_RANGE_START (0x4000)
#define CS200_RANGE_END (0xC000)
#define CS200_MODBUS_ADDR_GetCurrentData (0x00)
#define CS200_MODBUS_ADDR_SetFlow (0x02)
static void proto_CS200_Init(void);
static void proto_CS200_Tx_Task(void);
static void proto_CS200_Rx_Task(u8 *pData,u16 Len);
static void proto_SetFlow_1(float Value);
static void proto_SetFlow_2(float Value);
proto_CS200_t CS200 =
{
.ID_1 = 32,
.ID_2 = 33,
.Init = proto_CS200_Init,
.Tx_Task = proto_CS200_Tx_Task,
.Rx_Task = proto_CS200_Rx_Task,
.SetFlow_1 = proto_SetFlow_1,
.SetFlow_2 = proto_SetFlow_2,
};
static proto_CS200_t *pCS200 = &CS200;
static void proto_CS200_Init(void)
{
COM_Uart1.Rx_DataAnalysis = pCS200 ->Rx_Task;
}
static void proto_CS200_Send(u8 *pData,u16 Len)
{
COM_Uart1.Send(&COM_Uart1,pData,Len);
}
/*<2A><><EFBFBD><EFBFBD>*/
static void proto_SetFlow_1(float Value)
{
float FlowRange;
if(0 == pCS200->CurrentData[0].Range_u16)
{
FlowRange = CS200_RANGE;
}
else
{
FlowRange = pCS200->CurrentData[0].Range_u16 / 1000.0;
}
pCS200->SetFlowValue_1 = CS200_RANGE_START + (float)(CS200_RANGE_END - CS200_RANGE_START) * Value / FlowRange;
}
static void proto_SetFlow_2(float Value)
{
float FlowRange;
if(0 == pCS200->CurrentData[1].Range_u16)
{
FlowRange = CS200_RANGE;
}
else
{
FlowRange = pCS200->CurrentData[1].Range_u16 / 1000.0;
}
pCS200->SetFlowValue_2 = CS200_RANGE_START + (float)(CS200_RANGE_END - CS200_RANGE_START) * Value / FlowRange;
}
/*<2A><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>*/
static void proto_CS200_Tx_GetCurrentData(u8 ID)
{
u16 Addr = CS200_MODBUS_ADDR_GetCurrentData;
u8 Len = 14;
ModbusReadData(ID,Addr,Len,proto_CS200_Send);
}
static void proto_CS200_Tx_SetFlow_1(void)
{
u16 Addr = CS200_MODBUS_ADDR_SetFlow;
u8 Len = 1;
u16 Data[1]= {pCS200->SetFlowValue_1};
ModbusyWriteOnlData(pCS200->ID_1,Addr,*Data,proto_CS200_Send);
}
static void proto_CS200_Tx_SetFlow_2(void)
{
u16 Addr = CS200_MODBUS_ADDR_SetFlow;
u8 Len = 1;
u16 Data[1]= {pCS200->SetFlowValue_2};
ModbusyWriteOnlData(pCS200->ID_2,Addr,*Data,proto_CS200_Send);
}
static void proto_CS200_Rx_Task(u8 *pData,u16 Len)
{
u8 SendTimeFlag = 0;
u8 ModbusID,CMD;
u16 CheckCRC16,ModbusCrc;
u16 Addr,Data;
u32 u32Temp;
float FlowTemp;
proto_CS2000_CurrentData_t *pCurrentData;
ModbusID = *pData;
CMD = *(pData+1);
CheckCRC16 = pData[Len-2] << 8 | pData[Len-1];
if(ModbusID == pCS200->ID_1)
{
pCurrentData = &pCS200->CurrentData[0];
}
else if(ModbusID == pCS200->ID_2)
{
pCurrentData = &pCS200->CurrentData[1];
}
else
{
return;
}
pCS200->TimeCount = 0;
if(CMD != 0x03 &&CMD != 0x04 && CMD != 0x06 && CMD != 0x10) return ;
ModbusCrc = ModbusCrc16(pData,Len-2);
ModbusCrc = (ModbusCrc >> 8) | (ModbusCrc << 8);
if(CheckCRC16 != ModbusCrc) return ;
switch(pCS200->State)
{
case CS200_STATE_Init:
{
pCS200->State = CS200_STATE_GetCurrentData;
}break;
case CS200_STATE_GetCurrentData:
{
pCurrentData->ID = pData[3 ] << 8 | pData[4 ];
pCurrentData->BaudRate = pData[5 ] << 8 | pData[6 ];
pCurrentData->SetFlow = pData[7 ] << 8 | pData[8 ];
pCurrentData->Flow = pData[9] << 8 | pData[10];
pCurrentData->Range_u16 = pData[11] << 8 | pData[12]; //<2F><>λml
pCurrentData->ValveCmd = pData[13] << 8 | pData[14];
u32Temp = pData[15] << 24 | pData[16] << 16 | pData[17] << 8 | pData[18] << 8;
pCurrentData->SumFlow = *((float *)&u32Temp);
pCurrentData->SumFlow_Mode = pData[19] << 8 | pData[20];
pCurrentData->Parity = pData[21] << 8 | pData[22];
pCurrentData->Valve_U = pData[23] << 8 | pData[24];
u32Temp = pData[25] << 24 | pData[26] << 16 | pData[27] << 8 | pData[28] << 8;
pCurrentData->Range_Float = *((float *)&u32Temp);
pCurrentData->SoftStartValue = pData[29] << 8 | pData[30];
FlowTemp = pCurrentData->Flow;
pCurrentData->RealFlow = pCurrentData->Range_u16 / 1000.0 * (FlowTemp - CS200_RANGE_START) / ((float)(CS200_RANGE_END - CS200_RANGE_START));
if(pCS200->SetFlowValue_1 != pCS200->CurrentData[0].SetFlow)
{
pCS200->State = CS200_STATE_SetFlow_1;
pCS200->ReadState = CS200_READ_STATE_ID_1;
}
else if(pCS200->SetFlowValue_2 != pCS200->CurrentData[1].SetFlow)
{
pCS200->State = CS200_STATE_SetFlow_2;
pCS200->ReadState = CS200_READ_STATE_ID_2;
}
SendTimeFlag = 1;
}break;
case CS200_STATE_SetFlow_1:
{
pCS200->State = CS200_STATE_GetCurrentData;
}break;
case CS200_STATE_SetFlow_2:
{
pCS200->State = CS200_STATE_GetCurrentData;
}break;
}
if(SendTimeFlag)
{
return;
}
else
{
pCS200->ErrorFlag &= (~(0x00000001 << pCS200->State));/*<2A><><EFBFBD><EFBFBD><EFBFBD>쳣״̬*/
pCS200->SendTime = 0;
return;
}
}
static void proto_CS200_Tx_Task(void)
{
u8 SendTimeFlag = 0;
if(++pCS200->TimeCount > 50)/*ͨѶ<CDA8><D1B6>ʱ*/
{
memset(&pCS200->CurrentData,0,sizeof(pCS200->CurrentData));
}
switch(pCS200->State)
{
case CS200_STATE_Init:
{
}break;
case CS200_STATE_GetCurrentData:
{
switch(pCS200->ReadState)
{
case CS200_READ_STATE_ID_1:
{
proto_CS200_Tx_GetCurrentData(pCS200->ID_1);
pCS200->ReadState = CS200_READ_STATE_ID_2;
}break;
case CS200_READ_STATE_ID_2:
{
proto_CS200_Tx_GetCurrentData(pCS200->ID_2);
pCS200->ReadState = CS200_READ_STATE_ID_1;
}break;
default:
{
proto_CS200_Tx_GetCurrentData(pCS200->ID_1);
pCS200->ReadState = CS200_READ_STATE_ID_2;
}break;
}
SendTimeFlag = 1;
}break;
case CS200_STATE_SetFlow_1:
{
proto_CS200_Tx_SetFlow_1();
}break;
case CS200_STATE_SetFlow_2:
{
proto_CS200_Tx_SetFlow_2();
}break;
default:
{
}break;
}
if(SendTimeFlag)
{
return ;
}
else
{
pCS200->SendTime++;
if(pCS200->SendTime >= 3)
{
pCS200->ErrorFlag |= (0x00000001 << pCS200->State);/*<2A><>¼<EFBFBD>쳣״̬*/
pCS200->SendTime = 0;
pCS200->State = CS200_STATE_GetCurrentData;
}
}
}

View File

@@ -0,0 +1,58 @@
#ifndef _PROTO_CS200_H_
#define _PROTO_CS200_H_
#include "main.h"
#include "proto_Modbus.h"
#define CS200_STATE_Init 0
#define CS200_STATE_GetCurrentData 1
#define CS200_STATE_SetFlow_1 2
#define CS200_STATE_SetFlow_2 3
#define CS200_READ_STATE_ID_1 0
#define CS200_READ_STATE_ID_2 1
typedef struct
{
u8 ID;
u16 BaudRate;
u16 SetFlow;
u16 Flow;
u16 Range_u16;
u8 ValveCmd;
float SumFlow; //<2F>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD><EFBFBD>
u8 SumFlow_Mode; //<2F>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD><EFBFBD>ģʽ
u8 Parity; //У<><D0A3>λ
u16 Valve_U; //<2F><><EFBFBD><EFBFBD>ѹ
float Range_Float;
float SoftStartValue; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
float RealFlow; //ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}proto_CS2000_CurrentData_t;
typedef struct
{
proto_CS2000_CurrentData_t CurrentData[2];
u16 ErrorFlag;
u8 SendTime;
u8 TimeCount;
u8 ID_1,ID_2;
u8 State;
u8 ReadState;
u16 SetFlowValue_1;
u16 SetFlowValue_2;
void (*Init)(void);
void (*Tx_Task)(void);
void (*Rx_Task)(u8 *,u16);
void (*SetFlow_1)(float);
void (*SetFlow_2)(float);
}proto_CS200_t;
extern proto_CS200_t CS200;
#endif

169
usr/protocol/proto_HSMS.c Normal file
View File

@@ -0,0 +1,169 @@
#include "proto_HSMS.h"
#include "string.h"
#include "stdio.h"
#include "bsp_print.h"
#include "bsp_W5500.h"
#include "proto_SECS2.h"
static void proto_HSMS_Init(void);
static void proto_W5500_DataAnalysis(bsp_W5500_Class_t *pW5500_Class,u8 *pData,u16 Len);
static void proto_HSMS_Rx_DataAnalysis(u8 *pData,u16 Len);
static void proto_HSMS_Tx_Rsq(proto_HSMS_Header_Data_t *pHeader_Data,u8 *Tx_Data,u16 Tx_Data_Len,void *OtherData);
u8 proto_HSMS_Tx_Buffer[1024];
proto_HSMS_t HSMS =
{
.Init = proto_HSMS_Init,
.Tx_RsqData = proto_HSMS_Tx_Rsq,
};
proto_HSMS_t *pHSMS = &HSMS;
static void proto_HSMS_Init(void)
{
W5500.W5500_Class[0].Rx_DataAnalysis = proto_W5500_DataAnalysis;
}
static void proto_HSMS_Send(u8 *pData,u16 Len)
{
Debug_UartSend(pData, Len);
W5500.Socket_Send(&W5500.W5500_Class[0],pData,Len);
}
static void proto_W5500_DataAnalysis(bsp_W5500_Class_t *pW5500_Class,u8 *pData,u16 Len)
{
proto_HSMS_Rx_DataAnalysis(pData,Len);
}
/*<2A><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>*/
static void proto_HSMS_Tx_Rsq(proto_HSMS_Header_Data_t *pHeader_Data,u8 *Tx_Data,u16 Tx_Data_Len,void *OtherData)
{
u8 *Tx = proto_HSMS_Tx_Buffer;
u16 Len;
pHeader_Data->Data_Len = 10 + Tx_Data_Len;
u32TOu8(pHeader_Data->Data_Len,Tx,PROTO_HSMS_ENDIAN);
u16TOu8(pHeader_Data->Device_Id,&Tx[4],PROTO_HSMS_ENDIAN);
Tx[6] = pHeader_Data->Header_Byte2.ALL_Data;
Tx[7] = pHeader_Data->Header_Byte3;
Tx[8] = pHeader_Data->PType;
Tx[9] = pHeader_Data->SType;
u32TOu8(pHeader_Data->Sys_Byte,&Tx[10],PROTO_HSMS_ENDIAN);
Len = 14;
if(NULL != Tx_Data && 0 != Tx_Data_Len)
{
memcpy(&Tx[Len],Tx_Data,Tx_Data_Len);
Len += Tx_Data_Len;
}
proto_HSMS_Send(Tx,Len);
Debug_UartSend(Tx,Len);
}
void proto_HSMS_Header_DataAnalysis(proto_HSMS_Header_Data_t *pHeader_Data,u8 *pData)
{
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>н<EFBFBD><D0BD><EFBFBD>*/
pHeader_Data->Data_Len = u8TOu32(&pData[0],PROTO_HSMS_ENDIAN);
pHeader_Data->Device_Id = u8TOu16(&pData[4],PROTO_HSMS_ENDIAN);
pHeader_Data->Header_Byte2.ALL_Data = pData[6];
pHeader_Data->Header_Byte3 = pData[7];
pHeader_Data->PType = pData[8];
pHeader_Data->SType = pData[9];
pHeader_Data->Sys_Byte = u8TOu32(&pData[10],PROTO_HSMS_ENDIAN);
}
void proto_HSMS_Rx_DataAnalysis(u8 *pData,u16 Len)
{
if(Len < 14)/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>*/
return ;
proto_HSMS_Header_DataAnalysis(&pHSMS->Rx_Header_Data,pData);
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>*/
if((pHSMS->Rx_Header_Data.Data_Len + 4) != Len)
{
return ;
}
/*<2A><><EFBFBD><EFBFBD>SECS2<53><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ*/
if(proto_HSMS_PTYPE_SECS2 != pHSMS->Rx_Header_Data.PType)
{
return ;
}
switch(pHSMS->Rx_Header_Data.SType)
{
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ*/
case PROTO_HSMS_STYPE_Data_Message :
{
/*ƥ<><C6A5><EFBFBD>豸ID*/
if(pHSMS->Flash_ConfigData.Device_Id != pHSMS->Rx_Header_Data.Device_Id)
{
return;
}
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
/*ȥ<><C8A5>HSMSͷ<53><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
SECS2.Rx_DataAnalysis(&pHSMS->Tx_Header_Data,&pData[14],Len-14);
}break;
/*ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
case PROTO_HSMS_STYPE_Select_Req :
{
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Select_Rsq;
proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL);
}break;
/*ѡ<><D1A1><EFBFBD><EFBFBD>Ӧ*/
case PROTO_HSMS_STYPE_Select_Rsq :
{
}break;
/*ȡ<><C8A1>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
case PROTO_HSMS_STYPE_Deselect_Req :
{
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Deselect_Rsq;
proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL);
}break;
/*ȡ<><C8A1>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ӧ*/
case PROTO_HSMS_STYPE_Deselect_Rsq :
{
}break;
/*<2A><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
case PROTO_HSMS_STYPE_Linktest_Req :
{
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Linktest_Rsp;
proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL);
}break;
/*<2A><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>Ӧ*/
case PROTO_HSMS_STYPE_Linktest_Rsp :
{
}break;
/*<2A>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>*/
case PROTO_HSMS_STYPE_Reject_Req :
{
}break;
/*<2A>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>*/
case PROTO_HSMS_STYPE_Separate_Req :
{
}break;
default: break;
}
}

63
usr/protocol/proto_HSMS.h Normal file
View File

@@ -0,0 +1,63 @@
#ifndef _PROTO_HSMS_H_
#define _PROTO_HSMS_H_
#include "main.h"
#include "proto_Modbus.h"
#define PROTO_HSMS_ENDIAN BIG_ENDIAN
/*<2A><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD> PType*/
#define proto_HSMS_PTYPE_SECS2 0 /*SECS-II <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ*/
/*<2A><EFBFBD><E1BBB0><EFBFBD><EFBFBD> SType*/
#define PROTO_HSMS_STYPE_Data_Message 0 /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ*/
#define PROTO_HSMS_STYPE_Select_Req 1 /*ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
#define PROTO_HSMS_STYPE_Select_Rsq 2 /*ѡ<><D1A1><EFBFBD><EFBFBD>Ӧ*/
#define PROTO_HSMS_STYPE_Deselect_Req 3 /*ȡ<><C8A1>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
#define PROTO_HSMS_STYPE_Deselect_Rsq 4 /*ȡ<><C8A1>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ӧ*/
#define PROTO_HSMS_STYPE_Linktest_Req 5 /*<2A><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
#define PROTO_HSMS_STYPE_Linktest_Rsp 6 /*<2A><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>Ӧ*/
#define PROTO_HSMS_STYPE_Reject_Req 7 /*<2A>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>*/
#define PROTO_HSMS_STYPE_Separate_Req 9 /*<2A>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>*/
typedef struct
{
u32 Data_Len; /*<2A>ֽڳ<D6BD><DAB3><EFBFBD>*/
u16 Device_Id; /*<2A>Ự/<2F><EFBFBD><E8B1B8>ʶ*/
union
{
struct
{
u8 Stream: 7;
u8 Wait: 1; /*ָ<><D6B8><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD>ظ<EFBFBD>*/
}Analysis_Data;
u8 ALL_Data;
}Header_Byte2;
u8 Header_Byte3; /*ͷ<><CDB7><EFBFBD>ֽ<EFBFBD>3*/
u8 PType; /*<2A><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>*/
u8 SType; /*<2A><EFBFBD><E1BBB0><EFBFBD><EFBFBD>*/
u32 Sys_Byte; /*ϵͳ<CFB5>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ID<49><44>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʱ<EFBFBD>жϣ<D0B6><CFA3><EFBFBD>Ӧʱ<D3A6><CAB1><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>Ϊ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ɲ<EFBFBD><C9B2>ظ<EFBFBD><D8B8><EFBFBD>4<EFBFBD><34><EFBFBD>ֽڣ<D6BD>*/
}proto_HSMS_Header_Data_t;
typedef struct
{
u16 Device_Id; /*<2A>Ự/<2F><EFBFBD><E8B1B8>ʶ*/
}proto_HSMS_Flash_Data_t;
typedef struct
{
proto_HSMS_Header_Data_t Rx_Header_Data; /*<2A><><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
proto_HSMS_Header_Data_t Tx_Header_Data; /*<2A><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
proto_HSMS_Flash_Data_t Flash_ConfigData; /*<2A><><EFBFBD><EFBFBD>Flash<73><68><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>*/
void (*Init)(void);
void (*Tx_RsqData)(proto_HSMS_Header_Data_t *,u8 *,u16 ,void *);
}proto_HSMS_t;
extern proto_HSMS_t HSMS;
#endif

294
usr/protocol/proto_Modbus.c Normal file
View File

@@ -0,0 +1,294 @@
#include "proto_Modbus.h"
#include "stdio.h"
#include "string.h"
#include "bsp_Uart.h"
u16 ModbusCrc16(u8 *pData, u16 Len)
{
u16 CRC_16 = 0xffff;
u16 i;
while(Len--)
{
CRC_16 = CRC_16^(*pData++);
for(i=0; i++<8; )
{
if(CRC_16&0x0001)
{
CRC_16 = (CRC_16>>1)^0xa001;
}
else
{
CRC_16>>=1;
}
}
}
return CRC_16;
}
/******************************************
* <20><><EFBFBD><EFBFBD>: Float2u16
* <20><><EFBFBD><EFBFBD>: <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>16<31><36><EFBFBD><EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: FloatData : Ҫת<D2AA><D7AA><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>
HorL : <20><><EFBFBD>ظ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD>ĸ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: <20><>
******************************************/
u16 FloatTOu16(float FloatData,u8 HorL)
{
u16 Temp = 0XFFFF;
if(HorL == U16_DATA_L)
{
Temp = *((u32 *)&FloatData) & 0x0000ffff;
}
else if(HorL == U16_DATA_H)
{
Temp = ((*((u32 *)&FloatData)) >> 16) & 0x0000ffff;
}
return Temp;
}
/******************************************
* <20><><EFBFBD><EFBFBD>: u32TOu16
* <20><><EFBFBD><EFBFBD>: <20><>ȡu32<33>ĸ<EFBFBD>16<31><36><EFBFBD><EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: u32Data : Ҫת<D2AA><D7AA><EFBFBD><EFBFBD>u32
HorL : <20><><EFBFBD>ظ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD>ĸ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
* <20><><EFBFBD><EFBFBD>: <20><>
******************************************/
u16 u32TOu16(u32 u32Data,u8 HorL)
{
u16 Temp = 0XFFFF;
if(HorL == U16_DATA_L)
{
Temp = u32Data & 0x0000ffff;
}
else if(HorL == U16_DATA_H)
{
Temp = (u32Data >> 16) & 0x0000ffff;
}
return Temp;
}
void u32TOu8(u32 u32Data,u8 *pData,u8 Endian)
{
if(BIG_ENDIAN == Endian)
{
for(u8 i = 0;i < 4;i++)
{
pData[i] = (u32Data >> (8 * (3 - i))) & 0xff;
}
}
else if(LITTLE_ENDIAN == Endian)
{
for(u8 i = 0;i < 4;i++)
{
pData[i] = (u32Data >> (8 * i)) & 0xff;
}
}
}
void u16TOu8(u16 u16Data,u8 *pData,u8 Endian)
{
if(BIG_ENDIAN == Endian)
{
for(u8 i = 0;i < 2;i++)
{
pData[i] = (u16Data >> (8 * (1 - i))) & 0xff;
}
}
else if(LITTLE_ENDIAN == Endian)
{
for(u8 i = 0;i < 2;i++)
{
pData[i] = (u16Data >> (8 * i)) & 0xff;
}
}
}
float u32TOFloat(u32 u32Data,u8 HorL)
{
float Temp = 0;
Temp = *((float *)&u32Data);
return Temp;
}
/*<2A><>u8Endian<61><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p_u8Dataת<61><D7AA>Ϊ<EFBFBD><CEAA>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>С<EFBFBD><D0A1><EFBFBD><EFBFBD>*/
u32 u8TOu32(u8 *p_u8Data,u8 u8Endian)
{
u32 Temp = 0;
if(BIG_ENDIAN == u8Endian)
{
for(u8 i = 0;i < 4;i++)
{
Temp |= p_u8Data[i] << ((3 - i) * 8);
}
}
else if(LITTLE_ENDIAN == u8Endian)
{
for(u8 i = 0;i < 4;i++)
{
Temp |= p_u8Data[i] << (i * 8);
}
}
return Temp;
}
/*<2A><>u8Endian<61><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p_u8Dataת<61><D7AA>Ϊ<EFBFBD><CEAA>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>С<EFBFBD><D0A1><EFBFBD><EFBFBD>*/
u16 u8TOu16(u8 *p_u8Data,u8 u8Endian)
{
u32 Temp = 0;
if(BIG_ENDIAN == u8Endian)
{
for(u8 i = 0;i < 2;i++)
{
Temp |= p_u8Data[i] << ((1 - i) * 8);
}
}
else if(LITTLE_ENDIAN == u8Endian)
{
for(u8 i = 0;i < 2;i++)
{
Temp |= p_u8Data[i] << (i * 8);
}
}
return Temp;
}
/*<2A>ֽڶ<D6BD><DAB6><EFBFBD>ת<EFBFBD><D7AA>*/
u32 u32_EndianConv(u32 Data)
{
u32 TempData = 0;
TempData = (((Data >> 0 ) & 0xff) << 24)
| (((Data >> 8 ) & 0xff) << 16)
| (((Data >> 16) & 0xff) << 8 )
| (((Data >> 24) & 0xff) << 0 );
return TempData;
}
/*<2A>ֽڶ<D6BD><DAB6><EFBFBD>ת<EFBFBD><D7AA>*/
u16 u16_EndianConv(u16 Data)
{
u16 TempData = 0;
TempData = (((Data >> 0) & 0xff) << 8)
| (((Data >> 8) & 0xff) << 0);
return TempData;
}
/******************************************
* <20><><EFBFBD><EFBFBD>: ModbusReadData
* <20><><EFBFBD><EFBFBD>: MODBUS<55><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: Id :MODBUS<55>ӻ<EFBFBD><D3BB><EFBFBD>ַ
* Addr :д<><D0B4><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʼ<EFBFBD><CABC>ַ
* Num :д<>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* UsartSendBuffer :<3A><><EFBFBD>ڷ<EFBFBD><DAB7>ͺ<EFBFBD><CDBA><EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><>
******************************************/
void ModbusReadData(u8 Id,u16 Addr,u16 Num,void (*UsartSendBuffer)(u8 *,u16 ))
{
u8 Tx[8];
u16 CRC16;
Tx[0] = Id;
Tx[1] = 0x03;
Tx[2] = (Addr >> 8) & 0xff;
Tx[3] = Addr & 0xff;
Tx[4] = (Num >> 8) & 0xff;
Tx[5] = Num & 0xff;
CRC16 = ModbusCrc16(Tx,6);
Tx[6] = CRC16 & 0xff;
Tx[7] = (CRC16 >> 8) & 0xff;
UsartSendBuffer(Tx,8);
}
/******************************************
* <20><><EFBFBD><EFBFBD>: ModbusWriteMultipleData
* <20><><EFBFBD><EFBFBD>: MODBUSд<53><D0B4><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: Id :MODBUS<55>ӻ<EFBFBD><D3BB><EFBFBD>ַ
* Addr :д<><D0B4><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʼ<EFBFBD><CABC>ַ
* Num :д<>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Data :д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* UsartSendBuffer :<3A><><EFBFBD>ڷ<EFBFBD><DAB7>ͺ<EFBFBD><CDBA><EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><>
******************************************/
void ModbusWriteMultipleData(u8 ID,u16 Addr,u16 Num,u16 *Data,void (*UsartSendBuffer)(u8 *,u16 ))
{
u8 Tx[50],i;
u16 CRC16;
Tx[0] = ID;
Tx[1] = 0x10;
Tx[2] = (Addr >> 8) & 0xff;
Tx[3] = Addr & 0xff;
Tx[4] = (Num >> 8) & 0xff;
Tx[5] = Num & 0xff;
Tx[6] = Num * 2;
for(i = 0;i < Tx[6]/2;i++)
{
Tx[7 + 2 * i] = (Data[i] >> 8) & 0xff;
Tx[8 + 2 * i] = Data[i] & 0xff;
}
CRC16 = ModbusCrc16(Tx,7 + 2 * i);
Tx[7 + 2 * i] = CRC16 & 0xff;
Tx[8 + 2 * i] = (CRC16 >> 8) & 0xff;
UsartSendBuffer(Tx,9 + 2 * i);
}
void ModbusyWriteOnlData(u8 ID,u16 Addr,u16 Value,void (*UsartSendBuffer)(u8 *,u16 ))
{
u8 Tx[8];
u16 CRC16;
Tx[0] = ID;
Tx[1] = 0x06;
Tx[2] = (Addr >> 8) & 0xff;
Tx[3] = Addr & 0xff;
Tx[4] = (Value >> 8) & 0xff;
Tx[5] = Value & 0xff;
CRC16 = ModbusCrc16(Tx,6);
Tx[6] = CRC16 & 0xff;
Tx[7] = (CRC16 >> 8) & 0xff;
UsartSendBuffer(Tx,8);
}
//01 10 00 02 00 01 02 12 34 CRC
//ID Func StartAddress RegNumber wDataAddress
u8 ModbusAnalysis(ModbusAnalysisData_t *pModbus, u8 *pData, u16 len)
{
u16 CRC_16;
u16 TempU16;
if(NULL == pModbus) return 0;
if(len < 8) return 0;
CRC_16 = ModbusCrc16(pData, len-2);
TempU16 = *(pData+len-1);
TempU16 <<= 8;
TempU16 |= *(pData+len-2);
if(TempU16 != CRC_16) return 0;
pModbus->ID = *pData;
pModbus->Func = *(pData+1);
pModbus->StartAddress = (*(pData+2))<<8;
pModbus->StartAddress |= *(pData+3);
/*<2A><><EFBFBD><EFBFBD>дһ<D0B4><D2BB><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>*/
if(0x06 == pModbus->Func)
{
pModbus->wDataAddress = pData+4;
}
else if(0x10 == pModbus->Func) /*д<><D0B4><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>*/
{
pModbus->RegNumber = (*(pData+4))<<8;
pModbus->RegNumber |= *(pData+5);
pModbus->wDataAddress = pData+7;
}
else
{
pModbus->RegNumber = (*(pData+4))<<8;
pModbus->RegNumber |= *(pData+5);
}
return 1;
}

View File

@@ -0,0 +1,66 @@
#ifndef _PROTO_MODBUS_H_
#define _PROTO_MODBUS_H_
#include "main.h"
#define MODBUS_DEFAULT_ID (0x01)
#define MODBUS_SENDBUF_LEN (512U)
#define U16_DATA_L (0)//<2F><>16λ
#define U16_DATA_H (1)//<2F><>16λ
#define BIG_ENDIAN (0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define LITTLE_ENDIAN (1)//С<><D0A1><EFBFBD><EFBFBD>
typedef struct _ModbusCommunicationSendBuf{
u8 SendBuffer[MODBUS_SENDBUF_LEN];
u16 Len;
}ModbusCommunicationSendBuf_t;
typedef struct _ModbusAnalysisData
{
u8 ID; /*ModbusID*/
u8 Func; /*<2A><><EFBFBD>ܺ<EFBFBD>*/
u16 StartAddress; /*<2A><>ʼ<EFBFBD><CABC>ַ*/
u16 RegNumber; /*<2A>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
u8 *wDataAddress; /*д<><D0B4><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ*/
}ModbusAnalysisData_t;
typedef enum _ModbusErrorCode
{
ModbusErrorCode_Success = 0x00,
ModbusErrorCode_IllegalFunction = 0x01,
ModbusErrorCode_IllegalAddr = 0x02,
ModbusErrorCode_IllegalData = 0x03,
ModbusErrorCode_DeviceBusy = 0x06
}ModbusErrorCode_e;
typedef struct proto_Modbus_t proto_Modbus_t;
struct proto_Modbus_t
{
u8 ID;
u16 (*DataRead)(u16); /*Modbus<75><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
ModbusErrorCode_e (*DataWrite)(u16,u16); /*Modbusд<73><D0B4><EFBFBD><EFBFBD>*/
void (*Init)(void); /*<2A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void (*Task)(void); /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void (*DataAnalysis)(u8 *,u16,void *); /*<2A><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>*/
};
u16 ModbusCrc16(u8 *pData, u16 Len);
u16 FloatTOu16(float FloatData,unsigned char HorL);
u16 u32TOu16(u32 u32Data,unsigned char HorL);
u32 u8TOu32(u8 *p_u8Data,unsigned char u8Endian);
u16 u8TOu16(u8 *p_u8Data,unsigned char u8Endian);
void u32TOu8(u32 u32Data,u8 *pData,u8 Endian);
void u16TOu8(u16 u16Data,u8 *pData,u8 Endian);
u32 u32_EndianConv(u32 Data);
u16 u16_EndianConv(u16 Data);
void ModbusReadData(u8 Id,u16 Addr,u16 Num,void (*UsartSendBuffer)(u8 *,u16 ));
void ModbusWriteMultipleData(u8 ID,u16 Addr,u16 Num,u16 *Data,void (*UsartSendBuffer)(u8 *,u16 ));
void ModbusyWriteOnlData(u8 ID,u16 Addr,u16 Value,void (*UsartSendBuffer)(u8 *,u16 ));
u8 ModbusAnalysis(ModbusAnalysisData_t *pModbus, u8 *pData, u16 len);
#endif

741
usr/protocol/proto_PM100.c Normal file
View File

@@ -0,0 +1,741 @@
#include "proto_PM100.h"
#include "proto_Modbus.h"
#include "stdio.h"
#include "string.h"
#include "bsp_Uart.h"
#include "os_timer.h"
char *proto_PM100_Str_WarmingCode[32] =
{
"Water flow low" ,
"" ,
"Dil.N2 flow low" ,
"BP Drooping" ,
"MP Drooping" ,
"Casing temp. high" ,
"BP-G oil level low" ,
"BP-M oil level low" ,
"MP-G oil level low" ,
"MP-M oil level low" ,
"Drv brg temp. high" ,
"Drvn brg temp. high" ,
"Oil level low" ,
"BOX temp.high" ,
"N2 valve open" ,
"Cooler 1 temp. high" ,
"Cooler 2 temp. high" ,
"Cooler 3 temp. high" ,
"Pump N2 flow low" ,
"Exh. N2 flow low" ,
"Exh. trap temp. high" ,
"Back press. high" ,
"Heater error" ,
"BP motor temp. high" ,
"MP motor temp. high" ,
"Driver temp. high" ,
"Communication error" ,
"Valve error" ,
"" ,
"" ,
"" ,
"Other warnings"
};
char *proto_PM100_Str_AlarmCode[32] =
{
"Casing temp. HH" ,
"BP motor temp. high" ,
"MP motor temp. high" ,
"Water leakage" ,
"BP thermal" ,
"MP thermal" ,
"" ,
"" ,
"" ,
"Emergency stop(EMS)" ,
"MP no current" ,
"BP no current" ,
"" ,
"Back press. high" ,
"Power failure" ,
"MP driver protection active",
"BP driver protection active",
"BP overload 2" ,
"MP overload 2" ,
"BP step out" ,
"MP step out" ,
"Emergency off(EMO)" ,
"Exh. N2 flow low" ,
"Water flow low continued" ,
"External interlock" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"" ,
"Other alarms"
};
static void proto_PM100_Init(void);
static void proto_PM100_Tx_Task(void);
static void proto_PM100_Rx_Task(u8 *pData,u16 Len,void *other_data);
static void proto_PM100_Control_Start(u8 Dev);
static void proto_PM100_Control_Stop(u8 Dev);
static void proto_PM100_Control_Reset(void);
static void proto_PM100_Control_Set_Mode(u8 Mode);
static void proto_PM100_Control_Set_Mode_Speed(u8 Dev,u8 Mode,u16 Speed);
static void proto_PM100_Alarm_Control_Reset(void);
static void proto_PM100_Dev_Status_Control_Reset(void);
proto_PM100_t PM100 =
{
.Sys_StateQueue = queue(proto_PM100_Set_Data_t,10),
.Sys_State = PROTO_PM100_CMD_GET_STATE_ALARM,
.Init = proto_PM100_Init,
.Tx_Task = proto_PM100_Tx_Task,
.Rx_Task = proto_PM100_Rx_Task,
.Set_Data.Analog_Code = PROTO_PM100_GET_DATA_CODE,
.Alarm_Control.Reset = proto_PM100_Alarm_Control_Reset,
.Dev_Status_Control.Reset = proto_PM100_Dev_Status_Control_Reset,
.Control.Start = proto_PM100_Control_Start,
.Control.Stop = proto_PM100_Control_Stop,
.Control.Reset = proto_PM100_Control_Reset,
.Control.Set_Mode = proto_PM100_Control_Set_Mode,
.Control.Set_Speed = proto_PM100_Control_Set_Mode_Speed,
};
static proto_PM100_t *pPM100 = &PM100;
static void proto_PM100_Init(void)
{
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
pPM100->Alarm_Control.StartTime = osTime_MSecTick;
pPM100->Dev_Status_Control.StartTime = osTime_MSecTick + 500;
COM_Uart3.Rx_DataAnalysis = proto_PM100_Rx_Task;
/*<2A><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
for (int i = 0; i < 32; i++)
{
PM100.Opera_Status.alarm_start_str[i][0] = '\0';
PM100.Opera_Status.warning_start_str[i][0] = '\0';
PM100.Opera_Status.alarm_start_sec[i] = 0;
PM100.Opera_Status.warning_start_sec[i] = 0;
}
}
static void proto_PM100_Send(u8 *pData,u16 Len)
{
COM_Uart3.Send(&COM_Uart3,pData,Len);
}
static u8 proto_PM100_SysState_Switch(void)
{
proto_PM100_Set_Data_t Set_Data;
if(0 == queue_pop(pPM100->Sys_StateQueue,&Set_Data))
{
pPM100->Sys_State = PROTO_PM100_CMD_GET_STATE_ALARM;
return 0;
}
else
{
pPM100->Sys_State = Set_Data.Sys_State;
memcpy(&pPM100->Set_Data,&Set_Data,sizeof(proto_PM100_Set_Data_t));
return 1;
}
}
static void proto_PM100_Alarm_Control_Reset(void)
{
pPM100->Alarm_Control.Code_Last = ((u64)pPM100->Opera_Status.Warming_Code << 32) | (u64)pPM100->Opera_Status.Alarm_Code;
}
static void proto_PM100_Dev_Status_Control_Reset(void)
{
memcpy(&pPM100->Dev_Status_Control.Opera_Status_Last,&pPM100->Opera_Status,sizeof(proto_PM100_Set_Data_t));
}
static void proto_PM100_Control_Start(u8 Dev)
{
proto_PM100_Set_Data_t Set_Data;
Set_Data.Sys_State = PROTO_PM100_CMD_START;
Set_Data.Dev = Dev;
queue_push_back(pPM100->Sys_StateQueue,(void *)&Set_Data);
}
static void proto_PM100_Control_Stop(u8 Dev)
{
proto_PM100_Set_Data_t Set_Data;
Set_Data.Sys_State = PROTO_PM100_CMD_STOP;
Set_Data.Dev = Dev;
queue_push_back(pPM100->Sys_StateQueue,(void *)&Set_Data);
}
static void proto_PM100_Control_Reset(void)
{
proto_PM100_Set_Data_t Set_Data;
Set_Data.Sys_State = PROTO_PM100_CMD_RESET;
queue_push_back(pPM100->Sys_StateQueue,(void *)&Set_Data);
}
static void proto_PM100_Control_Set_Mode(u8 Mode)
{
proto_PM100_Set_Data_t Set_Data;
Set_Data.Sys_State = PROTO_PM100_CMD_SET_MODE;
Set_Data.Mode = Mode;
queue_push_back(pPM100->Sys_StateQueue,(void *)&Set_Data);
}
static void proto_PM100_Control_Set_Mode_Speed(u8 Dev,u8 Mode,u16 Speed)
{
proto_PM100_Set_Data_t Set_Data;
Set_Data.Sys_State = PROTO_PM100_CMD_SET_SPEED;
Set_Data.Dev = Dev;
Set_Data.Mode = Mode;
Set_Data.Speed = Speed;
queue_push_back(pPM100->Sys_StateQueue,(void *)&Set_Data);
}
/*<2A><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>*/
static u8 proto_PM100_CheckSum(u8 *pData,u16 len)
{
u16 i;
u8 Sum=0;
for(i=0;i<len;i++)
{
Sum += pData[i];
}
return Sum;
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD>豸*/
static void proto_PM100_Tx_Start(u8 Dev)
{
char Tx[20];
u16 Len;
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_START);
if(PROTO_PM100_DEV_MP == Dev)
{
Tx[4] = PROTO_PM100_DEV_CHAR_MP;
}
else if(PROTO_PM100_DEV_BP == Dev)
{
Tx[4] = PROTO_PM100_DEV_CHAR_BP;
}
else/*<2A>쳣*/
{
return ;
}
Tx[5] = PROTO_PM100_FRAME_STRUCT_ETX;
sprintf(&Tx[6],"%02X",proto_PM100_CheckSum((u8 *)Tx,6));
Tx[8] = PROTO_PM100_FRAME_STRUCT_CR;
Len = 9;
proto_PM100_Send((u8*)Tx,Len);
}
/*ֹͣ<CDA3>豸*/
static void proto_PM100_Tx_Stop(u8 Dev)
{
char Tx[20];
u16 Len;
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_STOP);
if(PROTO_PM100_DEV_MP == Dev)
{
Tx[4] = PROTO_PM100_DEV_CHAR_MP;
}
else if(PROTO_PM100_DEV_BP == Dev)
{
Tx[4] = PROTO_PM100_DEV_CHAR_BP;
}
else/*<2A>쳣*/
{
return ;
}
Tx[5] = PROTO_PM100_FRAME_STRUCT_ETX;
sprintf(&Tx[6],"%02X",proto_PM100_CheckSum((u8 *)Tx,6));
Tx[8] = PROTO_PM100_FRAME_STRUCT_CR;
Len = 9;
proto_PM100_Send((u8*)Tx,Len);
}
/*<2A><>λ<EFBFBD>豸*/
static void proto_PM100_Tx_Reset(void)
{
char Tx[20];
u16 Len;
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_RESET);
Tx[4] = PROTO_PM100_FRAME_STRUCT_ETX;
sprintf(&Tx[5],"%02X",proto_PM100_CheckSum((u8 *)Tx,5));
Tx[7] = PROTO_PM100_FRAME_STRUCT_CR;
Len = 8;
proto_PM100_Send((u8*)Tx,Len);
}
/*<2A><><EFBFBD><EFBFBD>ģʽ*/
static void proto_PM100_Tx_Set_Mode(u8 Mode)
{
char Tx[20];
u16 Len;
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_SET_MODE);
if(PROTO_PM100_MODE_NORMAL == Mode)
{
Tx[4] = PROTO_PM100_MODE_CHAR_NORMAL;
}
else if(PROTO_PM100_MODE_POWER_SAVING == Mode)
{
Tx[4] = PROTO_PM100_MODE_CHAR_POWER_SAVING;
}
else/*<2A>쳣*/
{
return ;
}
Tx[5] = PROTO_PM100_FRAME_STRUCT_ETX;
sprintf(&Tx[6],"%02X",proto_PM100_CheckSum((u8 *)Tx,6));
Tx[8] = PROTO_PM100_FRAME_STRUCT_CR;
Len = 9;
proto_PM100_Send((u8*)Tx,Len);
}
/*<2A><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>ת<EFBFBD><D7AA>*/
static void proto_PM100_Tx_Set_Mode_Speed(u8 Dev,u8 Mode,u16 Speed)
{
char Tx[20];
u16 Len;
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_SET_SPEED);
if(PROTO_PM100_DEV_MP == Dev)
{
Tx[4] = PROTO_PM100_DEV_CHAR_MP;
}
else if(PROTO_PM100_DEV_BP == Dev)
{
Tx[4] = PROTO_PM100_DEV_CHAR_BP;
}
else/*<2A>쳣*/
{
return ;
}
if(PROTO_PM100_MODE_NORMAL == Mode)
{
Tx[5] = PROTO_PM100_MODE_CHAR_NORMAL;
}
else if(PROTO_PM100_MODE_POWER_SAVING == Mode)
{
Tx[5] = PROTO_PM100_MODE_CHAR_POWER_SAVING;
}
else/*<2A>쳣*/
{
return ;
}
if(Speed > 9900)
{
Speed = 99;
}
sprintf(&Tx[6],"%d",Speed);
Tx[8] = PROTO_PM100_FRAME_STRUCT_ETX;
sprintf(&Tx[9],"%02X",proto_PM100_CheckSum((u8 *)Tx,9));
Tx[11] = PROTO_PM100_FRAME_STRUCT_CR;
Len = 12;
proto_PM100_Send((u8*)Tx,Len);
}
/*<2A><>ȡģ<C8A1><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
static void proto_PM100_Tx_Get_Data(u32 Analog_Code)
{
char Tx[20];
u16 Len;
u8 i,AD[8];
Analog_Code = PROTO_PM100_GET_DATA_CODE;
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_GET_DATA);
for(i=0;i<8;i++)
{
AD[i] = (Analog_Code >> (4 * (7 - i))) & 0x0000000f;
sprintf(&Tx[4 + i],"%X",AD[i]);
}
Tx[12] = PROTO_PM100_FRAME_STRUCT_ETX;
sprintf(&Tx[13],"%02X",proto_PM100_CheckSum((u8 *)Tx,13));
Tx[15] = PROTO_PM100_FRAME_STRUCT_CR;
Len = 16;
proto_PM100_Send((u8*)Tx,Len);
}
/*<2A><>ȡ״̬<D7B4>ͱ<EFBFBD><CDB1><EFBFBD>*/
static void proto_PM100_Tx_Get_State_Alarm(void)
{
char Tx[20];
u16 Len;
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_GET_STATE_ALARM);
Tx[4] = PROTO_PM100_FRAME_STRUCT_ETX;
sprintf(&Tx[5],"%02X",proto_PM100_CheckSum((u8 *)Tx,5));
Tx[7] = PROTO_PM100_FRAME_STRUCT_CR;
Len = 8;
proto_PM100_Send((u8*)Tx,Len);
}
static void proto_PM100_Tx_Task(void)
{
u8 SendTimeFlag = 0;
if(0 == (pPM100->error_code & PROTO_PM100_ERROR_CODE_TIMEOUT))
{
pPM100->time_out_count++;
if(pPM100->time_out_count > 10)
{
pPM100->error_code |= PROTO_PM100_ERROR_CODE_TIMEOUT;
}
}
if( 1 == pPM100->AnalogData_Control.FirstFlag
&& 1 != pPM100->AnalogData_Control.EndFlag
)
{
pPM100->AnalogData_Control.CountTime++;
if(pPM100->AnalogData_Control.CountTime >= 3) /*<2A><><EFBFBD><EFBFBD>3<EFBFBD><33>û<EFBFBD><C3BB><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>*/
{
pPM100->AnalogData_Control.FirstFlag = 0;
pPM100->AnalogData_Control.EndFlag = 0;
pPM100->AnalogData_Control.CountTime = 0;
pPM100->Sys_State = PROTO_PM100_CMD_GET_STATE_ALARM;
}
return;
}
switch(pPM100->Sys_State)
{
case PROTO_PM100_CMD_START :
{
proto_PM100_Tx_Start(pPM100->Set_Data.Dev);
}break;
case PROTO_PM100_CMD_STOP :
{
proto_PM100_Tx_Stop(pPM100->Set_Data.Dev);
}break;
case PROTO_PM100_CMD_RESET :
{
proto_PM100_Tx_Reset();
}break;
case PROTO_PM100_CMD_SET_MODE :
{
proto_PM100_Tx_Set_Mode(pPM100->Set_Data.Mode);
}break;
case PROTO_PM100_CMD_SET_SPEED :
{
proto_PM100_Tx_Set_Mode_Speed(pPM100->Set_Data.Dev,pPM100->Set_Data.Mode,pPM100->Set_Data.Speed);
}break;
case PROTO_PM100_CMD_GET_DATA :
{
proto_PM100_Tx_Get_Data(pPM100->Set_Data.Analog_Code);
pPM100->AnalogData_Control.FirstFlag = 1;
SendTimeFlag = 1;
}break;
case PROTO_PM100_CMD_GET_STATE_ALARM :
{
proto_PM100_Tx_Get_State_Alarm();
SendTimeFlag = 1;
}break;
default:
{
}break;
}
if(SendTimeFlag)
{
return ;
}
else
{
pPM100->SendTime++;
if(pPM100->SendTime >= 3)
{
pPM100->SendTime = 0;
pPM100->Sys_State = PROTO_PM100_CMD_GET_STATE_ALARM;
}
}
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>*/
static void proto_PM100_Rx_Task(u8 *pData,u16 Len,void *other_data)
{
u8 SumCheck[2],SuccessFlag;
u8 *pTextData;
char TextData[10];
/*֡ͷ<D6A1>ж<EFBFBD>*/
if(PROTO_PM100_FRAME_STRUCT_STX != pData[0])
{
return;
}
/*֡β<D6A1>ж<EFBFBD>*/
if( PROTO_PM100_FRAME_STRUCT_ETX != pData[Len-4]
|| PROTO_PM100_FRAME_STRUCT_CR != pData[Len-1]
)
{
return;
}
if(PROTO_PM100_CMD_GET_DATA == pPM100->Sys_State)/*ʵʱģ<CAB1><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD>жϣ<D0B6><CFA3>Ѿ<EFBFBD>ճ<EFBFBD><D5B3><EFBFBD><EFBFBD>*/
{
}
else
{
/*У<><D0A3><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>*/
sprintf((char*)SumCheck,"%02X",proto_PM100_CheckSum(pData,Len - 3));
if(SumCheck[0] != pData[Len - 3] || SumCheck[1] != pData[Len - 2])
{
return ;
}
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
pPM100->error_code &= (~PROTO_PM100_ERROR_CODE_TIMEOUT);
pPM100->time_out_count = 0;
SuccessFlag = 0;
pTextData = &pData[1];
switch(pPM100->Sys_State)
{
case PROTO_PM100_CMD_START :
case PROTO_PM100_CMD_STOP :
case PROTO_PM100_CMD_RESET :
case PROTO_PM100_CMD_SET_MODE :
case PROTO_PM100_CMD_SET_SPEED :
{
if(0 == strncmp((char *)pTextData,PROTO_PM100_CMD_STR_SET_OK,strlen(PROTO_PM100_CMD_STR_SET_OK)))
{
SuccessFlag = 1;
proto_PM100_SysState_Switch();
}
else
{
SuccessFlag = 0;
}
}break;
case PROTO_PM100_CMD_GET_DATA :
{
u16 Len_Index = 0;
u8 *pData_u8 = pData;
int DataIndex;
float Data;
float *pData_float = (float *)&pPM100->AnalogData;
while(Len_Index < Len)
{
pData_u8 = &pData[Len_Index + 1];
snprintf(TextData,3,"%s",pData_u8);
sscanf((char*)TextData,"%d",&DataIndex);
if(DataIndex > 22)
{
Len_Index += 14;
continue ;
}
snprintf(TextData,8,"%s",&pData_u8[3]);
sscanf((char*)TextData,"%f",&Data);
pData_float[DataIndex] = Data;
Len_Index += 14;
}
Len_Index -=14;
pData_u8 = &pData[Len_Index + 1];
if(0 == strncmp((char *)pData_u8,PROTO_PM100_CMD_STR_SET_END,strlen(PROTO_PM100_CMD_STR_SET_END)))
{
SuccessFlag = 1;
pPM100->AnalogData_Control.EndFlag = 1;
}
else
{
SuccessFlag = 0;
}
/*
if(Len > 8)
{
int DataIndex;
float Data;
float *pData = (float *)&pPM100->AnalogData;
snprintf(TextData,3,"%s",pTextData);
sscanf((char*)TextData,"%d",&DataIndex);
if(DataIndex >= 32)
{
return ;
}
snprintf(TextData,8,"%s",&pTextData[3]);
sscanf((char*)TextData,"%f",&Data);
pData[DataIndex] = Data;
SuccessFlag = 1;
}
else
{
if(0 == strncmp((char *)pTextData,PROTO_PM100_CMD_STR_SET_END,strlen(PROTO_PM100_CMD_STR_SET_END)))
{
SuccessFlag = 1;
pPM100->AnalogData_Control.EndFlag = 1;
}
else
{
SuccessFlag = 0;
}
} */
}break;
case PROTO_PM100_CMD_GET_STATE_ALARM :
{
u32 Data,i;
if(0 != strncmp((char *)pTextData,PROTO_PM100_CMD_STR_GET_STATE_ALARM,strlen(PROTO_PM100_CMD_STR_GET_STATE_ALARM)))
{
SuccessFlag = 0;
break;
}
if(PROTO_PM100_MODE_CHAR_NORMAL == pTextData[3])
{
pPM100->Opera_Status.Run_Status = PROTO_PM100_MODE_NORMAL;
}
else if(PROTO_PM100_MODE_CHAR_POWER_SAVING == pTextData[3])
{
pPM100->Opera_Status.Run_Status = PROTO_PM100_MODE_POWER_SAVING;
}
else/*<2A>쳣*/
{
SuccessFlag = 0;
break;
}
if(PROTO_PM100_MODE_CHAR_RUNING == pTextData[4])
{
pPM100->Opera_Status.MP_Status = PROTO_PM100_MODE_RUNING;
}
else if(PROTO_PM100_MODE_CHAR_STOP == pTextData[4])
{
pPM100->Opera_Status.MP_Status = PROTO_PM100_MODE_STOP;
}
else/*<2A>쳣*/
{
SuccessFlag = 0;
break;
}
if(PROTO_PM100_MODE_CHAR_RUNING == pTextData[5])
{
pPM100->Opera_Status.BP_Status = PROTO_PM100_MODE_RUNING;
}
else if(PROTO_PM100_MODE_CHAR_STOP == pTextData[5])
{
pPM100->Opera_Status.BP_Status = PROTO_PM100_MODE_STOP;
}
else/*<2A>쳣*/
{
SuccessFlag = 0;
break;
}
pPM100->Opera_Status.Warming_Code = 0;
pPM100->Opera_Status.Alarm_Code = 0;
// for(i=0;i<8;i++)
// {
// snprintf(TextData,8,"%s",&pTextData[6]);
// sscanf((char*)TextData,"%x",&Data);
// pPM100->Opera_Status.Warming_Code |= (Data & 0x0000000f);
//
// snprintf(TextData,8,"%s",&pTextData[14]);
// sscanf((char*)TextData,"%x",&Data);
// pPM100->Opera_Status.Alarm_Code |= Data & 0x0000000f;
// }
sscanf((const char *)&pTextData[6], "%8x", &pPM100->Opera_Status.Warming_Code);
sscanf((const char *)&pTextData[14], "%8x", &pPM100->Opera_Status.Alarm_Code);
if(0 == proto_PM100_SysState_Switch())
{
pPM100->Sys_State = PROTO_PM100_CMD_GET_DATA; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ͻ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>*/
}
SuccessFlag = 1;
}break;
default:
{
}break;
}
/*ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>Ƿְ<C7B7><D6B0><EFBFBD>ȡ<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B4A6>*/
if(PROTO_PM100_CMD_GET_DATA == pPM100->Sys_State)
{
if(1 == pPM100->AnalogData_Control.FirstFlag)
{
/*<2A>ְ<EFBFBD><D6B0><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
if(1 == pPM100->AnalogData_Control.EndFlag)
{
pPM100->AnalogData_Control.FirstFlag = 0;
pPM100->AnalogData_Control.EndFlag = 0;
pPM100->AnalogData_Control.CountTime = 0;
proto_PM100_SysState_Switch();
}
else if(0 == SuccessFlag)
{
}
else
{
pPM100->AnalogData_Control.CountTime = 0;
}
}
}
else
{
if(0 == SuccessFlag)
{
}
else
{
pPM100->SendTime = 0;
return;
}
}
}

189
usr/protocol/proto_PM100.h Normal file
View File

@@ -0,0 +1,189 @@
#ifndef _PROTO_PM100_H_
#define _PROTO_PM100_H_
#include "main.h"
#include "algo_queue.h"
/*<2A><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ʽ STX TEXT ETX SUM CR*/
#define PROTO_PM100_FRAME_STRUCT_STX (0x02)
#define PROTO_PM100_FRAME_STRUCT_ETX (0x03)
#define PROTO_PM100_FRAME_STRUCT_CR (0x0D)
/*<2A>豸*/
#define PROTO_PM100_DEV_MP 0 /*<2A><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_DEV_BP 1 /*<2A><><EFBFBD>ӱ<EFBFBD>*/
#define PROTO_PM100_MODE_NORMAL 0 /*NORMAL <20><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_MODE_POWER_SAVING 1 /*POWER-SAVING <20><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_MODE_RUN 0 /*<2A><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
#define PROTO_PM100_MODE_ALARM 1 /*<2A><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
#define PROTO_PM100_MODE_PE 2
#define PROTO_PM100_MODE_IDIE 3 /*<2A><EFBFBD><E8B1B8><EFBFBD><EFBFBD>/ֹͣ*/
#define PROTO_PM100_MODE_OFFLINE 4 /*<2A><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
#define PROTO_PM100_MODE_ONLINE 5 /*<2A><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
#define PROTO_PM100_MODE_RUNING 0 /*<2A><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_MODE_STOP 1 /*ֹͣ*/
#define PROTO_PM100_DEV_CHAR_MP ('M') /*<2A><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_DEV_CHAR_BP ('B') /*<2A><><EFBFBD>ӱ<EFBFBD>*/
#define PROTO_PM100_MODE_CHAR_NORMAL ('N') /*NORMAL <20><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_MODE_CHAR_POWER_SAVING ('S') /*POWER-SAVING <20><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_MODE_CHAR_RUNING ('R') /*<2A><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_MODE_CHAR_STOP ('S') /*ֹͣ*/
/*ָ<><D6B8>*/
/*<2A>ַ<EFBFBD><D6B7><EFBFBD>*/
#define PROTO_PM100_CMD_STR_START ("S20") /*<2A><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_CMD_STR_STOP ("S21") /*ֹͣ*/
#define PROTO_PM100_CMD_STR_RESET ("S22") /*<2A><>λ*/
#define PROTO_PM100_CMD_STR_SET_MODE ("S23") /*<2A><><EFBFBD>ñ<EFBFBD>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_CMD_STR_SET_SPEED ("S24") /*<2A><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_CMD_STR_GET_DATA ("M20") /*<2A><>ȡ<EFBFBD>û<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>*/
#define PROTO_PM100_CMD_STR_GET_STATE_ALARM ("M21") /*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD><EBB1A8>*/
#define PROTO_PM100_CMD_STR_SET_OK ("OK") /*<2A><><EFBFBD>óɹ<C3B3>*/
#define PROTO_PM100_CMD_STR_SET_NG ("NG") /*<2A><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>*/
#define PROTO_PM100_CMD_STR_SET_END ("END") /*<2A><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>*/
/*CMD*/
#define PROTO_PM100_CMD_START 0 /*<2A><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_CMD_STOP 2 /*ֹͣ*/
#define PROTO_PM100_CMD_RESET 3 /*<2A><>λ*/
#define PROTO_PM100_CMD_SET_MODE 4 /*<2A><><EFBFBD>ñ<EFBFBD>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_CMD_SET_SPEED 5 /*<2A><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
#define PROTO_PM100_CMD_GET_DATA 6 /*<2A><>ȡ<EFBFBD>û<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>*/
#define PROTO_PM100_CMD_GET_STATE_ALARM 7 /*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD><EBB1A8>*/
#define BP_ON ("BPON") /*bp<62><70><EFBFBD><EFBFBD>*/
#define MP_ON ("MPON") /*mp<6D><70><EFBFBD><EFBFBD>*/
#define ALL_RESET ("ALLRESET") /*<2A><><EFBFBD><EFBFBD>*/
#define BP_STOP ("BPSTOP") /*bpֹͣ*/
#define MP_STOP ("MPSTOP") /*mpֹͣ*/
#define NORMAL ("N") /*<2A><><EFBFBD><EFBFBD>ģʽ*/
#define POWER_SAVE ("S") /*<2A><><EFBFBD><EFBFBD>ģʽ*/
#define MP_NORMAL_SPEED ("MN") /*mp<6D><70><EFBFBD><EFBFBD>ģʽת<CABD><D7AA>*/
#define MP_SAVE_SPEED ("MS") /*mp<6D><70><EFBFBD><EFBFBD>ģʽת<CABD><D7AA>*/
#define BP_NORMAL_SPEED ("BN") /*bp<62><70><EFBFBD><EFBFBD>ģʽת<CABD><D7AA>*/
#define BP_SAVE_SPEED ("BS") /*bp<62><70><EFBFBD><EFBFBD>ģʽת<CABD><D7AA>*/
#define PROTO_PM100_GET_DATA_CODE (0x007FD9FF)/*<2A><>ȡ<EFBFBD><C8A1>Щʵ<D0A9><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
#define PROTO_PM100_ERROR_CODE_TIMEOUT (0x0001)/*ͨѶ<CDA8><D1B6>ʱ*/
/*PM100ģ<30><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
typedef struct
{
float Total_running_time; /*H*/
float BP_power ; /*KW*/
float MP_power ; /*KW*/
float BP_motor_speed ; /*K/min*/
float MP_motor_speed ; /*K/min*/
float BP_current ; /*A*/
float MP_current ; /*A*/
float BP_casing_temp ; /*<2A><>*/
float MP_casing_temp ; /*<2A><>*/
float Reserved_1[2] ; /* */
float Cooling_water_flow; /*L/min*/
float Pump_N2_flow ; /*Pam3/s*/
float Reserved ; /* */
float Back_pressure_1 ; /*KPa*/
float Heater1 ; /*<2A><>*/
float Heater2 ; /*<2A><>*/
float Heater3 ; /*<2A><>*/
float Heater4 ; /*<2A><>*/
float Vacuum_pressure ; /*KPa*/
float Cooler_1 ; /*<2A><>*/
float Cooler_2 ; /*<2A><>*/
float Cooler_3 ; /*<2A><>*/
float Reserved_2[9] ; /*H*/
}proto_PM100_AnalogData_t;
typedef struct
{
u8 Sys_State;
u8 Dev;
u8 Mode;
u16 Speed;
u32 Analog_Code; /*<2A><>ȡ<EFBFBD><C8A1>Щģ<D0A9><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
}proto_PM100_Set_Data_t;
typedef struct
{
u8 Run_Status;
u8 MP_Status;
u8 BP_Status;
u32 Warming_Code; /*<2A>豸״̬<D7B4><CCAC>*/
u32 Alarm_Code; /*<2A><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>*/
char alarm_start_str[32][15]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> YYYYMMDDHHMMSS
char warning_start_str[32][15]; // <20><><EFBFBD>ʼʱ<CABC><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
u32 alarm_start_sec[32]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼2000-01-01<30><31>
u32 warning_start_sec[32]; // <20><><EFBFBD>ʼ<E6BFAA><CABC><EFBFBD><EFBFBD>
}proto_Opera_Status_t;
typedef struct
{
queue Sys_StateQueue; /*״̬<D7B4><CCAC><EFBFBD><EFBFBD>*/
u8 Sys_State; /*Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬*/
u8 SendTime; /*ָ<><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>*/
proto_PM100_AnalogData_t AnalogData;
u16 time_out_count; /*<2A><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
u32 error_code; /*<2A>豸״̬*/
struct
{
u8 FirstFlag;
u8 EndFlag;
u16 CountTime;
}AnalogData_Control; /*<2A><>ȡģ<C8A1><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĿ<D8B5><C4BF>Ʋ<EFBFBD><C6B2><EFBFBD>*/
struct
{
u64 Code_Last; /*<2A><>һ<EFBFBD>εı<CEB5><C4B1><EFBFBD>ֵ*/
u16 StartTime; /*<2A><>ʱ*/
void (*Reset)(void); /*<2A><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>*/
}Alarm_Control; /*<2A><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
proto_PM100_Set_Data_t Set_Data; /*<2A><><EFBFBD>õIJ<C3B5><C4B2><EFBFBD>*/
proto_Opera_Status_t Opera_Status;
struct
{
proto_Opera_Status_t Opera_Status_Last; /*<2A><>һ<EFBFBD>ε<EFBFBD><CEB5>豸״̬*/
u16 StartTime; /*<2A><>ʱ*/
void (*Reset)(void); /*<2A><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>*/
}Dev_Status_Control; /*<2A>豸״̬<D7B4><CCAC><EFBFBD><EFBFBD>*/
struct
{
void (*Start)(u8); /*<2A><><EFBFBD><EFBFBD>*/
void (*Stop)(u8); /*ֹͣ*/
void (*Reset)(void); /*<2A><>λ*/
void (*Set_Mode)(u8); /*<2A><><EFBFBD>ñ<EFBFBD>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
void (*Set_Speed)(u8,u8,u16); /*<2A><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
}Control;
void (*Init)(void);
void (*Rx_Task)(u8 *,u16,void *);
void (*Tx_Task)(void);
}proto_PM100_t;
extern proto_PM100_t PM100;
extern char *proto_PM100_Str_WarmingCode[32];
extern char *proto_PM100_Str_AlarmCode[32];
#endif

View File

@@ -0,0 +1,745 @@
#include "proto_Para_Modbus.h"
#include "string.h"
#include "bsp_Uart.h"
#include "os_timer.h"
#include "stdio.h"
#include "app.h"
#include "bsp_W5500.h"
#include "proto_HSMS.h"
#include "bsp_Flash.h"
#include "bsp_Wdg.h"
static ModbusAnalysisData_t ModbusAnalysisData;//ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9>
static ModbusCommunicationSendBuf_t SendStruct;//<2F><><EFBFBD>ͽṹ<CDBD><E1B9B9>
static void ModbusCommunicationDataReceive(u8 *pData, u16 len,void *other_data);
static void ModbusCommunicationDataSend(u8 *pData, u16 len);
static void proto_Modbus_Init(void);
static void proto_Modbus_Task(void);
static ModbusErrorCode_e ModbusCommunicationDataWrite(u16 Addr, u16 Value);
static u16 ModbusCommunicationDataRead(u16 Addr);
proto_Modbus_t Para_Modbus=
{
.ID = 0x01,
.DataRead = ModbusCommunicationDataRead,
.DataWrite = ModbusCommunicationDataWrite,
.DataAnalysis = ModbusCommunicationDataReceive,
.Init = proto_Modbus_Init,
.Task = proto_Modbus_Task,
};
static proto_Modbus_t *pModbus = &Para_Modbus;
static bsp_Uart_t *rx_uart = NULL;
static void ModbusCommunicationDataSend(u8 *pData, u16 Len)
{
if(&COM_Uart1 == rx_uart)
{
COM_Uart1.Send(&COM_Uart1,pData,Len);
}
else if(&COM_Uart2 == rx_uart)
{
COM_Uart2.Send(&COM_Uart2,pData,Len);
}
}
static void proto_Modbus_Init(void)
{
COM_Uart1.Rx_DataAnalysis = ModbusCommunicationDataReceive;
COM_Uart2.Rx_DataAnalysis = ModbusCommunicationDataReceive;
}
static void proto_Modbus_Task(void)
{
}
static void ModbusCommunicationDataReceive(u8 *pData, u16 len,void *other_data)
{
ModbusErrorCode_e ErrorCode;
u8 inx;
u16 TempAddr, TempData, Crc16;
if (0 == ModbusAnalysis(&ModbusAnalysisData, pData, len))//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> У<><D0A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
return;
if (pModbus->ID != ModbusAnalysisData.ID)//<2F>ж<EFBFBD>ID<49>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
return;
ErrorCode = ModbusErrorCode_Success;
rx_uart = (bsp_Uart_t *)other_data;
/* //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>Ƿ񳬳<C7B7><F1B3ACB3><EFBFBD>Χ
if ((ModbusAnalysisData.StartAddress >= MODBUS_REG_LEN) || (ModbusAnalysisData.RegNumber >= MODBUS_REG_LEN) ||
(ModbusAnalysisData.StartAddress + ModbusAnalysisData.RegNumber >= MODBUS_REG_LEN))
{
ErrorCode = ModbusErrorCode_IllegalAddr;
goto Error;
}
*/
switch (ModbusAnalysisData.Func)
{
case 0x03:
case 0x04:
{
TempAddr = ModbusAnalysisData.StartAddress;
SendStruct.SendBuffer[0] = ModbusAnalysisData.ID;
SendStruct.SendBuffer[1] = ModbusAnalysisData.Func;
SendStruct.SendBuffer[2] = 2 * ModbusAnalysisData.RegNumber;
for (inx = 0; inx < ModbusAnalysisData.RegNumber; inx++)
{
TempData = ModbusCommunicationDataRead(TempAddr);
SendStruct.SendBuffer[3 + 2 * inx] = (TempData >> 8) & 0xff;
SendStruct.SendBuffer[4 + 2 * inx] = TempData & 0xff;
TempAddr++;
}
Crc16 = ModbusCrc16(SendStruct.SendBuffer, 3 + SendStruct.SendBuffer[2]);
SendStruct.SendBuffer[3 + SendStruct.SendBuffer[2]] = Crc16 & 0xff;
SendStruct.SendBuffer[4 + SendStruct.SendBuffer[2]] = (Crc16 >> 8) & 0xff;
SendStruct.Len = 5 + SendStruct.SendBuffer[2];
}goto Success;
/*<2A><><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>*/
case 0x41:
{
TempAddr = ModbusAnalysisData.StartAddress;
SendStruct.SendBuffer[0] = ModbusAnalysisData.ID;
SendStruct.SendBuffer[1] = ModbusAnalysisData.Func;
SendStruct.SendBuffer[2] = ModbusAnalysisData.StartAddress >> 8;
SendStruct.SendBuffer[3] = ModbusAnalysisData.StartAddress & 0xff;
SendStruct.SendBuffer[4] = (2 * ModbusAnalysisData.RegNumber) >> 8;
SendStruct.SendBuffer[5] = (2 * ModbusAnalysisData.RegNumber) & 0xff;
for (inx = 0; inx < ModbusAnalysisData.RegNumber; inx++)
{
TempData = ModbusCommunicationDataRead(TempAddr);
SendStruct.SendBuffer[6 + 2 * inx] = (TempData >> 8) & 0xff;
SendStruct.SendBuffer[7 + 2 * inx] = TempData & 0xff;
TempAddr++;
}
Crc16 = ModbusCrc16(SendStruct.SendBuffer, 6 + 2 * ModbusAnalysisData.RegNumber);
SendStruct.SendBuffer[6 + 2 * ModbusAnalysisData.RegNumber] = Crc16 & 0xff;
SendStruct.SendBuffer[7 + 2 * ModbusAnalysisData.RegNumber] = (Crc16 >> 8) & 0xff;
SendStruct.Len = 8 + 2 * ModbusAnalysisData.RegNumber;
}goto Success;
case 0x06:
{
TempAddr = ModbusAnalysisData.StartAddress;
TempData = (ModbusAnalysisData.wDataAddress[0] << 8) | ModbusAnalysisData.wDataAddress[1];
ErrorCode = ModbusCommunicationDataWrite(TempAddr, TempData);
if (ErrorCode)
{
goto Error;
}
SendStruct.Len = 8;
SendStruct.SendBuffer[0] = ModbusAnalysisData.ID;
SendStruct.SendBuffer[1] = ModbusAnalysisData.Func;
SendStruct.SendBuffer[2] = ModbusAnalysisData.StartAddress >> 8;
SendStruct.SendBuffer[3] = ModbusAnalysisData.StartAddress & 0xff;
SendStruct.SendBuffer[4] = ModbusAnalysisData.wDataAddress[0];
SendStruct.SendBuffer[5] = ModbusAnalysisData.wDataAddress[1];
Crc16 = ModbusCrc16(SendStruct.SendBuffer, 6);
SendStruct.SendBuffer[6] = Crc16 & 0xff;
SendStruct.SendBuffer[7] = (Crc16 >> 8) & 0xff;
}break;
case 0x10:
{
TempAddr = ModbusAnalysisData.StartAddress;
for (inx = 0; inx < ModbusAnalysisData.RegNumber; inx++)
{
TempData = ModbusAnalysisData.wDataAddress[2 * inx];
TempData = (TempData << 8) | ModbusAnalysisData.wDataAddress[2 * inx + 1];
ErrorCode = ModbusCommunicationDataWrite(TempAddr, TempData);
TempAddr++;
if (ErrorCode)
{
goto Error;
}
}
SendStruct.Len = 8;
SendStruct.SendBuffer[0] = ModbusAnalysisData.ID;
SendStruct.SendBuffer[1] = ModbusAnalysisData.Func;
SendStruct.SendBuffer[2] = ModbusAnalysisData.StartAddress >> 8;
SendStruct.SendBuffer[3] = ModbusAnalysisData.StartAddress & 0xff;
SendStruct.SendBuffer[4] = ModbusAnalysisData.RegNumber >> 8;
SendStruct.SendBuffer[5] = ModbusAnalysisData.RegNumber & 0xff;
Crc16 = ModbusCrc16(SendStruct.SendBuffer, 6);
SendStruct.SendBuffer[6] = Crc16 & 0xff;
SendStruct.SendBuffer[7] = (Crc16 >> 8) & 0xff;
}
break;
default:
{
ErrorCode = ModbusErrorCode_IllegalFunction;
}
goto Error;
}
Success:
ModbusCommunicationDataSend(SendStruct.SendBuffer, SendStruct.Len);
return;
Error:
SendStruct.Len = 5;
SendStruct.SendBuffer[0] = ModbusAnalysisData.ID;
SendStruct.SendBuffer[1] = ModbusAnalysisData.Func | 0x80;
SendStruct.SendBuffer[2] = ErrorCode;
Crc16 = ModbusCrc16(SendStruct.SendBuffer, 3);
SendStruct.SendBuffer[3] = Crc16 & 0xff;
SendStruct.SendBuffer[4] = (Crc16 >> 8) & 0xff;
ModbusCommunicationDataSend(SendStruct.SendBuffer, SendStruct.Len);
}
/*modbus<75><73><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>u16ת<36><D7AA>Ϊascii<69><69>u16 ʵ<><CAB5>Ϊ<EFBFBD>Ե<EFBFBD><D4B5>ߵ<EFBFBD><DFB5>ֽ<EFBFBD>*/
static u16 modbus_u16_to_ascii_u16(u16 modbus_u16)
{
return (modbus_u16 << 8) | (modbus_u16 >> 8);
}
/*ascii<69><69>u16 ת<><D7AA>Ϊmodbus u16<31><36><EFBFBD><EFBFBD> ʵ<><CAB5>Ϊ<EFBFBD>Ե<EFBFBD><D4B5>ߵ<EFBFBD><DFB5>ֽ<EFBFBD>*/
static u16 ascii_u16_to_modbus_u16(u16 modbus_u16)
{
return (modbus_u16 << 8) | (modbus_u16 >> 8);
}
/******************************************
* <20><><EFBFBD><EFBFBD>: ModbusCommunicationDataWrite
* <20><><EFBFBD><EFBFBD>: Modbusд<73>Ĵ<EFBFBD><C4B4><EFBFBD>
* <20><><EFBFBD><EFBFBD>: Addr: <20><>ַ
Value:<3A><><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
* <20><><EFBFBD><EFBFBD>: <20><>
******************************************/
static ModbusErrorCode_e ModbusCommunicationDataWrite(u16 Addr, u16 Value)
{
ModbusErrorCode_e ErrorCode;
ErrorCode = ModbusErrorCode_Success;
switch(Addr)
{
/*SN*/
case 12 ... 16:
{
Usr_Flash.FlashData.SN[Addr - 12] = Value;
Usr_Flash.Write();
}break;
/*IP<49><50>ַ*/
case 17 ... 20:
{
W5500.IP_Addr[Addr - 17] = Value;
Usr_Flash.FlashData.IP_Addr[Addr - 17] = Value;
}break;
/*<2A>˿ں<CBBF>*/
case 21:
{
W5500.W5500_Class[0].ConfigData.Port[0] = Value >> 8;
W5500.W5500_Class[0].ConfigData.Port[1] = Value & 0x00ff;
Usr_Flash.FlashData.Port[0] = Value >> 8;
Usr_Flash.FlashData.Port[1] = Value & 0x00ff;
}break;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
case 22 ... 25:
{
W5500.Sub_Mask[Addr - 22] = Value;
Usr_Flash.FlashData.Sub_Mask[Addr - 22] = Value;
}break;
case 26:
{
HSMS.Flash_ConfigData.Device_Id = Value;
Usr_Flash.FlashData.Devic_Id = Value;
Wdg.Feed();
W5500.Init();
Wdg.Feed();
Usr_Flash.Write();
}break;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
case 27 ... 30:
{
W5500.Gateway_IP[Addr - 27] = Value;
Usr_Flash.FlashData.Gateway_IP[Addr - 27] = Value;
W5500.Init();
Usr_Flash.Write();
} break;
/* <20>豸 SN */
case 100 ... 107:
{
Usr_Flash.FlashData.Device_SN[Addr - 100] = modbus_u16_to_ascii_u16(Value);
} break;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>λ<EFBFBD><CEBB> */
case 108 ... 115:
{
Usr_Flash.FlashData.Device_Model[Addr - 108] = modbus_u16_to_ascii_u16(Value);
} break;
/* <20><EFBFBD>ͺ<EFBFBD> */
case 116 ... 123:
{
Usr_Flash.FlashData.Device_ID[Addr - 116] = modbus_u16_to_ascii_u16(Value);
} break;
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B1BE> */
case 124 ... 131:
{
Usr_Flash.FlashData.Version[Addr - 124] = modbus_u16_to_ascii_u16(Value);
} break;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
case 132 ... 139:
{
Usr_Flash.FlashData.Manufacturer[Addr - 132] = modbus_u16_to_ascii_u16(Value);
} break;
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD> */
case 140 ... 147:
{
Usr_Flash.FlashData.Station_Name[Addr - 140] = modbus_u16_to_ascii_u16(Value);
} break;
/* ǻ<><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
case 148 ... 155:
{
Usr_Flash.FlashData.Chamber_Name[Addr - 148] = modbus_u16_to_ascii_u16(Value);
} break;
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD> */
case 156 ... 163:
{
Usr_Flash.FlashData.Station_Type[Addr - 156] = modbus_u16_to_ascii_u16(Value);
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Alarm_info */
case 164 ... 183:
{
Usr_Flash.FlashData.Alarm_info[Addr - 164] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Data_ID1 */
case 184:
{
Usr_Flash.FlashData.Data_ID1 = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Collection_event_ID1 */
case 185:
{
Usr_Flash.FlashData.Collection_event_ID1 = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Report_ID1 */
case 186:
{
Usr_Flash.FlashData.Report_ID1 = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Alarm_ID */
case 187:
{
Usr_Flash.FlashData.Alarm_ID = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Alarm_Type */
case 188 ... 194:
{
Usr_Flash.FlashData.Alarm_Type[Addr - 188] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Begin_Warning */
case 195 ... 201:
{
Usr_Flash.FlashData.Begin_Warning[Addr - 195] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> IDS */
case 202 ... 212:
{
Usr_Flash.FlashData.IDS[Addr - 202] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Over_Trigger */
case 213 ... 221:
{
Usr_Flash.FlashData.Over_Trigger[Addr - 213] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Equipment */
case 222 ... 226:
{
Usr_Flash.FlashData.Equipment[Addr - 222] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> E9 */
case 227 ... 245:
{
Usr_Flash.FlashData.E9[Addr - 227] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Device_Type */
case 246:
{
Usr_Flash.FlashData.Device_Type = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Sensor */
case 247:
{
Usr_Flash.FlashData.Sensor = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Alarm_value */
case 248:
{
Usr_Flash.FlashData.Alarm_value = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Alarm_ubit */
case 249:
{
Usr_Flash.FlashData.Alarm_ubit = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Start_Time */
case 250 ... 260:
{
Usr_Flash.FlashData.Start_Time[Addr - 250] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Alarm_Time */
case 261 ... 266:
{
Usr_Flash.FlashData.Alarm_Time[Addr - 261] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Alarm */
case 267 ... 272:
{
Usr_Flash.FlashData.Alarm[Addr - 267] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Data_ID2 */
case 273:
{
Usr_Flash.FlashData.Data_ID2 = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Collection_event_ID2 */
case 274:
{
Usr_Flash.FlashData.Collection_event_ID2 = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Report_ID2 */
case 275:
{
Usr_Flash.FlashData.Report_ID2 = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Sub_Device_Type */
case 276 ... 277:
{
Usr_Flash.FlashData.Sub_Device_Type[Addr - 276] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> Sub_Device_State */
case 278 ... 279:
{
Usr_Flash.FlashData.Sub_Device_State[Addr - 278] = Value;
Usr_Flash.Write();
} break;
/* Ԥ<><D4A4> State_Change_Time */
case 280 ... 281:
{
Usr_Flash.FlashData.State_Change_Time[Addr - 280] = Value;
Usr_Flash.Write();
} break;
}
return ErrorCode;
}
/******************************************
* <20><><EFBFBD><EFBFBD>: ModbusCommunicationDataRead
* <20><><EFBFBD><EFBFBD>: Modbus<75><73><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: Addr: <20><>ַ
* <20><><EFBFBD><EFBFBD>: <20><>ַ<EFBFBD><D6B7>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>: <20><>
******************************************/
static u16 ModbusCommunicationDataRead(u16 Addr)
{
u8 *p_u8Data;
u16 Data;
u16 *pData;
switch(Addr)
{
/*SV*/
case 0 ... 11:
{
p_u8Data = &SwVersion[Addr * 2];
Data = p_u8Data[1] | p_u8Data[0] << 8;
}break;
/*SN*/
case 12 ... 16:
{
Data = Usr_Flash.FlashData.SN[Addr - 12];
}break;
/*IP<49><50>ַ*/
case 17 ... 20:
{
Data = W5500.IP_Addr[Addr - 17];
}break;
/*<2A>˿ں<CBBF>*/
case 21:
{
Data = W5500.W5500_Class[0].ConfigData.Port[0] << 8 | W5500.W5500_Class[0].ConfigData.Port[1];
}break;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
case 22 ... 25:
{
Data = W5500.Sub_Mask[Addr - 22];
}break;
/*SECS2Э<32><D0AD><EFBFBD>豸ID*/
case 26:
{
Data = HSMS.Flash_ConfigData.Device_Id;
}break;
/* <20><><EFBFBD><EFBFBD>*/
case 27 ... 30:
{
Data = W5500.Gateway_IP[Addr - 27];
} break;
/* <20>豸 SN */
case 100 ... 107:
{
Data = Usr_Flash.FlashData.Device_SN[Addr - 100];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>λ<EFBFBD><CEBB> */
case 108 ... 115:
{
Data = Usr_Flash.FlashData.Device_Model[Addr - 108];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* <20><EFBFBD>ͺ<EFBFBD> */
case 116 ... 123:
{
Data = Usr_Flash.FlashData.Device_ID[Addr - 116];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B1BE> */
case 124 ... 131:
{
Data = Usr_Flash.FlashData.Version[Addr - 124];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
case 132 ... 139:
{
Data = Usr_Flash.FlashData.Manufacturer[Addr - 132];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD> */
case 140 ... 147:
{
Data = Usr_Flash.FlashData.Station_Name[Addr - 140];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* ǻ<><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
case 148 ... 155:
{
Data = Usr_Flash.FlashData.Chamber_Name[Addr - 148];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD> */
case 156 ... 163:
{
Data = Usr_Flash.FlashData.Station_Type[Addr - 156];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* Ԥ<><D4A4> Alarm_info */
case 164 ... 183:
{
Data = Usr_Flash.FlashData.Alarm_info[Addr - 164];
} break;
/* Ԥ<><D4A4> Data_ID1 */
case 184:
{
Data = Usr_Flash.FlashData.Data_ID1;
} break;
/* Ԥ<><D4A4> Collection_event_ID1 */
case 185:
{
Data = Usr_Flash.FlashData.Collection_event_ID1;
} break;
/* Ԥ<><D4A4> Report_ID1 */
case 186:
{
Data = Usr_Flash.FlashData.Report_ID1;
} break;
/* Ԥ<><D4A4> Alarm_ID */
case 187:
{
Data = Usr_Flash.FlashData.Alarm_ID;
} break;
/* Ԥ<><D4A4> Alarm_Type */
case 188 ... 194:
{
Data = Usr_Flash.FlashData.Alarm_Type[Addr - 188];
} break;
/* Ԥ<><D4A4> Begin_Warning */
case 195 ... 201:
{
Data = Usr_Flash.FlashData.Begin_Warning[Addr - 195];
} break;
/* Ԥ<><D4A4> IDS */
case 202 ... 212:
{
Data = Usr_Flash.FlashData.IDS[Addr - 202];
} break;
/* Ԥ<><D4A4> Over_Trigger */
case 213 ... 221:
{
Data = Usr_Flash.FlashData.Over_Trigger[Addr - 213];
} break;
/* Ԥ<><D4A4> Equipment */
case 222 ... 226:
{
Data = Usr_Flash.FlashData.Equipment[Addr - 222];
} break;
/* Ԥ<><D4A4> E9 */
case 227 ... 245:
{
Data = Usr_Flash.FlashData.E9[Addr - 227];
} break;
/* Ԥ<><D4A4> Device_Type */
case 246:
{
Data = Usr_Flash.FlashData.Device_Type;
} break;
/* Ԥ<><D4A4> Sensor */
case 247:
{
Data = Usr_Flash.FlashData.Sensor;
} break;
/* Ԥ<><D4A4> Alarm_value */
case 248:
{
Data = Usr_Flash.FlashData.Alarm_value;
} break;
/* Ԥ<><D4A4> Alarm_ubit */
case 249:
{
Data = Usr_Flash.FlashData.Alarm_ubit;
} break;
/* Ԥ<><D4A4> Start_Time */
case 250 ... 260:
{
Data = Usr_Flash.FlashData.Start_Time[Addr - 250];
} break;
/* Ԥ<><D4A4> Alarm_Time */
case 261 ... 266:
{
Data = Usr_Flash.FlashData.Alarm_Time[Addr - 261];
} break;
/* Ԥ<><D4A4> Alarm */
case 267 ... 272:
{
Data = Usr_Flash.FlashData.Alarm[Addr - 267];
} break;
/* Ԥ<><D4A4> Data_ID2 */
case 273:
{
Data = Usr_Flash.FlashData.Data_ID2;
} break;
/* Ԥ<><D4A4> Collection_event_ID2 */
case 274:
{
Data = Usr_Flash.FlashData.Collection_event_ID2;
} break;
/* Ԥ<><D4A4> Report_ID2 */
case 275:
{
Data = Usr_Flash.FlashData.Report_ID2;
} break;
/* Ԥ<><D4A4> Sub_Device_Type */
case 276 ... 277:
{
Data = Usr_Flash.FlashData.Sub_Device_Type[Addr - 276];
} break;
/* Ԥ<><D4A4> Sub_Device_State */
case 278 ... 279:
{
Data = Usr_Flash.FlashData.Sub_Device_State[Addr - 278];
} break;
/* Ԥ<><D4A4> State_Change_Time */
case 280 ... 281:
{
Data = Usr_Flash.FlashData.State_Change_Time[Addr - 280];
} break;
default:
Data = 0;
}
return Data;
}

View File

@@ -0,0 +1,9 @@
#ifndef _PROTO_PARA_MODBUS_H_
#define _PROTO_PARA_MODBUS_H_
#include "main.h"
#include "proto_Modbus.h"
extern proto_Modbus_t Para_Modbus;
#endif

1914
usr/protocol/proto_SECS2.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,59 @@
#ifndef _PROTO_SECS2_H_
#define _PROTO_SECS2_H_
#include "main.h"
#include "proto_HSMS.h"
#define PROTO_SECS2_S1F3 (0x0103) /*<2A><><EFBFBD>ݲɼ<DDB2>*/
#define PROTO_SECS2_S2F49 (0x0231) /*<2A>豸״̬Զ<CCAC>̿<EFBFBD><CCBF><EFBFBD>*/
#define PROTO_SECS2_S1F1 (0x0101) /*<2A><><EFBFBD><EFBFBD>*/
#define PROTO_SECS2_S6F11 (0x060B) /*<2A><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
#define PROTO_SECS2_S6F12 (0x060C) /*ȷ<>ϱ<EFBFBD><CFB1><EFBFBD>*/
#define PROTO_SECS2_S1F13 (0x010D) /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
#define PROTO_SECS2_S2F31 (0x021F) /*ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬Ŷ<CCAC>ı<EFBFBD><C4B1>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA>Ӧ*/
#define PROTO_ALARM_CHANGE_RX_WAIT (1)
#define PROTO_STATE_CHANGE_RX_WAIT (1)
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
#define PROTO_SECS2_DATA_TYPE_List 000/*<2A>˽<EFBFBD><CBBD><EFBFBD>*/
#define PROTO_SECS2_DATA_TYPE_Binary 010
#define PROTO_SECS2_DATA_TYPE_Bool 011
#define PROTO_SECS2_DATA_TYPE_ASCII 020
#define PROTO_SECS2_DATA_TYPE_JIS_8 021
#define PROTO_SECS2_DATA_TYPE_2Byte_char 022
#define PROTO_SECS2_DATA_TYPE_8Byte_int 030
#define PROTO_SECS2_DATA_TYPE_1Byte_int 031
#define PROTO_SECS2_DATA_TYPE_2Byte_int 032
#define PROTO_SECS2_DATA_TYPE_4Byte_int 034
#define PROTO_SECS2_DATA_TYPE_8Byte_float 040
#define PROTO_SECS2_DATA_TYPE_4Byte_float 044
#define PROTO_SECS2_DATA_TYPE_8Byte_uint 050
#define PROTO_SECS2_DATA_TYPE_1Byte_uint 051
#define PROTO_SECS2_DATA_TYPE_2Byte_uint 052
#define PROTO_SECS2_DATA_TYPE_4Byte_uint 054
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>*/
typedef struct
{
void *pData; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ*/
u8 w_bit; /*<2A>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA>Ӧ*/
u8 DataType; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
u8 ByteLen; /*<2A>ֽڳ<D6BD><DAB3><EFBFBD>*/
u8 DataNum; /*<2A><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>*/
}proto_SECS2_MessageData_t;
typedef struct
{
u32 sys_count;
void (*Rx_DataAnalysis)(proto_HSMS_Header_Data_t *,u8 *,u16);
void (*Tx_Alarm_Task)(void);
void (*Tx_Dev_State_Task)(void);
}proto_SECS2_t;
extern proto_SECS2_t SECS2;
#endif

View File

@@ -0,0 +1,10 @@
#include "proto_Transform.h"
#include "proto_CS200.h"
#include "string.h"
void proto_Transform_Task(void)
{
}

View File

@@ -0,0 +1,9 @@
#ifndef _PROTO_TRANSFORM_H_
#define _PROTO_TRANSFORM_H_
#include "main.h"
u8 proto_AA55_to_Modbus_Unit(u8 AA55_Uint);
u8 proto_Modbus_to_AA55_Unit(u8 Modbus_Uint);
void proto_Transform_Task(void);
#endif