134 lines
3.3 KiB
C
134 lines
3.3 KiB
C
#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,0x0064}; //保持寄存器
|
||
|
||
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));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|