generic_io/EDINAMUR/modbus/Src/modbus.c

136 lines
3.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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,0x0000}; //保持寄存器
Var_Reg SamVarReg;
int LOCAL_ADDRESS = 2;
/*******************************************************************************
函数名称 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));
}
}