搜索
bottom↓
楼主: Akendy

Modbus协议中线圈、寄存器等的疑问?

[复制链接]
(376617292)

出0入0汤圆

发表于 2009-5-12 17:08:46 | 显示全部楼层 |阅读模式
看了差不多3天的Modbus了,但仍有很多疑问,盼大侠门帮忙回复一下

modbus协议中提到线圈、寄存器地址等定义,如下表:
1、线圈可不可以直接定义成一个位变量或者直接置某变量的某一位?
2、功能码01与02有什么区别? 03与04有什么区别?
3、功能码11和12分别是什么意思?
4、表2的数据类型是不是指相应的功能码只能传送或修改相应的数据类型,比如功能码01只能进行位的操作?
5、功能码实现的功能可不可以自己随便定义?比如让01功能实现某变量自加或进行EEP操作等?
6、对于CRC16,我用模2除得到的校验码与用查表法得到的数据始终不一样,不晓得是为什么?(为计算简单,只取一个8位二进制数算校验码。而且用同样的方法,对应书上的简单例子(比如,4位二进制,R=3)的校验用模2除是对的)






         表1 ModBus功能码
功能码         名称                    作用
01         读取线圈状态        取得一组逻辑线圈的当前状态(ON/OFF)
02         读取输入状态         取得一组开关输入的当前状态(ON/OFF)
03         读取保持寄存器         在一个或多个保持寄存器中取得当前的二进制值
04         读取输入寄存器         在一个或多个输入寄存器中取得当前的二进制值
05         强置单线圈         强置一个逻辑线圈的通断状态
06         预置单寄存器         把具体二进值装入一个保持寄存器
07         读取异常状态         取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态
08         回送诊断校验         把诊断校验报文送从机,以对通信处理进行评鉴
09         编程(只用于484)         使主机模拟编程器作用,修改PC从机逻辑
10         控询(只用于484)         可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送
11         读取事件计数         可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时
12         读取通信事件记录         可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误
13         编程(184/384 484 584)         可使主机模拟编程器功能修改PC从机逻辑
14         探询(184/384 484 584)         可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送
15         强置多线圈         强置一串连续逻辑线圈的通断
16         预置多寄存器         把具体的二进制值装入一串连续的保持寄存器
17         报告从机标识         可使主机判断编址从机的类型及该从机运行指示灯的状态
18         (884和MICRO 84)         可使主机模拟编程功能,修改PC状态逻辑
19         重置通信链路         发生非可修改错误后,是从机复位于已知状态,可重置顺序字节
20         读取通用参数(584L)         显示扩展存储器文件中的数据信息
21         写入通用参数(584L)         把通用参数写入扩展存储文件,或修改之
22~64         保留作扩展功能备用        
65~72         保留以备用户功能所用         留作用户功能的扩展编码
73~119         非法功能        
120~127         保留         留作内部作用
128~255         保留         用于异常应答


         表2 ModBus功能码与数据类型对应表
代码        功能        数据类型
01        读        位
02        读        位
03        读        整型、字符型、状态字、浮点型
04        读        整型、状态字、浮点型
05        写        位
06        写        整型、字符型、状态字、浮点型
08        N/A        重复“回路反馈”信息
15        写        位
16        写        整型、字符型、状态字、浮点型
(376602924)

出0入0汤圆

发表于 2009-5-12 21:08:14 | 显示全部楼层
1、可以
2、01:线圈,继电器状态
   02:输入,开关量状态
   03:保持寄存器,设置的各种参数
   04:输入寄存器,实时数据
3、11:通信超时或错误时询问用
   12:询问从机检测到的各种故障、异常事件
4、功能码01、02读到的位满8个组合成一个字节,可以用功能04读取
5、不可以
6、#include <util/crc16.h>(未验证过)
(376556766)

出0入0汤圆

 楼主| 发表于 2009-5-13 09:57:32 | 显示全部楼层
【1楼】 helloshi

2、01:线圈,继电器状态
   02:输入,开关量状态
   03:保持寄存器,设置的各种参数
   04:输入寄存器,实时数据

问:
1、这里提到的保持和输入寄存器是不是可以直接对应某一个变量,而不是指真正的寄存器?继电器状态和开关量状态也是这样?
2、好多资料都提到单片机上应用Modbus一般不会是标准的Modbus,是Modbus的一个变形。那可否用04功能来读系统设置的参数,03功能来读取AD或其它检测的实时数据?或者由03或04中的一个来完成读系统设置的参数和AD或其它设备检测到的实时数据。


另:能不能请哪位对我的Modbus应用给个参考意见,我要实现的功能其实很简单:
     单片机要发送设置的各种参数和现在状态到上位机,同时也能接收上位机的指令(如修改参数、启动、停止命令等)。
     现在暂时只需要编单片机的程序,不需要编上位机程序。
     发送到上位机:参数是22个整型变量,状态就是启、运行、停、待机以及错误代码
     从上位机接收:22个整型变量参数的修改(每次单片修改即可),启、停、急停、清除错误代码(急停与清除错误代码可复用,启、停不能复用)
    如果在此留言不方便,可以QQ:1043101800
(376524077)

出0入0汤圆

发表于 2009-5-13 19:02:21 | 显示全部楼层
1、这里提到的保持和输入寄存器是不是可以直接对应某一个变量,而不是指真正的寄存器?继电器状态和开关量状态也是这样?
  是的。

2、好多资料都提到单片机上应用Modbus一般不会是标准的Modbus,是Modbus的一个变形。那可否用04功能来读系统设置的参数,03功能来读取AD或其它检测的实时数据?或者由03或04中的一个来完成读系统设置的参数和AD或其它设备检测到的实时数据。
  如果你要和别家的Modbus兼容,哪你要按标准。读系统设置的参数用03,读取AD或其它检测的实时数据用04。如果不需要兼容则随便什么功能码
(376522486)

出0入0汤圆

发表于 2009-5-13 19:28:52 | 显示全部楼层
先定义一个变量区如: uint modbus_data [50]

再定义那些保持寄存器和输入寄存器

如:
保持寄存器:M30001-M300022  // 存放设置的参数,用 03读,16写
输入寄存器:M40001-M40028  // 存放实时数据,启、运行、停、待机以及错误代码 ,用04读

#define M30001  modbus_data[0]
#define M30002  modbus_data[1]
。。。。。。。。。
#define M30021  modbus_data[20]
#define M30022  modbus_data[21]

#define M40001  modbus_data[22]
#define M40002  modbus_data[23]
。。。。。。。。。
#define M400021  modbus_data[48]
#define M400028  modbus_data[49]
(376427595)

出0入0汤圆

 楼主| 发表于 2009-5-14 21:50:23 | 显示全部楼层
根据楼上的意思,似乎只要不与其它兼容的话,应该随便用哪个功能码来实现都可以,只要校验确定,其它一些如每字节间隔时间与每字间隔时间按要求来就可以了,可以这样理解吧?


别人应用的话只要给出每个命令的语法别人参考就可以!?
(376354808)

出0入0汤圆

发表于 2009-5-15 18:03:30 | 显示全部楼层
采用MODBUS的帧格式,而不采用其协议来解析报文完全可以,这样相当于保密了,丧失通用性。

建议还是使用预留的命令码来完成自定义的命令语法。

我也正在搞触摸屏和AVR之间的modbus,也打算自定义命令。
(376279475)

出0入0汤圆

发表于 2009-5-16 14:59:03 | 显示全部楼层
用的到  留个记号
(376090716)

出0入0汤圆

发表于 2009-5-18 19:25:02 | 显示全部楼层
楼主进展如何?
(370074746)

出0入0汤圆

发表于 2009-7-27 10:31:12 | 显示全部楼层
跟随,关注着,最近也在研究这个
(346019079)

出0入0汤圆

发表于 2010-5-1 20:38:59 | 显示全部楼层
郁闷中,弄了好多天 没啥进展
(329510717)

出0入0汤圆

发表于 2010-11-8 22:18:21 | 显示全部楼层
那不同功能码的寄存器地址是不是也不一样?
(322721020)

出0入0汤圆

发表于 2011-1-26 12:19:58 | 显示全部楼层
仔细看了一下楼上几位的发言,基本明白这个线圈,保持寄存器,输入寄存器的联系和区别!
也明白了,协议时死的,人是活的,工程师应该学会变通
(320001063)

出0入0汤圆

发表于 2011-2-26 23:52:35 | 显示全部楼层
学习了
(319760972)

出0入0汤圆

发表于 2011-3-1 18:34:06 | 显示全部楼层
mark
(319521677)

出0入0汤圆

发表于 2011-3-4 13:02:21 | 显示全部楼层
看了之后,感觉懂了不少,先记号,以后再看
(319089516)

出0入0汤圆

发表于 2011-3-9 13:05:02 | 显示全部楼层
mark
(309682743)

出0入0汤圆

发表于 2011-6-26 10:04:35 | 显示全部楼层
记号
(309681766)

出0入0汤圆

发表于 2011-6-26 10:20:52 | 显示全部楼层
标记下
(297893122)

出0入0汤圆

发表于 2011-11-9 20:58:16 | 显示全部楼层
mark
(294884157)

出0入0汤圆

发表于 2011-12-14 16:47:41 | 显示全部楼层
顶一下。
(291250821)

出0入0汤圆

发表于 2012-1-25 18:03:17 | 显示全部楼层
mark
(290893976)

出0入0汤圆

发表于 2012-1-29 21:10:42 | 显示全部楼层
标记!
(290893495)

出0入0汤圆

发表于 2012-1-29 21:18:43 | 显示全部楼层
标记!
(284605861)

出0入0汤圆

发表于 2012-4-11 15:52:37 | 显示全部楼层
学习了
(266615274)

出0入0汤圆

发表于 2012-11-5 21:15:44 | 显示全部楼层
学习啦
(263628920)

出0入0汤圆

发表于 2012-12-10 10:48:18 | 显示全部楼层
学习了。MARK
(263541686)

出0入0汤圆

发表于 2012-12-11 11:02:12 | 显示全部楼层
先mark一下
(260380834)

出0入0汤圆

发表于 2013-1-17 01:03:04 | 显示全部楼层
????????????
(259992366)

出0入0汤圆

发表于 2013-1-21 12:57:32 | 显示全部楼层
学习了,Modbus正在研究中。。。
(259633389)

出0入0汤圆

发表于 2013-1-25 16:40:29 | 显示全部楼层
以后用的着标记下
(255123771)

出0入0汤圆

发表于 2013-3-18 21:20:47 | 显示全部楼层
mark了,留下记号!!
(253932246)

出0入0汤圆

发表于 2013-4-1 16:19:32 | 显示全部楼层
学习中,Mark下!
(241080305)

出0入0汤圆

发表于 2013-8-28 10:18:33 | 显示全部楼层
学学,最近也在研究这个
(241077511)

出0入0汤圆

发表于 2013-8-28 11:05:07 | 显示全部楼层
學習了,標祝一下
(238916267)

出0入0汤圆

发表于 2013-9-22 11:25:51 | 显示全部楼层
正在研究中,mark一下
(238906693)

出0入0汤圆

发表于 2013-9-22 14:05:25 | 显示全部楼层
我做过一些实验,用一个触摸屏和我的STC12C5A60AD通信,实验中好像那个触摸屏的很多东西实现不了,只能用那个叫做什么通用的寄存器实现一些功能,不过也够用了,可以实现参数设置,目标启动停止等等。后来因为成本问题,没有进入实际应用。
当时为了实验,还在板子上加了那种两个三极管组成的232电路,也非常好用。
(238906447)

出0入0汤圆

发表于 2013-9-22 14:09:31 | 显示全部楼层
其中一些代码大部分都是网上找来的,例如CRC代码什么的,纯粹的拿来主义了。参考网上下载到的MODBUS资料,基本上是二进制的标准模式了,效果还是不错的!
不知道楼主搞的是怎样连接的
(238889061)

出0入0汤圆

发表于 2013-9-22 18:59:17 来自手机 | 显示全部楼层
mark,学习
(234496437)

出0入0汤圆

发表于 2013-11-12 15:09:41 | 显示全部楼层
mark~ 学习~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2021-4-18 17:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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