Modbus通讯协议的C语言实现

Modbus通讯协议的C语⾔实现
刚写完⼀个modbus通讯协议,调试完,整理出来了,软件代码只能为⼤家提供⼀个思路,仅供参考。
//communication.h
#include "H01_Global\_Define.h"
#include "H01_Global\base_types.h"
#define SIZE_BUF_RECE 100
#define SIZE_BUF_TRAN 100
#define TRANS_TIMER_DELAY_1MS    1
#define TRANS_TIMER_DELAY_10MS  10
#define TRANS_TIMER_DELAY_100MS  100
#define TRANS_TIMER_DELAY_1S  1000
typedef union
压铸机料筒的设计{
uint16_t word;
struct
{
uint8_t low;
uint8_t high;
}byte;
struct
{
uint8_t bit0:1;
uint8_t bit1:1;
uint8_t bit2:1;
uint8_t bit3:1;
uint8_t bit4:1;
uint8_t bit5:1;
uint8_t bit6:1;
uint8_t bit7:1;
uint8_t bit8:1;
uint8_t bit9:1;
uint8_t bit10:1;
uint8_t bit11:1;
uint8_t bit12:1;
uint8_t bit13:1;
uint8_t bit14:1;
uint8_t bit15:1;
}BIT;
}WORD_BYTE;
typedef struct
{
uint32_t MODBUS_Reg_Set_Speed;
uint32_t MODBUS_Reg_Set_Enable_VSP;
uint32_t MODBUS_Reg_Set_Dir;
uint32_t MODBUS_Reg_Force_Stop;
}MODBUS_HOLDING_REGISTORS;
typedef struct
{
uint32_t MODBUS_Reg_Get_Motor_Type;
uint32_t MODBUS_Reg_Get_Software_Version;
uint32_t MODBUS_Reg_Get_Running_Status;
uint32_t MODBUS_Reg_Get_Running_Speed;
uint32_t MODBUS_Reg_Get_Phase_Current;
uint32_t MODBUS_Reg_Get_IPM_Temperature;
uint32_t MODBUS_Reg_Get_DC_Voltage;
uint32_t MODBUS_Reg_Get_Running_Dir;
uint32_t MODBUS_Reg_Get_Errors;
}MODBUS_INPUT_REGISTORS;
}MODBUS_INPUT_REGISTORS;
typedef struct
{
uint32_t dev_comm;
uint32_t delay_tran;
uint32_t Function_Code;
uint32_t flag_state;
uint32_t addr_dev;
uint32_t pt_tran;
uint32_t pt_rece;
uint32_t len_tran;
uint32_t len_rece;
uint32_t xorsum_rece;
uint32_t addsum_rece;
uint32_t xorsum_tran;
uint32_t addsum_tran;
uint32_t flag_trans_start;
uint32_t flag_trans_end;
uint32_t flag_trans_timer_ON;
uint32_t count_trans_timer_1ms;
uint32_t count_trans_timer_10ms;
uint32_t count_trans_timer_100ms;
uint32_t count_trans_timer_1s;
WORD_BYTE address_reg;
WORD_BYTE num_reg;
uint32_t buf_rece[SIZE_BUF_RECE];
uint32_t buf_tran[SIZE_BUF_TRAN];
MODBUS_HOLDING_REGISTORS Modbus_Holding_Reg ;
MODBUS_INPUT_REGISTORS Modbus_Input_Reg;
}MODBUS_COMM;
extern void Uart_Trans(void);
extern void Uart_Receive(void);
extern void Init_Modbus(void);
extern void Timer_Task(void);
extern void Proc_Modbus_Data(void);点云扫描
extern uint32_t Read_Reg_Modbus(MODBUS_COMM *modbus);
void Set_Reg_Modbus(MODBUS_COMM *modbus, WORD_BYTE data); extern void CRC_Rece_Check(void);
extern uint32_t Flag_Trans_End;
extern uint32_t Timer_Count;
extern uint32_t Timer_1s;
// communication.c
电热丝绕线机
#include "H05_User\AllInOne.h"
/*****************************************************************************/
/* Local pre-processor symbols/macros ('#define')                            */
/*****************************************************************************/
#define MAX_DEV_COMM 4
#define DELAY_SENT 20移动pc
/*****************************************************************************/
/* Global variable definitions (declared in header file with 'extern')      */ /*****************************************************************************/
/*****************************************************************************/
/* Local type definitions ('typedef')                                        */
/*****************************************************************************/
typedef enum
{
Reg_Set_Speed = 100,  //100
Reg_Set_Enable_VSP,  //101
Reg_Set_Dir,        //102
Reg_Force_Stop
}Modbus_Holding_Registors;
}Modbus_Holding_Registors;
typedef enum
{
Reg_Get_Motor_Type = 200, //200
Reg_Get_Software_Version, //201
Reg_Get_Running_Status,  //202
Reg_Get_Running_Speed,    //203
Reg_Get_Phase_Current,    //204
Reg_Get_IPM_Temperature,  //205
Reg_Get_DC_Voltage,      //206
Reg_Get_Running_Dir,      //207
Reg_Get_Errors            //208
}Modbus_Input_Registors;
enum
{
MODBUS_State_Idle = 0,
MODBUS_State_Receive,
MODBUS_State_Transmit
};
烧结烟气脱硫/*****************************************************************************/ /* Local variable definitions ('static')                                    */ /*****************************************************************************/ uint32_t Timer_Count;
uint32_t Timer_1s;
uint32_t Flag_Trans_End;
extern uint32_t Software_Version;
extern MODBUS_COMM modbus_comm;
extern MODBUS_COMM *modbus;
void Init_Modbus()
{
uint32_t temp = 0;
modbus = &modbus_comm;
modbus->addr_dev = 1;
modbus->dev_comm = 0;
modbus->delay_tran = 0;
modbus->Function_Code = 0;
modbus->flag_state = MODBUS_State_Idle;
modbus->pt_tran = 0;
modbus->pt_rece = 0;
modbus->len_tran = 0;
modbus->len_rece = 0;
modbus->xorsum_rece = 0;
modbus->xorsum_tran = 0;
modbus->addsum_rece = 0;
modbus->addsum_tran = 0;
modbus->flag_trans_start = 0;
modbus->flag_trans_end = 1;
modbus->flag_trans_timer_ON = 0;
modbus->count_trans_timer_1ms = 0;
modbus->count_trans_timer_10ms = 0;
modbus->count_trans_timer_100ms = 0;
modbus->count_trans_timer_1s = 0;
modbus->address_reg.word = 0;
modbus->num_reg.word = 0;
for(temp = 0; temp<SIZE_BUF_RECE; temp++)
{
modbus->buf_rece[temp] = 0;
}
for(temp=0; temp<SIZE_BUF_TRAN; temp++)
{
modbus->buf_tran[temp] = 0;
modbus->buf_tran[temp] = 0;
}
modbus->Modbus_Input_Reg.MODBUS_Reg_Get_DC_Voltage = 0;
modbus->Modbus_Input_Reg.MODBUS_Reg_Get_Errors = 0;
modbus->Modbus_Input_Reg.MODBUS_Reg_Get_IPM_Temperature = 0;
modbus->Modbus_Input_Reg.MODBUS_Reg_Get_Motor_Type = 0;
modbus->Modbus_Input_Reg.MODBUS_Reg_Get_Phase_Current = 0;
modbus->Modbus_Input_Reg.MODBUS_Reg_Get_Running_Dir = 0;
modbus->Modbus_Input_Reg.MODBUS_Reg_Get_Running_Speed = 0;
modbus->Modbus_Input_Reg.MODBUS_Reg_Get_Running_Status = 0;
modbus->Modbus_Input_Reg.MODBUS_Reg_Get_Software_Version = Software_Version; }
void Uart_Trans()
{
uint32_t data_trans;
if(modbus->flag_trans_start)
{
if(modbus->pt_tran < modbus->len_tran)
{
if(UART_SpiUartGetTxBufferSize() == 0)
{
data_trans = modbus->buf_tran[modbus->pt_tran];
UART_UartPutChar(data_trans);
modbus->pt_tran++;
modbus->flag_trans_end = 0;
}
}
else
{
modbus->pt_tran = 0;
modbus->pt_rece = 0;
modbus->flag_trans_start = 0;
modbus->flag_trans_end = 1;
modbus->flag_state = MODBUS_State_Idle;
}
}
else
{
modbus->pt_tran = 0;
}
}
void Uart_Receive()
{
uint32_t data_rece;
data_rece = UART_UartGetChar();
if(modbus->flag_state)
{
modbus->pt_rece = 0;
}
else
{
if((modbus->pt_rece)&&(modbus->addr_dev == modbus->buf_rece[0]))
{
if(modbus->dev_comm > MAX_DEV_COMM)
{
modbus->pt_rece = 0;
}
modbus->buf_rece[modbus->pt_rece] = data_rece;
modbus->pt_rece++;
if(modbus->pt_rece < 8)
{
if(modbus->pt_rece == 7)
{
{
if(modbus->buf_rece[1] >= 0x0F)
{
modbus->len_rece = modbus->buf_rece[6]+9;
}
else
{
modbus->len_rece = 8;
}
}
}
else if(modbus->pt_rece >= modbus->len_rece)
{
modbus->pt_rece = 0;
modbus->flag_state = MODBUS_State_Receive;
if(modbus->buf_rece[0])
{
循环氢压缩机modbus->delay_tran = DELAY_SENT;
}
}
}
else
{
if((modbus->addr_dev == data_rece) || (data_rece == 0))
{
modbus->buf_rece[0] = data_rece;
modbus->pt_rece = 1;
}
}
}
modbus->dev_comm = 0;
}
void Timer_Task()
{
Timer_Count++;
if(Timer_Count >= 5000)
{
Timer_Count = 0;
Timer_1s++;
}
if(modbus->flag_trans_timer_ON)
{
modbus->count_trans_timer_100ms++;
if(modbus->count_trans_timer_100ms >= TRANS_TIMER_DELAY_100MS)  {
modbus->count_trans_timer_100ms = 0;
modbus->flag_trans_timer_ON = 0;
modbus->flag_trans_start = 1;
}
}
}
uint32_t Read_Reg_Modbus(MODBUS_COMM *modbus)
{
WORD_BYTE dat;
uint32_t addr;
addr = modbus->address_reg.word;
dat.word = 0;
if(modbus->Function_Code == 3)
{
switch(addr)
{
case Reg_Set_Speed:
dat.word = modbus->Modbus_Holding_Reg.MODBUS_Reg_Set_Speed;  break;

本文发布于:2024-09-20 16:31:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/108996.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:只能   提供   脱硫   调试
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议