108 lines
3.4 KiB
C
108 lines
3.4 KiB
C
#ifndef __MODBUS_H
|
||
#define __MODBUS_H
|
||
|
||
|
||
#include "stdint.h"
|
||
#include "string.h"
|
||
#include "usart.h"
|
||
#include "tim.h"
|
||
|
||
/*--------------------------------- 宏定义 -----------------------------------*/
|
||
//功能码
|
||
#define ReadCoilState 0x01 //读取线圈状态
|
||
#define ReadDisInputState 0x02 //读取输入状态
|
||
#define ReadHoldReg 0x03 //读取保持寄存器
|
||
#define ReadInputReg 0x04 //读取输入寄存器
|
||
#define WriteSingleCoil 0x05 //强制写单线圈输出状态
|
||
#define WriteSingleReg 0x06 //预设(写)单寄存器
|
||
#define WriteMultiCoil 0x0F //强制写多线圈输出状态
|
||
#define WriteMultiReg 0x10 //预设(写)多寄存器
|
||
|
||
#define COIL_ADD_MIN 0x10
|
||
#define COIL_ADD_MAX 0x5F
|
||
#define MAX_COIL_NUM ((COIL_ADD_MAX) - (COIL_ADD_MIN) + 1)
|
||
|
||
#define DIS_ADD_MIN 0x00
|
||
#define DIS_ADD_MAX 0x5F
|
||
#define MAX_DIS_NUM ((DIS_ADD_MAX) - (DIS_ADD_MIN) + 1)
|
||
|
||
#define INPUT_REG_ADD_MIN 0x00
|
||
#define INPUT_REG_ADD_MAX 0x5F
|
||
#define MAX_INPUT_REG_NUM ((INPUT_REG_ADD_MAX) - (INPUT_REG_ADD_MIN) + 1)
|
||
|
||
#define HOLD_REG_ADD_MIN 0x00
|
||
#define HOLD_REG_ADD_MAX 0x5F
|
||
#define MAX_HOLD_REG_NUM ((HOLD_REG_ADD_MAX) - (HOLD_REG_ADD_MIN) + 1)
|
||
|
||
#define BROADCAST_ADDRESS 0x00
|
||
extern int LOCAL_ADDRESS;
|
||
|
||
#define MAKEWORD(a,b) ((uint16_t)(((uint8_t)(a)) | ((uint16_t)((uint8_t)(b))) << 8))
|
||
|
||
//串口相关定义
|
||
#define UART1_RXSIZE 1024 //一帧接收数据的最大值
|
||
#define UART1_TXSIZE 1024 //一帧发送数据的最大值
|
||
#define MAX_SIZE 1024
|
||
|
||
#define MODBUS_UART uart1 //将串口改成相应的变量即可,例如用到UART1,此处改为uart1
|
||
#define MODBUS_HUART huart1 //将串口改成相应的变量即可,例如用到UART1,此处改为huart1
|
||
#define MODBUS_HTIM htim3 //将串口改成相应的变量即可,例如用到UART1,此处改为huart1
|
||
|
||
typedef enum
|
||
{
|
||
MB_EX_NONE = 0x00,
|
||
MB_EX_ILLEGAL_FUNCTION = 0x01,
|
||
MB_EX_ILLEGAL_DATA_ADDRESS = 0x02,
|
||
MB_EX_ILLEGAL_DATA_VALUE = 0x03,
|
||
MB_EX_SLAVE_DEVICE_FAILURE = 0x04,
|
||
MB_EX_ACKNOWLEDGE = 0x05,
|
||
MB_EX_SLAVE_BUSY = 0x06,
|
||
MB_EX_MEMORY_PARITY_ERROR = 0x08,
|
||
MB_EX_GATEWAY_PATH_FAILED = 0x0A,
|
||
MB_EX_GATEWAY_TGT_FAILED = 0x0B
|
||
} eMBException;
|
||
|
||
typedef union var_reg
|
||
{
|
||
uint16_t SamData [MAX_INPUT_REG_NUM]; // 采样数据
|
||
uint16_t InputReg[MAX_INPUT_REG_NUM]; // Reg 与 SamData
|
||
}Var_Reg;
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t *rx_buf; //接收缓冲数组
|
||
uint16_t rx_buf_cnt; //接收缓冲计数值
|
||
uint16_t rx_size; //接收数据大小
|
||
uint8_t rx_flag; //接收完成标志位
|
||
|
||
uint8_t *tx_buf; //发送缓冲数组
|
||
uint16_t tx_buf_cnt; //发送缓冲计数值
|
||
uint16_t tx_size; //实际发送数据大小
|
||
}UART_BUF;
|
||
|
||
extern UART_BUF uart1; //串口结构体实体
|
||
extern uint8_t RxBuffer; //接收数据中间变量
|
||
|
||
extern uint8_t CoilState[(MAX_COIL_NUM + 7) / 8];
|
||
extern uint8_t DisState [(MAX_DIS_NUM + 7) / 8];
|
||
extern uint16_t InputReg[MAX_INPUT_REG_NUM];
|
||
extern uint16_t HoldReg[MAX_HOLD_REG_NUM];
|
||
|
||
extern Var_Reg SamVarReg;
|
||
|
||
void modbus_rtu_init(void);//RTU初始化
|
||
void modbus_rx_cb(void);
|
||
|
||
uint16_t ModbusCRC16(uint8_t *ptr, uint16_t len);
|
||
void GetOneCoilVal(uint16_t wCoilAddr, uint8_t *pCoilVal);
|
||
void GetOneDisInputVal(uint16_t wDisInputAddr, uint8_t *pDisInputVal);
|
||
uint16_t GetHoldRegData(uint16_t RegAdd);
|
||
uint16_t GetInputRegData(uint16_t RegAdd);
|
||
void WriteHoldRegData(uint16_t wRegAddr, uint16_t RegData);
|
||
void WriteOneCoilData(uint16_t wRegAddr, uint16_t RegData);
|
||
void modbus_process_rtu(void);
|
||
|
||
#endif
|
||
|
||
|