本帖最后由 jiangyy 于 2020-2-19 10:56 编辑
各位贴友们,中午好!最近在忙着做modbus协议,底层基本上已经做好了。但是现在面临一个问题就是如何将modbus寄存器地址、寄存器个数、ERROM地址关联起来?下面我简单的介绍一下我系统参数的架构思想:
一、建立系统参数结构体成员变量
#define MAX_PARAM_NUM 0xBD
#define MAX_PARAM_SIZE 20
typedef struct
{
u8 ucAcs; // 0- 读 only, 1- 可读可写
u16 uiE2rAddr; //ERROM的地址
u8 ucSize; // 系统参数的大小
u16 uiModAddr; //Modbus 地址
u16 ucDefault[MAX_PARAM_SIZE]; //数据数组
} TParam;
extern u16 ucParamMem[MAX_PARAM_NUM][MAX_PARAM_SIZE];
extern const TParam paramTable[MAX_PARAM_NUM];//系统参数
二、系统参数表
u16 ucParamMem[MAX_PARAM_NUM][MAX_PARAM_SIZE];//用来传递/存储modbus数据
const TParam paramTable[MAX_PARAM_NUM] =
{
//读写,E2M存储地址,寄存器个数,寄存器地址,寄存器数据
{0, 0xFFFF, 1, 16, 0x0000}, // 1- Fw version
{1, 0x0058, 3, 44, 0xFFFF, 0xFFFF, 0xFFFF}, // 2- 密码1
{1, 0x005E, 3, 47, 0xFFFF, 0xFFFF, 0xFFFF}, // 3- 密码2
{1, 0x0064, 3, 50, 0xFFFF, 0xFFFF, 0xFFFF}, // 4- 密码3
{1, 0x006A, 3, 53, 0xFFFF, 0xFFFF, 0xFFFF}, // 5- 密码4
{1, 0x0070, 3, 56, 0xFFFF, 0xFFFF, 0xFFFF}, // 6- 密码5
{1, 0x0076, 3, 59, 0xFFFF, 0xFFFF, 0xFFFF}, // 7- 密码6
{1, 0x0032, 1, 25, 0x07E4}, // 8- 生产日期:年
{1, 0x0034, 1, 26, 0x0001}, // 9- 生产日期:月
{1, 0x0036, 1, 27, 0x0001}, // 10- 生产日期:日
}
三、疑问
1.主机请求数据,如何根据前提条件是否支持当前寄存器读写?比如说本来是读的指令,结果主机发过来的是写的指令,这样如何执行下去?
2.主机请求数据,如果是写数据,如何将数据存到ERROM里面?这个地方疑点就是从机接收到主机读/写数据请求,如何通过系统参数表确定寄存器个数?
3.现在我的想法是,有什么办法将系统参数表的读写、E2M存储地址、寄存器个数、寄存器地址关联起来,这样我可以通过主机请求数据,通过系统参数表找到对应的寄存器个数及E2M地址以及读写ucAcs
目前我的做法是:第一,所有那些系统参数,全部拆开成单个寄存器(密码地方有三个寄存器数据),他的优点是根据寄存器地址能够快速获取到相关参数;第二:若不拆开,也可实现,只是我觉得要获取到那些系统参数,效率上有点慢,肯定是要通过查遍法来实现。不知道我解释的清不清楚,希望贴友们给出一些办法或构思,谢谢。
|