MODBUS-寄存器与功能码学习

摘要:
MODBUS服务器可以接收并同时为多个MODBUS请求提供服务。服务器可以同时接收MODBUS请求的最大数量是MODBUS服务器的主要特性之一。“NumberMaxOfServerTransaction”参数对MODBUS服务器的操作和性能有非常显著的影响。尤其重要的是,所管理的并发MODBUS事务处理的数量可能影响服务器对MODBUS请求的响应时间。

分类

简称

起始地址

结束地址

能够使用的功能码

输出逻辑线圈/(可读写位)/(DI/O)(如继电器开关控制

0x

00000

09999

0x01读一组逻辑线圈

0x05写单个线圈

0x0f写多个线圈

离散量触点/开关量输入/只读位(DI)如按键是否按下

1x

10000

19999

0x02读一组开关输入

输入寄存器(AI)实时数据如AD采集数据

3x

30000

39999

0x04读一个或多个输入寄存器

保持寄存器(AI/O)

设置的各种参数

4x

40000

49999

0x03读一个或多个保持寄存器的值

0X06写单个保持寄存器

0X10写多个保持寄存器

RTU协议中的指令由地址码(一个字节),功能码(一个字节),起始地址(两个字节),数据(N个字节),校验码(两个字节)五个部分组成

0x01: 读一组逻辑线圈,如读8个继电器输出状态。

0x0F: 写一组逻辑线圈。如同时控制8个继电器

0x05: 写单个逻辑线圈,如设定单个继电器

0x02: 读一组开关量的输入,如读显示板是否有按键按下、水流开关的状态。

0x03: 读一个或多个保持寄存器,如读一个或多个设置参数

0x010: 写一个或多个保持寄存器,如写设置参数

0x06: 写单个保持寄存器,如写单个设置参数

0x04: 读一个或多个输入寄存器,如读具体的按键值,AD采集的信息等

modbus协议功能码和常见问题

Pasted from <http://blog.csdn.net/educast/article/details/8159510

《Modbus软件开发实践指南》参考手册

1单片机开发与PLC开发的异同:

MODBUS协议是专门针对485总线设备(例PLC)开发,寄存器的定义要严格按照其地址范围;功能码的功能定义及定义的寄存器地址与功能码的使用要要严格符合。如上图。

而当单片机开发用串口点对点,可能不会完全遵守MODBUS协议具体体现在2方面:

首先是定义的寄存器地址范围,应结合不同单片机RAM的大小和项目得实际需求定义起始范围和大小。方法如在RAM区的不同区域定义不同功能的数组:

IOX[N]:输出线圈,用来进行继电器的操作

IX[M]:开关输入 ,用于识别按键是否按下的查询。

其它:功能码的使用也不会严格限定在指定的PLC地址范围。

2modbus寄存器的地址说明:

有两套规则,一套称为PLC地址,为5位十进制数,例如40001,PLC地址40001意味着该参数类型为保持寄存器。另一套是协议地址,协议地址为0x0000,这里面有对应关系,去掉PLC地址的最高位,然后剩下的减1即可。这会存在一个问题,PLC地址30002和PLC地址40002的协议地址同为0x0001,此时访问时是不是会冲突呢。亲们,当然不会了,30001为输入寄存器,需要使用04指令访问,而40001为保持寄存器,可以使用03、06和16指令访问。注意定义的寄存器地址像数组一样都是从0开始的,即通讯中的地址比实际地址小“1”

http://blog.sina.com.cn/s/blog_6ab9638f0100vqol.html

3线圈寄存器:就是可以单独进行位控制的BITS寄存器,类似C51的位带结构体

Typedef struct

{

Bit:0

Bit:1

..

Bit:14

Bit:15

}COIL_REG

http://blog.sina.com.cn/s/blog_598b27cd0101rphm.html

4modbus帧结构:

ADU:应用数据单元

PUD:协议数据单元

freemodbus中如何判断帧结束

modbus协议中没有明显的开始符和结束符,而是通过帧与帧之间的间隔时间T3.5来判断的。超过T3.5就认为收到了新的帧。接下来就可

以处理数据了,首当其冲的就是判断帧的合法性。Modbus通过时间来判断帧是否接受完成,自然需要单片机中的定时器配合。

使用串口发送完成中断:避免丢失最后一个字节内容

Pasted from <http://www.360doc.com/content/14/0313/22/7991404_360395398.shtml>

Modbus TCP协议:

Modbus TCP协议则是在RTU协议上加一个MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码,用一句比较通俗的话说就是:Modbus TCP协议就是Modbus RTU协议在前面加上五个0以及一个6,然后去掉两个CRC校验码字节就OK.虽然这句话说得不是特别准确,但是也基本上把RTU与TCP之间的区别说得比较清楚了

http://www.cnblogs.com/woxihuadabai/p/8043188.html

modbusTCP下从设备(每一个从设备一个ip地址)最多247个( ip地址1~247,248-255保留,0地址在请求的报文中请求的地址为0则为广播模式)。

MODBUS-寄存器与功能码学习第1张

MODBUS-寄存器与功能码学习第2张

NnmberMaxofClientTransaction :116 (在下列各更完整的描述。
MODBUS 服务并同MODBUS 请求提供服务。服务MODBUS 请求
最大数量MODBUS 服务的主要一。数量取决于服务的处理和
将这个实现为“NumberMaxOfServerTransaction必须MODBUS 服务的一个
描述个实现。根据设备,它的取为:116
NumberMaxOfServerTransactionMODBUS 服务
要的是所管理的并发 MODBUS 事务处理的数量可服务器对 MODBUS 请求

从地址:RTU(1~247,0,作为广播地址);TCP(不需要,必须使用0xff),0 用作与 MODBUS/TCP 设备直接通信
TCP连接:默认2小时,超过这个时间每隔75s进行询问一次,连续8次。

指令说明:
这是一条正确的发送指令:
TX:12 34 00 00 00 06 01 03 00 6000 01
RX:12 34 00 00 00 06 01 03 00 0212 34
其它命令码收发示例
12 34 为报文id(由客户端发起,一般每次通信之后就要加1以区别不同的通信数据报文)用以区别不同的发送指令,可以不改;
00 00 表示该条指令遵循ModbusTCP协议
00 06 示后面数据的长度,可以自己数一下是否是6个byte;
01为设备地址,这个可以用于局域网里面的具体的地址,如果目标机器有固定ip,这个就不起作用,直接上写成 00
03 为功能码;
00 60 表示读取寄存器地址0X0000的起始位置;
00 01 表示读取的寄存器的个数,
00 02 后续字节数
12 34 数据值
modbusTCP的主从:一般设备作为服务器(从机),PC作为主机(ModbusPoll)
手机组态MODBUS TCP:TeslaMultiSCADA
组态模拟例子
MTings工具:国产免费软件,集RTU/TCP一体,可以进行手动触发和连续周期触发,很不错的一个工具
基于B/S的MODBUS_TCP:
MODBUS-寄存器与功能码学习第3张

广播操作(只能针对写指令):

RTU主站使用广播地址(0x0/0xff)发送一条命令报文,全部的从站收到报文后执行,但不发送回应报文。此功能在很多情况下(用广播方式给所有设备发送设置值,如变频器速率)很实用。

modbus poll 工具的几个时间;

  • connect timeout:建立连接的时间,超时重连间隔
  • response timeout:表示读取超时(放弃)时间,从站在超时时间内没有返回数据,则认为通讯失败,默认1000ms
  • delay between polls:每次扫描的最小间隔时间,根据模式,slave数量,PC机特点不同(单个RTU或者TCP可以小于等于20ms,多slave时必须大于20ms,因为windows任务调度周期大概10~20ms,所以该值小于20ms不能保证T3.5。)
  • scan rate( 0 ~ 3600000ms):读数据的时间间隔,一定要比整个来回通讯的时间要长

RTU通讯超时的计算:主站读取从站的寄存器为例,主站发出请求需要8个字节,从站返回响应为52*n个字节。其中n为寄存器个数。

在9600的波特率下,每秒可以传输出的桢数为:9600 / (1 + 8 + 1) = 960桢/秒,即960字节/秒。

每传输1个字节数据需要的时间为:1秒 / 960 = 1.041ms
(8 +1 +1)/9600=1.04ms/Byte

因此,主站发出响应到从站返回数据的时间周期为:
(8+ 5+ 2*n)*1.04+ T1 +T2,其中n为寄存器个数,T1为从站的响应时间(如果是PLC,则为PLC的扫描时间),T2为通讯余量,一般为20~50ms。
如果读取10个字的数据,从站响应时间为50ms,则整个周期为:
(8+ 5+ 2*10)*1.04+ 50+ 50=134.32ms。
因此,超时时间必须大于134.32ms,可以设置为150ms以上;

而ModBus协议中超时时间定为:3.5个桢长度为超时时间;

超时时间 = 3.5 * 1 / BaudRate / 10 秒

= 3.5 * 10 / BaudRate 秒

= 3.5 * 10 * 2 / BaudRate *2 秒

= 70 / BaudRate *2 秒

波特率大于19200使用定值:1750us

波特率小于19200使用定值:usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate )=770000/BaudRate; 这usTimerT35_50us 一个单位为50uS,将这个计算结果写到定时器。每中断一次为50us * usTimerT35_50us 微秒
————————————————
版权声明:本文为CSDN博主「sunxboy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sunxboy/article/details/84499791

单次触发操作:setup-read/write disable 或快捷键shift+F6,然后用F6或者图标来操作MODBUS-寄存器与功能码学习第4张

使用手册

MODBUS-寄存器与功能码学习第5张

CAS Modbus Scanner工具:

免责声明:文章转载自《MODBUS-寄存器与功能码学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SSL连接建立过程分析(1)Matlab内存不足问题的解决 .下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转载]DSP2812 ECan总线中ECanaShadow的理解

博主可否总结过在2812中配置CAN的过程中,具体对哪些寄存器的位操作需要使用影子寄存器?在TI的《eCAN参考指南》中只是说明了“控制和状态寄存器只允许32位访问”,我根据经验和例程大概圈了下,主控制寄存器(CANMC)、TX I/O控制寄存器(CANTIOC)、RX I/O控制寄存器(CANRIOC)、超时控制寄存器(CANTOC)、位-时序配置寄存器...

时序分析之Arrival Time

首先要理解两个概念:launch edge 和latch edge launch edge 是源寄存器发送数据的时钟沿,是时序分析的起点。 latch edge是目的寄存器捕获数据的时钟沿,是时序分析的终点。 如图示,源寄存器在0ns时发送数据,目的寄存器在5ns时采样数据,两者刚好相差一个时钟周期。 Data Arrival Time :从launch...

Modbus协议栈综合实例设计

  自我们开源了我们的Modbus协议栈之后,就一直有朋友来信说希望提供示例。这次我们整理了几个例子以供参考。 1、应用实例规划   在这次的实例中,我们使用的目标板拥有一个以太网接口、一个RS232串行接口和一个RS485串行接口,所以我们规划实现: 一个Modbus TCP Server实例 一个Modbus RTU Slave实例 一个Mo...

深入理解计算机系统1

第一章 计算机系统漫游 代码段的生命周期 hello.c #include <stdio.h> int main() { printf("hello world! "); return 0; } 1.1 前序 源程序(源文件)实际上就是一个由0和1组成的位(又成比特bit)序列,8个位被组组成一组,称为字节。每个字节表...

【转】说说Timing这回事

【转】说说Timing这回事 Intro 问:一个FPGA设计项目需要用哪些评判标准来检验? 功能正确; 时序收敛; 资源消耗少。 时序收敛,即Timing Closure,意思是使设计的各项时序指标能满足设计前所制定要求。因此,整个过程分为两部分: 制定时序要求 满足时序要求 Timing Constraints Classes 制定时...

Smali语法

最近一周在研究rom移植,所以就对Smali语言学习了一下,Smali语言其实就是Davlik的寄存器语言;Smali语言就是android的应用程序.apk通过apktool反编译出来的都有一个smali文件夹,里面都是以.smali结尾的文件,文件的展示语言。 转载请标明出处:http://blog.csdn.net/wdaming1986/artic...