brisonus_qc_dsp_com/br_modbus_reg.c
JingweiCui f8a6647b59 [update] 修复了br_com_process中的错误
使用了错误的buffer,导致无法正确处理接收到的消息数据。
2025-01-09 18:54:01 +08:00

123 lines
3.5 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)
{
uint8_t status = 1;
switch (rw_data->operation)
{
case RW_OPERATION_READ:
/* code */
if(modbus_reg_read_process(rw_data->slaveId, rw_data->startAddr, rw_data->num, rw_data->registers)==0)
{
status = 0;
}
break;
case RW_OPERATION_WRITE:
if(modbus_reg_write_process(rw_data->slaveId, rw_data->startAddr, rw_data->num, rw_data->registers) == 0)
{
status = 0;
}
break;
default:
break;
}
return status;
}
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*)(void *) ( (uint32_t)datablock->address + (startAddr + i)*2 ) ) = *(dataBuffer + i);
}
status = 0; /* return 0表示没有异常发生 */
}
return status;
}