Modbus主站获取不了实际从站的数据

发表在 Modbus2019-12-4 21:21 [复制链接] 36 169

本帖最后由 coulson 于 2019-12-4 21:21 编辑
5 ~/ |/ P4 U; {) m  ^6 Y' I
! x! X7 G7 a1 @& ~1.刚接触modbus 官方的例程是向从站的寄存器写数据,我先是在官方例程的基础上把写寄存器的程序改成了读寄存器数据的程序,用Modbus Slave做从站和stm32做主站进行测试,在主站的usMRegHoldBuf[ ] [ ]里能看到从站的数据。 485_1.png
- H' i' h3 m' _: L+ h9 n- f! C! M9 e; d
2.但是在我接真实的传感器从机时,问题出现了,我所要读的传感器的地址为0x0500 我需要在0x0500开始往后读取15个寄存器,于是我的读指令变成了01 03 00 05 00 0F 05 02 ,主站发出的指令确实也是01 03 00 05 00 0F 05 02
6 h$ g% q4 M5 ]7 ^: A 主站发出.png
/ E& V2 Q  F" H7 W! X# E. Y3 U从机的传感器在收到指令后也回复了,但是我再看usMRegHoldBuf[ ] [ ]里的数据全是0,请问这个是什么问题,是因为我传感器的地址为0x0500 ,超过了主站设计的usMRegHoldBuf[ ] [ ]的地址的缘故吗?
; X7 N3 n! L; [0 l" V6 a8 f9 ?4 c" w+ [' u. Q" w# q  Y
3.我把代码放在附件里了,有了解的大神帮忙看一下。附件里上传大文件好像有问题,一直上传不了,我把modbus部分的代码放在附件了
  n6 E  y6 i4 e3 z
9 L6 m( J0 `7 S0 ]6 K+ z

sample_mb_master.c

3.02 KB, 下载次数: 24

使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-12-5 08:25:47 | 显示全部楼层
你好,我也遇到了类似的问题,你读完后返回码是什么》?
使用道具 举报 回复
发表于 2019-12-5 08:53:32 | 显示全部楼层
正确的调试办法是 查看eMBMasterReqWriteHoldingRegister 这个API的返回值。
- ~& n6 u& P' X不知道调整 user_mb_app.h里面的宏定义能不能解决你的问题
使用道具 举报 回复
发表于 2019-12-5 09:03:52 | 显示全部楼层
  1. static void send_thread_entry(void *parameter)5 w' ~# `% E2 b8 B) a3 W. Z
  2. {6 v( b: v' a' m# s4 e4 ]1 L
  3.     eMBMasterReqErrCode error_code = MB_MRE_NO_ERR;2 }, Y* u  n9 H6 B3 a0 u6 ~; v
  4.     rt_uint16_t error_count = 0;
    * E6 Z( K7 U0 p% B  L' }/ }
  5.     while (1)$ o  I/ V% P8 i' v  `/ z
  6.     {
    ( [% E5 }) ]8 \: Z( U# S
  7.            error_code = eMBMasterReqReadHoldingRegister(SLAVE_ADDR,          /* salve address */
    : d4 Q5 ]5 V6 q( T( Y9 [
  8.                                                               MB_READ_REG_START,   /* register start address */
    ! N) o. u! Y" |% \: [! {; p0 d8 [
  9.                                                               MB_READ_REG_NUM,                /* data to be written */
    . N1 {7 N; i9 o$ K
  10.                                                               RT_WAITING_FOREVER); /* timeout */
      X5 f" W$ V' S9 @
  11.                         rt_kprintf("add1--error_code: %d \n",error_code);
    2 ~! R; Z+ l" e( X# `3 _) ~
  12.                         rt_kprintf("<%#x><%#x><%#x><%#x>", usMRegHoldBuf[0][1],usMRegHoldBuf[0][2],usMRegHoldBuf[0][3],usMRegHoldBuf[0][4]);
    4 n4 o; ?/ x$ d
  13.                        
    , i  t3 e9 T  ]5 I
  14.                        
    ) S3 e+ `; U* _/ x2 M* c
  15.                        
    $ C' g3 w9 P) l4 }7 ], |
  16.                           error_code = eMBMasterReqReadHoldingRegister(0x02,          /* salve address */
    3 ]' V7 c8 G. D9 p* l
  17.                                                               MB_READ_REG_START,   /* register start address */
    . K9 x$ H0 ]0 Q- l0 }
  18.                                                               MB_READ_REG_NUM,                /* data to be written */
    7 z$ \" m6 D! u7 z/ O0 y& v
  19.                                                               RT_WAITING_FOREVER); /* timeout */
    - a# O: b, y+ C
  20.                         rt_kprintf("add2--error_code: %d \n",error_code);
    $ r+ c! D  _7 a" r
  21.                         rt_kprintf("<%#x><%#x><%#x><%#x>", usMRegHoldBuf[1][1],usMRegHoldBuf[1][2],usMRegHoldBuf[1][3],usMRegHoldBuf[1][4]);4 a. y: g4 g6 R) M8 W7 T8 N, G1 N  N
  22.                        
    ( z: `4 G( @& q2 I2 x
  23.                         ! J1 l; x* p" {7 l5 J& _
  24.                         # Q& W; _! q- e2 V# e7 b4 @/ h
  25.         /* Record the number of errors */
    . I3 p& R- {& e: x& b4 O
  26.         if (error_code != MB_MRE_NO_ERR)* i) f, L) ~2 `0 W- O
  27.         {
    * ?6 {4 e) A5 n4 z0 P  \/ _: g* I
  28.             error_count++;
      t* N. r5 s, [
  29.         }
    # J9 y+ P& @2 b
  30.     }) W4 L& g1 [; C! i3 I% T0 V
  31. }
复制代码
使用道具 举报 回复
发表于 2019-12-5 09:05:29 | 显示全部楼层
http://packages.rt-thread.org/detail.html?package=freemodbus4 S! x, E: Z. g9 g
缓存的设备ID要减1,就可以了
! ^% ~  N) A+ U# k7 R0 `, s6 V0 i3 }+ e
TIM截图20191205090426.jpg
使用道具 举报 回复
发表于 2019-12-5 09:06:32 | 显示全部楼层
$ S8 t; W3 T- f. e
这个代码测试过了。没问题
使用道具 举报 回复
发表于 2019-12-5 09:30:06 | 显示全部楼层
wwwzxddn 发表于 2019-12-5 09:06
: x: X8 Q* P) O. N* B这个代码测试过了。没问题
; h; b; Q- y0 k
ID减一我知道,可是我吧这个buff里全翻了一遍都没发现数据有变动啊
使用道具 举报 回复
发表于 2019-12-5 09:42:46 | 显示全部楼层
查下故障码,是没上来数据,还是数据有误
使用道具 举报 回复
发表于 2019-12-5 09:45:22 | 显示全部楼层
wwwzxddn 发表于 2019-12-5 09:42* y0 e& |! c4 ]  Z' x+ _! P
查下故障码,是没上来数据,还是数据有误
- c' X, t$ f- l& i3 o
error code 3' ]: d8 P8 ?" ^- o1 E9 r! K8 ?  \
使用道具 举报 回复
发表于 2019-12-5 09:53:33 | 显示全部楼层
coulson 发表于 2019-12-5 09:452 E' o/ i* E7 y* @+ z
error code 3

3 K, e, P" a6 y) |4 ?3 q" u6 |1 G: Dtypedef enum
/ S: t  G" O" P4 e$ ]{, Z1 D! E! P- L! D
    MB_MRE_NO_ERR,                  /*!< no error. */
9 [2 b  w) q: M4 h7 a4 w, Y    MB_MRE_NO_REG,                  /*!< illegal register address. */. A( D9 _: [5 C. ]) t1 H0 G2 D
    MB_MRE_ILL_ARG,                 /*!< illegal argument. */$ t8 W' ]9 [/ J
    MB_MRE_REV_DATA,                /*!< receive data error. */- M+ b- R: T3 ~. X, f1 Q; w, q- C
    MB_MRE_TIMEDOUT,                /*!< timeout error occurred. */$ P3 N: b" G5 c$ n# n+ \4 W
    MB_MRE_MASTER_BUSY,             /*!< master is busy now. */
- O& r& p) f: A. ]5 ^# t5 l    MB_MRE_EXE_FUN                  /*!< execute function error. */( }1 X/ {+ _! g% ]) z
} eMBMasterReqErrCode;
$ `/ g1 l6 @& _. z5 b1 Y' P这个error code应该是MB_MRE_REV_DATA,数据接收错误?
使用道具 举报 回复
发表于 2019-12-5 09:53:58 | 显示全部楼层
数据格式错误,检查电脑端 modbus slave设置
使用道具 举报 回复
发表于 2019-12-5 09:55:58 | 显示全部楼层
复制我刚才发的那个程序,设置好电脑端就可以运行了。其余都不用修改
使用道具 举报 回复
发表于 2019-12-5 09:56:55 | 显示全部楼层
wwwzxddn 发表于 2019-12-5 09:53
, U6 g* A# o# p数据格式错误,检查电脑端 modbus slave设置
9 z$ U5 p1 z) i/ }/ W7 I3 t
测试modbus slave是没问题的,我是接实际的传感器出现的问题4 K" x& X7 [1 k. C& |3 Y
使用道具 举报 回复
发表于 2019-12-5 09:58:46 | 显示全部楼层
传感器连接串口助手测下
使用道具 举报 回复
发表于 2019-12-5 10:00:07 | 显示全部楼层
我把传感器正常回复的数据回复给主机,也是error 3
& ?  P+ c5 C) V- T% I
使用道具 举报 回复
发表于 2019-12-5 10:01:45 | 显示全部楼层
调整下波特率和程序种的响应时间
使用道具 举报 回复
发表于 2019-12-5 10:06:44 | 显示全部楼层
wwwzxddn 发表于 2019-12-5 10:01
! S; b% Z/ X4 l" ~调整下波特率和程序种的响应时间
* ~2 d- N0 F: _. b0 o% a; x
我传感器上有两个指示灯,分别是TX和RX指示灯,传感器收到指令RX灯亮,指令正确,传感器返回数据时TX灯亮,波特率不正确时通讯不上,波特率这个我改过,问题不在这里,我在想,是不是我回复的数据有问题,因为传感器回复的数据超出数据的范围了,我把回复的数据给你看下
使用道具 举报 回复
发表于 2019-12-5 10:08:30 | 显示全部楼层
coulson 发表于 2019-12-5 10:06
$ H# \3 }5 X6 l& y: M我传感器上有两个指示灯,分别是TX和RX指示灯,传感器收到指令RX灯亮,指令正确,传感器返回数据时TX灯亮 ...

5 G5 r- K8 m( Z) U( M& _01 03 1E 00 00 08 38 00 02 00 03 00 01 00 00 00 34 00 03 00 09 00 02 00 00 00 00 00 03 00 0B 00 02 69 26 //传感器返回的数据
* D( c2 @& S4 y) |. l01 03 1E   //帧头/ I" j% }4 A9 j% w
00 00 08 38 00 02 00 03 00 01 /data1   00 00 正常 08 38 浓度 00 02 小数位2位 00 03 氧气    00 01 %VOL  2104 21.04  
5 K5 n' I: A9 ~, E00 00 00 34 00 03 00 09 00 02 //data2   00 00 正常 00 34 浓度 00 03 小数位3位 00 09 硫化氢  00 02 PPM   52   0.052! a: p- w5 h+ }0 D
00 00 00 00 00 03 00 0B 00 02 //data3  00 00 正常 00 00 浓度 00 03 小数位3位 00 0B 氨气    00 02 PPM   0    0
- l( d6 I7 |' Q69 26 //帧位校验位
使用道具 举报 回复
发表于 2019-12-5 10:10:04 | 显示全部楼层
coulson 发表于 2019-12-5 10:08* w: P% _7 {4 j  V, Z
01 03 1E 00 00 08 38 00 02 00 03 00 01 00 00 00 34 00 03 00 09 00 02 00 00 00 00 00 03 00 0B 00 02 ...

7 G1 ]( U! C  y8 ~7 F+ A: ~我感觉是这个usMRegHoldBuf[ ] [ ]装不下传感器的数据导致这样的问题7 f- D# \! J* ~, f- m
使用道具 举报 回复
发表于 2019-12-5 10:12:24 | 显示全部楼层
#define RT_M_REG_HOLDING_NREGS 100
! k; P/ I' J, s8 w! i/ M6 ^9 ?
7 T- A8 n9 c- x0 }' a这个的定义是100啊,应该不会超出
使用道具 举报 回复
发表于 2019-12-5 10:17:18 | 显示全部楼层
wwwzxddn 发表于 2019-12-5 10:12
+ G  s  f3 B' k#define RT_M_REG_HOLDING_NREGS 100  Y7 k1 Z7 k8 u' ]+ M$ \
& y: F, s- |# J5 [2 }: A
这个的定义是100啊,应该不会超出
, ~# \; b! }: M4 V7 m) L
按理说usMRegHoldBuf[0][0]应该存的data1的 00 00 usMRegHoldBuf[0][1]应该存的08 38 就按顺序这样刚好存15个,但是它报错就不知道为什么了
使用道具 举报 回复
发表于 2019-12-5 10:22:37 | 显示全部楼层
wwwzxddn 发表于 2019-12-5 10:12
; f& b- C5 B1 O: W#define RT_M_REG_HOLDING_NREGS 100
& x2 w8 z. o5 S2 D- z4 H/ p
) c1 f/ t  A/ ]4 A2 B# O- U这个的定义是100啊,应该不会超出

: ]  u0 ~/ _! x; P会不会是因为我每读1个传感器的寄存器,传感器都回复我两个字节的数据,而modbus主机把本来应该存在一起的2个字节的数据分开存在两个数组里,一共有30字节的数据,这样就有15字节的数据没地方放了?
使用道具 举报 回复
发表于 2019-12-5 10:36:26 | 显示全部楼层
用PC端 slave模拟下你这个多字节的传感器
使用道具 举报 回复
发表于 2019-12-5 10:43:54 | 显示全部楼层
wwwzxddn 发表于 2019-12-5 10:36
- v0 x2 j% }+ E3 c用PC端 slave模拟下你这个多字节的传感器

# S3 d5 C% z4 i' {& p! i) u$ `- R error2.png
. i. ~; H8 z  S' n  x
使用道具 举报 回复
发表于 2019-12-5 10:44:05 | 显示全部楼层
7 m! B1 |- d& S' Q8 m
error code 6
使用道具 举报 回复
发表于 2019-12-5 10:48:45 | 显示全部楼层
slave寄存器不够啊,要和你的传感器一致
使用道具 举报 回复
发表于 2019-12-5 10:52:23 | 显示全部楼层
wwwzxddn 发表于 2019-12-5 10:48! ~* I% A0 i7 ]7 C( G/ |6 ?
slave寄存器不够啊,要和你的传感器一致
$ J+ U, T1 l# B, w" L& Q3 X
我在程序里把寄存器数量改成10个了,slave刚好10个8 [* n3 _: Q1 {, M' d( s8 |( E/ k
使用道具 举报 回复
发表于 2019-12-5 11:09:06 | 显示全部楼层
降下波特率到9600 看好多帖子说将波特率能解决问题
使用道具 举报 回复
发表于 2019-12-5 11:12:11 | 显示全部楼层
wwwzxddn 发表于 2019-12-5 11:09# C, d- v* s6 Z# F* k
降下波特率到9600 看好多帖子说将波特率能解决问题

  i  E3 `& O; }7 h, C' M. ~现在的波特率就是9600
使用道具 举报 回复
发表于 2019-12-5 11:46:09 | 显示全部楼层
coulson 发表于 2019-12-5 11:12* q! h! r& T4 v% I! m
现在的波特率就是9600

5 N( C$ G. y' c' X libmodbus.png 兄弟,我决定先用libmodbus测试了,libmodus目前用slave测试一切正常! @( ^  N5 }0 I; D% q: m, t
使用道具 举报 回复
发表于 2019-12-5 13:26:32 | 显示全部楼层
coulson 发表于 2019-12-5 11:46# T$ j- K# D1 c% y6 ?, e6 T
兄弟,我决定先用libmodbus测试了,libmodus目前用slave测试一切正常
! x+ }) ?( ~6 W5 [6 o. R4 d8 G
MODBUS MASTER支持的寄存器最大改到大于你的地址位置,因为MODBUS MASTER 默认是从1开始到100的,你从0x500开始,那就是访问不够了啊
使用道具 举报 回复
发表于 2019-12-5 13:35:56 | 显示全部楼层
whj467467222 发表于 2019-12-5 13:26
, p/ ~0 }. p, O/ {MODBUS MASTER支持的寄存器最大改到大于你的地址位置,因为MODBUS MASTER 默认是从1开始到100的,你从0x5 ...

9 j/ v3 r" q( ]# w  E5 @嗯嗯,我试一下,我想了很久好像也只有数据存不进数组这一个问题了
使用道具 举报 回复
发表于 2019-12-5 13:36:29 | 显示全部楼层
coulson 发表于 2019-12-5 13:35* T) h+ u. V) [# D) U
嗯嗯,我试一下,我想了很久好像也只有数据存不进数组这一个问题了

+ ?. |8 T& c4 t/ G! }# v  J就是前面空了500个不知道会不会影响别的东西3 A6 p7 y/ F* U+ U' ^
使用道具 举报 回复
发表于 2019-12-5 13:56:45 | 显示全部楼层
coulson 发表于 2019-12-5 13:36
" X8 k: E2 @6 m2 @8 \就是前面空了500个不知道会不会影响别的东西

, M5 p4 ^; `, U2 \9 G这500+的buff还是第一次见
使用道具 举报 回复
发表于 2019-12-5 14:17:13 | 显示全部楼层
只是看modbus  主从协议还不行,要看具体的传感器所用的协议。
使用道具 举报 回复
发表于 2019-12-5 14:18:28 | 显示全部楼层
数据是否加CRC校验,等等。都要看清楚
使用道具 举报 回复
发表于 2019-12-5 22:30:22 | 显示全部楼层
MikeCai 发表于 2019-12-5 14:18( ~1 I1 l1 D" D/ k8 X
数据是否加CRC校验,等等。都要看清楚
. C+ Q+ u8 J+ g8 u7 x
明白,现在只是读传感器的数据,正在把功能完善
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

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