You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.9 KiB

#pragma once
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
/*定义Modbus的操作功能码,支持01、02、03、04、05、06、15、16功能码*/
typedef enum {
// ReadCoilStatus 读线圈状态(读多个输出位的状态)
ModbusOrder01 = 0x01,
// ReadInputStatus 读输入位状态(读多个输入位的状态)
ModbusOrder02 = 0x02,
// ReadHoldingRegister 读保持寄存器(读多个保持寄存器的数值)
ModbusOrder03 = 0x03,
// ReadInputRegister 读输入寄存器(读多个输入寄存器的数值)
ModbusOrder04 = 0x04,
// WriteSingleCoil 强制单个线圈(强制单个输出位的状态)
ModbusOrder05 = 0x05,
// WriteSingleRegister 预制单个寄存器(设定一个寄存器的数值)
ModbusOrder06 = 0x06,
// WriteMultipleCoil 强制多个线圈(强制多个输出位的状态)
ModbusOrder0F = 0x0F,
// WriteMultipleRegister 预制多个寄存器(设定多个寄存器的数值)
ModbusOrder10 = 0x10,
// ReadFileRecord 读文件记录
ModbusOrder14 = 0x14,
// WriteFileRecord 写文件记录
ModbusOrder15 = 0x15,
// MaskWriteRegister 屏蔽写寄存器
ModbusOrder16 = 0x16,
// ReadWriteMultiRegister 读写多个寄存器
ModbusOrder17 = 0x17,
// ReadDeviceID读设备识别码
ModbusOrder2B = 0x2B,
} ModbusFunctionCode;
/*定义接收到指令检测错误时的错误码*/
typedef enum {
Modbus_OK = 0x00,
InvalidFunctionCode = 0x01, //不合法功能代码
IllegalDataAddress = 0x02, //非法的数据地址
IllegalDataValues = 0x03, //非法的数据值或者范围
SlaveFailure = 0x04, //从站设备故障
Acknowledgement = 0x05, //确认
SlaveDeviceBusy = 0x06, //从属设备忙
MemoryParityError = 0x08, //存储奇偶性差错
GatewayDisabled = 0x0A, //不可用网关路径
GatewayResponseFailed = 0x0B //网关目标设备响应失败
} ModbusStatus;
typedef struct {
uint8_t deviceid;
ModbusFunctionCode functionCode;
union {
/**********read************/
struct {
uint16_t startbit; // bit
uint16_t numbit; // bit
} O01; // ReadCoilStatus
struct {
uint16_t startbit; // bit
uint16_t numbit; // bit
} O02; // ReadInputStatus
struct {
uint16_t startreg; // byte
uint16_t numreg; // reg(一个reg==16bit)
} O03; // ReadInputStatus
struct {
uint16_t startreg; // byte
uint16_t numreg; // reg(一个reg==16bit)
} O04; // ReadInputStatus
/**********write************/
struct {
uint16_t startbit; // bit
uint16_t numbit; // bit
uint8_t bytenum;
uint8_t *bit;
} O0F; // WriteMultipleCoil
struct {
uint16_t startreg; // byte
uint16_t numreg; // byte
uint8_t bytenum; // numreg*2
uint8_t *reg;
} O10; // WriteMultipleCoil
} d;
} ModbusMasterData_t;
typedef struct {
ModbusFunctionCode functionCode;
uint8_t deviceId;
union {
/**********read_receipt************/
struct {
uint8_t bytenum; // bit
uint8_t *byte_table;
} O01; // ReadCoilStatus
struct {
uint8_t bytenum; // byte_table
uint8_t *byte_table;
} O02; // ReadInputStatus
struct {
uint8_t bytenum; // byte
uint8_t *reg;
} O03; // ReadInputStatus
struct {
uint8_t bytenum; // byte
uint8_t *reg;
} O04; // ReadInputStatus
/**********write_receipt************/
struct {
uint16_t startbit;
uint16_t bitnum; // bit
} O0F; // WriteMultipleCoil-->对应01
struct {
uint16_t startreg;
uint16_t regnum; // byte
} O10; // --->对应03
} d;
} ModbusSlaveData_t;
void ZGenerateCRC16CheckCodeToPacket(uint8_t *puckMsg, uint8_t packetlen);
uint16_t ZGenerateCRC16CheckCode(uint8_t *puckMsg, uint8_t usDataLen);
bool ZCheckRTUMessageIntegrity(uint8_t *message, uint8_t length);