115 lines
3.4 KiB
C
115 lines
3.4 KiB
C
|
#include <stdio.h>
|
||
|
#include "br_modbus_reg.h"
|
||
|
|
||
|
#include "br_dataset_def.h"
|
||
|
|
||
|
|
||
|
ModbusRegDataBlock_t DataBlocks[MODBUS_REG_BLOCK_NUM] = {
|
||
|
{
|
||
|
.block_id = 1,
|
||
|
.address = (uint32_t)(&br_dataset0),
|
||
|
.size = sizeof(BR_Dataset0_t)
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
/* private funtion prototype. */
|
||
|
uint8_t modbus_reg_write_process(uint8_t slave, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer);
|
||
|
uint8_t modbus_reg_read_process(uint8_t slave, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer);
|
||
|
|
||
|
uint8_t modbus_reg_blockdata_set(ModbusRegDataBlock_t *datablock, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer);
|
||
|
uint8_t modbus_reg_blockdata_get(ModbusRegDataBlock_t *datablock, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer);
|
||
|
|
||
|
/* public functoin definition. */
|
||
|
|
||
|
uint8_t modbus_reg_proxy(ModbusRegRwData_t * rw_data)
|
||
|
{
|
||
|
switch (rw_data->operation)
|
||
|
{
|
||
|
case RW_OPERATION_READ:
|
||
|
/* code */
|
||
|
modbus_reg_read_process(rw_data->slaveId, rw_data->startAddr, rw_data->num, rw_data->registers);
|
||
|
break;
|
||
|
case RW_OPERATION_WRITE:
|
||
|
modbus_reg_write_process(rw_data->slaveId, rw_data->startAddr, rw_data->num, rw_data->registers);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
uint8_t modbus_reg_write_process(uint8_t slaveId, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer)
|
||
|
{
|
||
|
uint8_t status = -1;
|
||
|
/* 在此实现数据写入逻辑 */
|
||
|
uint8_t blockIndex;
|
||
|
for(blockIndex=0; blockIndex<MODBUS_REG_BLOCK_NUM; blockIndex++)
|
||
|
{
|
||
|
if(DataBlocks[blockIndex].block_id == slaveId)
|
||
|
{
|
||
|
modbus_reg_blockdata_set(DataBlocks+blockIndex, startAddr, num, dataBuffer);
|
||
|
status = 0;
|
||
|
}
|
||
|
}
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
uint8_t modbus_reg_read_process(uint8_t slaveId, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer)
|
||
|
{
|
||
|
/* 在此实现数据读取逻辑 */
|
||
|
uint8_t status = -1;
|
||
|
/* 在此实现数据写入逻辑 */
|
||
|
uint8_t blockIndex;
|
||
|
for(blockIndex=0; blockIndex<MODBUS_REG_BLOCK_NUM; blockIndex++)
|
||
|
{
|
||
|
if(DataBlocks[blockIndex].block_id == slaveId)
|
||
|
{
|
||
|
modbus_reg_blockdata_get(DataBlocks+blockIndex, startAddr, num, dataBuffer);
|
||
|
status = 0;
|
||
|
}
|
||
|
}
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
uint8_t modbus_reg_blockdata_get(ModbusRegDataBlock_t *datablock, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer)
|
||
|
{
|
||
|
uint8_t i = 0;
|
||
|
uint8_t status = 1;
|
||
|
/* 操作地址范围超出datablock大小 */
|
||
|
if((startAddr+num)*2 > datablock->size) /* (startAddr+num)*2 每个寄存器数据长度为2字节对应两个内存地址 */
|
||
|
{
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(i=0; i<num; i++)
|
||
|
{
|
||
|
*(dataBuffer+i) = *((uint16_t*) startAddr + (i*2));
|
||
|
}
|
||
|
status = 0; /* return 0表示没有异常发生 */
|
||
|
}
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
uint8_t modbus_reg_blockdata_set(ModbusRegDataBlock_t *datablock, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer)
|
||
|
{
|
||
|
uint8_t i = 0;
|
||
|
uint8_t status = 1;
|
||
|
|
||
|
/* 操作地址范围超出的datablock大小 */
|
||
|
if((startAddr+num)*2 > datablock->size) /* (startAddr+num)*2 每个寄存器数据长度为2字节对应两个内存地址 */
|
||
|
{
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(i=0; i<num; i++)
|
||
|
{
|
||
|
*((uint16_t*) ( (uint32_t)datablock->address + (startAddr + i)*2 ) ) = *(dataBuffer + i);
|
||
|
}
|
||
|
status = 0; /* return 0表示没有异常发生 */
|
||
|
}
|
||
|
return status;
|
||
|
}
|