#include "modbus.h" uint8_t CoilState[(MAX_COIL_NUM + 7) / 8] = {0x00,0x00,0x00,0x00,0x00}; //线圈寄存器 uint8_t DisState[(MAX_DIS_NUM + 7) / 8] = {0x00,0x00,0x00,0x00,0x00,0x00}; //离散量寄存器 uint16_t InputReg[MAX_INPUT_REG_NUM] = {0x0000,0x0000,0x0000,0x0000}; //输入寄存器 uint16_t HoldReg[MAX_HOLD_REG_NUM] = {0, 0,0,0x00C8}; //保持寄存器 Var_Reg SamVarReg; /******************************************************************************* 函数名称 : ModbusCRC16 功 能 : CRC校验 参 数 : ptr--校验数组指针 len--校验数据长度 返 回 值 : CRC校验码,双字节 *******************************************************************************/ uint16_t ModbusCRC16(uint8_t *ptr, uint16_t len) { uint8_t i; uint16_t crc = ~0x00; if((ptr == NULL) || (len == 0xFFFF)) return crc; while(len--) { crc ^= *ptr++; for(i = 0; i < 8; i++) { if(crc & 0x01) { crc >>= 1; crc ^= 0xA001; } else { crc >>= 1; } } } return(crc); } void GetOneCoilVal(uint16_t wCoilAddr, uint8_t *pCoilVal) { uint8_t uVal; uVal = CoilState[(wCoilAddr - COIL_ADD_MIN) / 8 ]; if(uVal & ( 1 << ((wCoilAddr - COIL_ADD_MIN) % 8 ))) { *pCoilVal = 0x01; } else { *pCoilVal = 0x00; } } void GetOneDisInputVal(uint16_t wDisInputAddr, uint8_t *pDisInputVal) { uint8_t uVal; uVal = DisState[(wDisInputAddr - DIS_ADD_MIN) / 8 ]; if(uVal & ( 1 << ((wDisInputAddr - DIS_ADD_MIN) % 8 ))) { *pDisInputVal = 0x01; } else { *pDisInputVal = 0x00; } } /******************************************************************************* 函数名称 : GetHoldRegData 功 能 : 获取RegAdd的数据 参 数 : u16 RegAdd 返 回 值 : 两字节寄存器数据 *******************************************************************************/ uint16_t GetHoldRegData(uint16_t RegAdd) { int16_t wRegValue; wRegValue = HoldReg[RegAdd - HOLD_REG_ADD_MIN]; return wRegValue; } /******************************************************************************* 函数名称 : GetInputRegData 功 能 : 获取RegAdd的数据 参 数 : u16 RegAdd 返 回 值 : 两字节寄存器数据 *******************************************************************************/ uint16_t GetInputRegData(uint16_t RegAdd) { int16_t wRegValue; wRegValue = InputReg[RegAdd - INPUT_REG_ADD_MIN]; return wRegValue; } /******************************************************************************* 函数名称 : WriteHoldRegData 功 能 : 保存写入的保持寄存器数据 参 数 : u16 StartAdd 返 回 值 : 无 *******************************************************************************/ void WriteHoldRegData(uint16_t wRegAddr, uint16_t RegData) { HoldReg[wRegAddr - HOLD_REG_ADD_MIN] = RegData; } /******************************************************************************* 函数名称 : WriteOneCoilData 功 能 : 保存写入的线圈寄存器数据 参 数 : u16 StartAdd 返 回 值 : 无 *******************************************************************************/ void WriteOneCoilData(uint16_t wRegAddr, uint16_t RegData) { if(RegData == 0xFF00) { CoilState[(wRegAddr - COIL_ADD_MIN) / 8] |= 1 << ((wRegAddr - COIL_ADD_MIN) % 8); } else if(RegData == 0x0000) { CoilState[(wRegAddr - COIL_ADD_MIN) / 8] &= ~(1 << ((wRegAddr - COIL_ADD_MIN) % 8)); } }