Files
secs2-bootloader/usr/protocol/proto_Para_Modbus.c

745 lines
21 KiB
C

#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;//指令解析结构体
static ModbusCommunicationSendBuf_t SendStruct;//发送结构体
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))//检查数据长度 校验是否正确
return;
if (pModbus->ID != ModbusAnalysisData.ID)//判断ID是否正确
return;
ErrorCode = ModbusErrorCode_Success;
rx_uart = (bsp_Uart_t *)other_data;
/* //检查地址是否超出范围
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;
/*特殊协议*/
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接收到的u16转换为ascii的u16 实际为对调高低字节*/
static u16 modbus_u16_to_ascii_u16(u16 modbus_u16)
{
return (modbus_u16 << 8) | (modbus_u16 >> 8);
}
/*ascii的u16 转换为modbus u16发送 实际为对调高低字节*/
static u16 ascii_u16_to_modbus_u16(u16 modbus_u16)
{
return (modbus_u16 << 8) | (modbus_u16 >> 8);
}
/******************************************
* 函数: ModbusCommunicationDataWrite
* 功能: Modbus写寄存器
* 参数: Addr: 地址
Value:数据
* 返回: 无
* 描述: 无
******************************************/
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地址*/
case 17 ... 20:
{
W5500.IP_Addr[Addr - 17] = Value;
Usr_Flash.FlashData.IP_Addr[Addr - 17] = Value;
}break;
/*端口号*/
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;
/*子网掩码*/
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;
/* 网关设置*/
case 27 ... 30:
{
W5500.Gateway_IP[Addr - 27] = Value;
Usr_Flash.FlashData.Gateway_IP[Addr - 27] = Value;
W5500.Init();
Usr_Flash.Write();
} break;
/* 设备 SN */
case 100 ... 107:
{
Usr_Flash.FlashData.Device_SN[Addr - 100] = modbus_u16_to_ascii_u16(Value);
} break;
/* 报警机台和位置 */
case 108 ... 115:
{
Usr_Flash.FlashData.Device_Model[Addr - 108] = modbus_u16_to_ascii_u16(Value);
} break;
/* 设备型号 */
case 116 ... 123:
{
Usr_Flash.FlashData.Device_ID[Addr - 116] = modbus_u16_to_ascii_u16(Value);
} break;
/* 机台软件版本号 */
case 124 ... 131:
{
Usr_Flash.FlashData.Version[Addr - 124] = modbus_u16_to_ascii_u16(Value);
} break;
/* 厂商名称 */
case 132 ... 139:
{
Usr_Flash.FlashData.Manufacturer[Addr - 132] = modbus_u16_to_ascii_u16(Value);
} break;
/* 机台名称 */
case 140 ... 147:
{
Usr_Flash.FlashData.Station_Name[Addr - 140] = modbus_u16_to_ascii_u16(Value);
} break;
/* 腔体名称 */
case 148 ... 155:
{
Usr_Flash.FlashData.Chamber_Name[Addr - 148] = modbus_u16_to_ascii_u16(Value);
} break;
/* 机台类型 */
case 156 ... 163:
{
Usr_Flash.FlashData.Station_Type[Addr - 156] = modbus_u16_to_ascii_u16(Value);
Usr_Flash.Write();
} break;
/* 预留 Alarm_info */
case 164 ... 183:
{
Usr_Flash.FlashData.Alarm_info[Addr - 164] = Value;
Usr_Flash.Write();
} break;
/* 预留 Data_ID1 */
case 184:
{
Usr_Flash.FlashData.Data_ID1 = Value;
Usr_Flash.Write();
} break;
/* 预留 Collection_event_ID1 */
case 185:
{
Usr_Flash.FlashData.Collection_event_ID1 = Value;
Usr_Flash.Write();
} break;
/* 预留 Report_ID1 */
case 186:
{
Usr_Flash.FlashData.Report_ID1 = Value;
Usr_Flash.Write();
} break;
/* 预留 Alarm_ID */
case 187:
{
Usr_Flash.FlashData.Alarm_ID = Value;
Usr_Flash.Write();
} break;
/* 预留 Alarm_Type */
case 188 ... 194:
{
Usr_Flash.FlashData.Alarm_Type[Addr - 188] = Value;
Usr_Flash.Write();
} break;
/* 预留 Begin_Warning */
case 195 ... 201:
{
Usr_Flash.FlashData.Begin_Warning[Addr - 195] = Value;
Usr_Flash.Write();
} break;
/* 预留 IDS */
case 202 ... 212:
{
Usr_Flash.FlashData.IDS[Addr - 202] = Value;
Usr_Flash.Write();
} break;
/* 预留 Over_Trigger */
case 213 ... 221:
{
Usr_Flash.FlashData.Over_Trigger[Addr - 213] = Value;
Usr_Flash.Write();
} break;
/* 预留 Equipment */
case 222 ... 226:
{
Usr_Flash.FlashData.Equipment[Addr - 222] = Value;
Usr_Flash.Write();
} break;
/* 预留 E9 */
case 227 ... 245:
{
Usr_Flash.FlashData.E9[Addr - 227] = Value;
Usr_Flash.Write();
} break;
/* 预留 Device_Type */
case 246:
{
Usr_Flash.FlashData.Device_Type = Value;
Usr_Flash.Write();
} break;
/* 预留 Sensor */
case 247:
{
Usr_Flash.FlashData.Sensor = Value;
Usr_Flash.Write();
} break;
/* 预留 Alarm_value */
case 248:
{
Usr_Flash.FlashData.Alarm_value = Value;
Usr_Flash.Write();
} break;
/* 预留 Alarm_ubit */
case 249:
{
Usr_Flash.FlashData.Alarm_ubit = Value;
Usr_Flash.Write();
} break;
/* 预留 Start_Time */
case 250 ... 260:
{
Usr_Flash.FlashData.Start_Time[Addr - 250] = Value;
Usr_Flash.Write();
} break;
/* 预留 Alarm_Time */
case 261 ... 266:
{
Usr_Flash.FlashData.Alarm_Time[Addr - 261] = Value;
Usr_Flash.Write();
} break;
/* 预留 Alarm */
case 267 ... 272:
{
Usr_Flash.FlashData.Alarm[Addr - 267] = Value;
Usr_Flash.Write();
} break;
/* 预留 Data_ID2 */
case 273:
{
Usr_Flash.FlashData.Data_ID2 = Value;
Usr_Flash.Write();
} break;
/* 预留 Collection_event_ID2 */
case 274:
{
Usr_Flash.FlashData.Collection_event_ID2 = Value;
Usr_Flash.Write();
} break;
/* 预留 Report_ID2 */
case 275:
{
Usr_Flash.FlashData.Report_ID2 = Value;
Usr_Flash.Write();
} break;
/* 预留 Sub_Device_Type */
case 276 ... 277:
{
Usr_Flash.FlashData.Sub_Device_Type[Addr - 276] = Value;
Usr_Flash.Write();
} break;
/* 预留 Sub_Device_State */
case 278 ... 279:
{
Usr_Flash.FlashData.Sub_Device_State[Addr - 278] = Value;
Usr_Flash.Write();
} break;
/* 预留 State_Change_Time */
case 280 ... 281:
{
Usr_Flash.FlashData.State_Change_Time[Addr - 280] = Value;
Usr_Flash.Write();
} break;
}
return ErrorCode;
}
/******************************************
* 函数: ModbusCommunicationDataRead
* 功能: Modbus读寄存器数据
* 参数: Addr: 地址
* 返回: 地址对应的数据
* 描述: 无
******************************************/
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地址*/
case 17 ... 20:
{
Data = W5500.IP_Addr[Addr - 17];
}break;
/*端口号*/
case 21:
{
Data = W5500.W5500_Class[0].ConfigData.Port[0] << 8 | W5500.W5500_Class[0].ConfigData.Port[1];
}break;
/*子网掩码*/
case 22 ... 25:
{
Data = W5500.Sub_Mask[Addr - 22];
}break;
/*SECS2协议设备ID*/
case 26:
{
Data = HSMS.Flash_ConfigData.Device_Id;
}break;
/* 网关*/
case 27 ... 30:
{
Data = W5500.Gateway_IP[Addr - 27];
} break;
/* 设备 SN */
case 100 ... 107:
{
Data = Usr_Flash.FlashData.Device_SN[Addr - 100];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* 报警机台和位置 */
case 108 ... 115:
{
Data = Usr_Flash.FlashData.Device_Model[Addr - 108];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* 设备型号 */
case 116 ... 123:
{
Data = Usr_Flash.FlashData.Device_ID[Addr - 116];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* 机台软件版本号 */
case 124 ... 131:
{
Data = Usr_Flash.FlashData.Version[Addr - 124];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* 厂商名称 */
case 132 ... 139:
{
Data = Usr_Flash.FlashData.Manufacturer[Addr - 132];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* 机台名称 */
case 140 ... 147:
{
Data = Usr_Flash.FlashData.Station_Name[Addr - 140];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* 腔体名称 */
case 148 ... 155:
{
Data = Usr_Flash.FlashData.Chamber_Name[Addr - 148];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* 机台类型 */
case 156 ... 163:
{
Data = Usr_Flash.FlashData.Station_Type[Addr - 156];
Data = ascii_u16_to_modbus_u16(Data);
} break;
/* 预留 Alarm_info */
case 164 ... 183:
{
Data = Usr_Flash.FlashData.Alarm_info[Addr - 164];
} break;
/* 预留 Data_ID1 */
case 184:
{
Data = Usr_Flash.FlashData.Data_ID1;
} break;
/* 预留 Collection_event_ID1 */
case 185:
{
Data = Usr_Flash.FlashData.Collection_event_ID1;
} break;
/* 预留 Report_ID1 */
case 186:
{
Data = Usr_Flash.FlashData.Report_ID1;
} break;
/* 预留 Alarm_ID */
case 187:
{
Data = Usr_Flash.FlashData.Alarm_ID;
} break;
/* 预留 Alarm_Type */
case 188 ... 194:
{
Data = Usr_Flash.FlashData.Alarm_Type[Addr - 188];
} break;
/* 预留 Begin_Warning */
case 195 ... 201:
{
Data = Usr_Flash.FlashData.Begin_Warning[Addr - 195];
} break;
/* 预留 IDS */
case 202 ... 212:
{
Data = Usr_Flash.FlashData.IDS[Addr - 202];
} break;
/* 预留 Over_Trigger */
case 213 ... 221:
{
Data = Usr_Flash.FlashData.Over_Trigger[Addr - 213];
} break;
/* 预留 Equipment */
case 222 ... 226:
{
Data = Usr_Flash.FlashData.Equipment[Addr - 222];
} break;
/* 预留 E9 */
case 227 ... 245:
{
Data = Usr_Flash.FlashData.E9[Addr - 227];
} break;
/* 预留 Device_Type */
case 246:
{
Data = Usr_Flash.FlashData.Device_Type;
} break;
/* 预留 Sensor */
case 247:
{
Data = Usr_Flash.FlashData.Sensor;
} break;
/* 预留 Alarm_value */
case 248:
{
Data = Usr_Flash.FlashData.Alarm_value;
} break;
/* 预留 Alarm_ubit */
case 249:
{
Data = Usr_Flash.FlashData.Alarm_ubit;
} break;
/* 预留 Start_Time */
case 250 ... 260:
{
Data = Usr_Flash.FlashData.Start_Time[Addr - 250];
} break;
/* 预留 Alarm_Time */
case 261 ... 266:
{
Data = Usr_Flash.FlashData.Alarm_Time[Addr - 261];
} break;
/* 预留 Alarm */
case 267 ... 272:
{
Data = Usr_Flash.FlashData.Alarm[Addr - 267];
} break;
/* 预留 Data_ID2 */
case 273:
{
Data = Usr_Flash.FlashData.Data_ID2;
} break;
/* 预留 Collection_event_ID2 */
case 274:
{
Data = Usr_Flash.FlashData.Collection_event_ID2;
} break;
/* 预留 Report_ID2 */
case 275:
{
Data = Usr_Flash.FlashData.Report_ID2;
} break;
/* 预留 Sub_Device_Type */
case 276 ... 277:
{
Data = Usr_Flash.FlashData.Sub_Device_Type[Addr - 276];
} break;
/* 预留 Sub_Device_State */
case 278 ... 279:
{
Data = Usr_Flash.FlashData.Sub_Device_State[Addr - 278];
} break;
/* 预留 State_Change_Time */
case 280 ... 281:
{
Data = Usr_Flash.FlashData.State_Change_Time[Addr - 280];
} break;
default:
Data = 0;
}
return Data;
}