OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4352|回复: 3

如何将Modbus寄存器地址,寄存器个数以及ERROM地址关联起来?

[复制链接]

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
发表于 2020-2-19 10:54:26 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 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


目前我的做法是:第一,所有那些系统参数,全部拆开成单个寄存器(密码地方有三个寄存器数据),他的优点是根据寄存器地址能够快速获取到相关参数;第二:若不拆开,也可实现,只是我觉得要获取到那些系统参数,效率上有点慢,肯定是要通过查遍法来实现。不知道我解释的清不清楚,希望贴友们给出一些办法或构思,谢谢。

最佳答案

查看完整内容[请看2#楼]

已解决,就是多费点ERROM寄存器的内容
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-2-19 10:54:27 | 显示全部楼层
已解决,就是多费点ERROM寄存器的内容
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-2-19 23:31:26 | 显示全部楼层
帮顶
回复

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
发表于 2020-12-22 10:18:27 | 显示全部楼层
个人理解,modbus协议所谓的寄存器,我们完全可以以功能码的形式替代,即,对外叫寄存器地址,对内只是一个功能码,功能码执行的内容由自己定,对应的几个EEPROM的字节大小也是由自己定,这样比较灵活.
海纳百川者,荣耀伴一生!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-17 01:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表