|
|
#pragma once
#include <stdbool.h>
#include <stdint.h>
/**
* @brief * * dep: * basic_type.h * * * TODO: * Ŀǰ����ͨ���Ĺ����� * 0x04 * 0x10 * */
/*����Modbus�IJ��������룬֧��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; /**
* @brief ����CRC16У���� * * @param puckMsg ����ָ�� * @param usDataLen ���ݳ���(������CRC16) * @return uint16_t */ uint16_t modbus_gen_crc16(uint8_t *puckMsg, uint8_t usDataLen); /**
* @brief ��CRC16У�������ӵ����ݰ��� * * @param puckMsg ����ָ�룬������Ԥ������λ�ø�CRC16 * @param packetlen ���ݳ��� */ void modbus_pack_crc_to_packet(uint8_t *puckMsg, uint8_t packetlen); /**
* @brief ����CRC16У���� * * @param message ����ָ�� * @param length ���ݳ���(����CRC16) * @return true У���ɹ� * @return false У��ʧ�� */ bool modbus_checkcrc16(uint8_t *message, uint8_t length);
|