#pragma once #include #include #include /*定义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);