#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; }