OpenEdv-开源电子网

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

移植freemodbus?第一个寄存器的数读不上来,求分析,解决!谢谢!

[复制链接]

53

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-10
在线时间
84 小时
发表于 2016-1-28 15:28:16 | 显示全部楼层 |阅读模式
2金钱
第一个寄存器的数读不上来,求分析,解决!谢谢!
04:输入寄存器
/* ----------------------- Defines ------------------------------------------*/
#define REG_INPUT_START 0
#define REG_INPUT_NREGS 4

/* ----------------------- Static variables ---------------------------------*/
static USHORT   usRegInputStart = REG_INPUT_START;
static USHORT   usRegInputBuf[REG_INPUT_NREGS]={0x1111,0x2222,0x3333,0x4444};
/* ----------------------- Start implementation -----------------------------*/


03:保持寄存器
/* ----------------------- Defines ------------------------------------------*/
#define REG_HOLDING_START 0x0000
#define REG_HOLDING_NREGS 8
uint16_t usRegHoldingBuf[REG_HOLDING_NREGS]= {0x147b,0x3f8e(变量),0x147b,0x400e,0x1eb8,0x4055,0x147b,0x408e};



最佳答案

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

不是的,实际上modbus协议原本是用在plc上的,plc的第一个数据起始地址就是1。 你看你现在设置为0,但是第一个数据无法读出,因为你从modbusPoll发出去看上去是从0开始读取的,但是freemodbus转换后起始地址是1,读取数据函数里读取哪个地址使用的地址是iRegIndex = ( int )( usAddress - REG_INPUT_START );所以导致你第一个(0号)数据无法读取,你改成REG_INPUT_START = 1,那么其实地址就是你数组的buf[0]数据了。你可以试 ...
打铁还需自身硬@ing
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-1-28 15:28:17 | 显示全部楼层
gaoxiaohu110 发表于 2016-1-28 16:43
那岂不是  数组里第一个数就通讯不上来了呢?

不是的,实际上modbus协议原本是用在plc上的,plc的第一个数据起始地址就是1。
你看你现在设置为0,但是第一个数据无法读出,因为你从modbusPoll发出去看上去是从0开始读取的,但是freemodbus转换后起始地址是1,读取数据函数里读取哪个地址使用的地址是iRegIndex = ( int )( usAddress - REG_INPUT_START );所以导致你第一个(0号)数据无法读取,你改成REG_INPUT_START  = 1,那么其实地址就是你数组的buf[0]数据了。你可以试试对不对先、、、、、
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-1-28 16:12:02 | 显示全部楼层
#define REG_INPUT_START 1所有功能码起始地址从1开始即可
回复

使用道具 举报

53

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-10
在线时间
84 小时
 楼主| 发表于 2016-1-28 16:43:18 | 显示全部楼层
365mcu 发表于 2016-1-28 16:12
#define REG_INPUT_START 1所有功能码起始地址从1开始即可

那岂不是  数组里第一个数就通讯不上来了呢?
打铁还需自身硬@ing
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-1-29 08:24:14 | 显示全部楼层
我前段时间移植了,M3和M4都没法跑,最近都没弄了,楼主移植的能跑?
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-1-29 08:42:00 | 显示全部楼层
使用modbuspoll。
plc地址从1开始。
小小蜗牛
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2020-8-30
在线时间
5 小时
发表于 2020-10-27 20:06:58 | 显示全部楼层
2楼是正解。我也是花了时间去找资料。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 16:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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