当前位置:文档之家› MODBUS协议概述

MODBUS协议概述

REV 1 SECT 19 DATE 2010-12-30 PAGE 1 关键字:MODBUS、协议

摘要:本文对MODBUS协议进行了一个简单的概述,让读者对MODBUS协议有一个大概的认识。

1 串口

串口叫做串行接口,也称串行通信接口,按电气标准及协议来分包括RS-232-C、RS-422、RS485、USB等。 RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或软件协议。

1.1 RS-232-C

也称标准串口,是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协

会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。传统的RS-232-C接口标准有25根信号线,采用标准25芯D型插头

座。后来的PC上使用简化了的9芯D型插座。现在应用中25芯插头座已很少采用。现在的台式电脑一般有两个串行口:COM1和COM2,从设备管理器的端口列表中就可以看到。硬件

表现为计算机后面的9针D形接口,由于其形状和针脚数量的原因,其接头又被称为DB9接头。现在有很多手机数据线或者物流接收器都采用COM口与计算机相连,很多投影机,液晶电视等设备都具有了此接口,厂家也常常会提供控制协议,便于在控制方面实现编程受控,现在越来越多的智能会议室和家居建设都采用了中央控制设备对多种受控设备的串口控制方式。RS-232最大通信距离为15m。

RS-232常用针脚定义:

2 :RXD:(Received Data)此引脚用于接收外部设备送来的数据

3 :TXD:(Transmit Data)此引脚将计算机的数据发送给外部设备

5 :GND:信号地(Signal Ground)

RS-232-C的电平逻辑定义:

-15V~-3V 表示逻辑1

+3V~+15V 表示逻辑0

REV 1 SECT 19 DATE 2010-12-30 PAGE 2

RS-232设备连接示意图

1.2 RS-422

为改进RS-232通信距离短、速率低的缺点,RS-422定义了一种平衡通信接口,将传输

速率提高到10Mb/s,传输距离延长到4000英尺(速率低于100kb/s时),并允许在一条平

衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规

范,被命名为TIA/EIA-422-A标准。

RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特

性。实际上还有一根信号地线,共5根线。由于接收器采用高输入阻抗和发送驱动器比

RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。

即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4kΩ,故发端最大负载能力是10×4kΩ+100Ω

(终接电阻)。

RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之

间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)。RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平

衡双绞线的长度与传输速率成反比,在 100kb/s速率以下,才可能达到最大传输距离。只

有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为 1Mb/s。

RS-422需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在短距离传输时可

不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。

RS-422的电平逻辑定义:

发送端(TX+/ TX-)电压差+2V~+6V表示逻辑1

发送端(TX+/ TX-)电压差-6V~-2V表示逻辑0

REV 1 SECT 19 DATE 2010-12-30 PAGE 3 接受端(RX+/ RX-)电压差>+200mV表示逻辑1

接受端(RX+/ RX-)电压差<-200mV表示逻辑0

RS-422设备连接示意图

1.3 RS-485

为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标准,增加了多

点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。

RS485采用差分信号负逻辑。RS485有两线制和四线制两种接线,四线制只能实现点对

点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线式拓朴结构在同一总线上最多可以挂接32个结点。在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。很多情况下,连接RS-485通信链路时只是简单地用一对双绞

线将各个接口的“A”、“B”端连接起来。而忽略了信号地的连接,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,这有二个原因:(1)共模干扰问题: RS-485

接口采用差分方式传输信号方式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了。但人们往往忽视了收发器有一定的共模电压范围,RS-485收发

器共模电压范围为-7~+12V,只有满足上述条件,整个网络才能正常工作。当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口。(2)EMI问题:发送驱动器

输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信号地),就会以辐射的形式返回源端,整个总线就会像一个巨大的天线向外辐射电磁波。

REV 1 SECT 19 DATE 2010-12-30 PAGE 4 由于PC机默认的只带有RS232接口,有两种方法可以得到PC上位机的RS485电路:(1)通过RS232/RS485转换电路将PC机串口RS232信号转换成RS485信号,对于情况比较复杂的工业环境最好是选用防浪涌带隔离珊的产品。(2)通过PCI多串口卡,可以直接选

用输出信号为RS485类型的扩展卡。

在使用RS485接口时,对于特定的传输线路,从RS485接口到负载其数据信号传输所允许的最大电缆长度与信号传输的波特率成反比,这个长度数据主要是受信号失真及噪声等影响所影响。理论上,通信速率在100Kpbs及以下时,RS485的最长传输距离可达1200米,

但在实际应用中传输的距离也因芯片及电缆的传输特性而所差异。在传输过程中可以采用增加中继的方法对信号进行放大,最多可以加八个中继,也就是说理论上RS485的最大传输距离可以达到9.6公理。如果真需要长距离传输,可以采用光纤为传播介质,收发两端各加一个光电转换器,多模光纤的传输距离是5~10公里,而采用单模光纤可达50公里的传播距离。

RS-485的电平逻辑定义:

485B电压>485A电压且A/B间电压差≥200mV表示逻辑1

485A电压>485B电压且A/B间电压差≥200mV表示逻辑0

RS-485设备连接示意图

1.4 串口通信名词解释

(1)波特率

在串行通信中,用波特率来描述数据传输的速度,即每秒钟传送的二进制位数,其单位是bps(bits per second),它是衡量串行数据速度快慢的重要指标,国际上规定了一个

标准的波特率系列:110、300、600、1200、1800、2400、4800、9600、14.4k、19.2k、

28.8k、33.6k、56k。

REV 1 SECT 19 DATE 2010-12-30 PAGE 5 (2)数据位

是指每个数据包的位数。标准值是5、7、8。

(3)停止位

用于表示单个包的最后一位。典型的值为1、1.5、2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供设备校正时钟同步的机会。使用的停止位位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

(4)奇偶校验位

是串口通信中一种简单的检错方式。常用校验方式为:偶校验、奇校验。

不同设备之间进行串口通信时,波特率、数据位、停止位以及奇偶校验位必须设置一致。

2 MODBUS协议

MODBUS协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、

控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一种通用工业标准。MODBUS有两种传输模式:ASCII和RTU模式,本文只讨论RTU模式。

2.1 MODBUS从站数据存储格式及数据块分类

MODBUS从站数据块分及绝对地址分配如下:

数据块 绝对地址分配属性

线圈(Coil Status) 00001~09999读写

离散量输入(Input Status) 10001~19999只读

保持寄存器(Holding Register) 40001~49999读写

输入寄存器(Input Register) 30001~39999只读 对于线圈和离散量输入,一个绝对地址表示一个开关量信息:

REV 1 SECT 19 DATE 2010-12-30 PAGE 6

如上图,地址为00006的线圈状态为0(OFF),地址为00008的线圈状态为1(ON);离散量输入类似,不再详述。

对于保持寄存器和输入寄存器,一个绝对地址表示一个16Bit的二进制数(一个字):

如上图,地址为40005的保持寄存器内数据为0x DEBD,地址为40008的保持寄存奇内

数据为0x CCBF;输入寄存器类似,不再详述。

2.2 MODBUS常用功能码

(1)01(0x01) 读线圈

如主站读取硬件地址为17(0x11)的从站中地址为00020~00056(起始地址为19,

0x0013)的37(0x0025)个线圈状态,则主站查询包格式为(其中11 01 00 13 00 25的CRC16校验码为0x840E):

从站 地址 功能

起始

地址Hi

起始

地址Lo

读取

数量Hi

读取

数量Lo

CRC16

校验Lo

CRC16

校验Hi

11 01 00 13 00 25 0E 84

从站回复时,是从起始地址开始,每8个线圈(8Bit,1个字节)为一个数据块,依次打包成数据1、数据2…数据N,线圈状态按照地址由低到高的顺序依次排列到数据块的低位至高位,若最后线圈数量不足8个,则高位空缺部分填充0,其数据包格式为:

REV 1 SECT 19 DATE 2010-12-30 PAGE 7

从站 地址 功能

数据

字节数

数据1 数据2数据3数据4数据5

CRC16

校验Lo

CRC16

校验Hi

11 01 05 CD 6B B2 0E 1B 45 E6

解析回复的数据包,其含义如下:

地址 5958 57 5655545352数据块 HEX

状态 OFF OFF OFF ON ON OFF ON ON数据块5 1B

地址 5150 49 4847464544

状态 OFF OFF OFF OFF ON ON ON OFF数据块4 0E

地址 4342 41 4039383736

状态 ON OFF ON ON OFF OFF ON OFF数据块3 B2

地址 3534 33 3231302928

状态 OFF ON ON OFF ON OFF ON ON数据块2 6B

地址 2726 25 2423222120

状态 ON ON OFF OFF ON ON OFF ON数据块1 CD 演示截图如下:

注:MODBUS数据包中的起始地址其实指的是相对于基地址的偏移量。如上例中,地址

00020相对于基地址00001偏移量为19,如下图所示:

(2)02(0x02) 读离散量输入

REV 1 SECT 19 DATE 2010-12-30 PAGE 8 如主站读取硬件地址为17(0x11)的从站中地址为10197~10218(起始地址为196,

0x00C4)的22(0x0016)个离散量输入的状态,则主站查询包格式为(其中11 02 00 C4

00 16的CRC16校验码为0x A9BA):

从站 地址 功能

起始

地址Hi

起始

地址Lo

读取

数量Hi

读取

数量Lo

CRC16

校验Lo

CRC16

校验Hi

11 02 00 C4 00 16 BA A9

从站回复时,是从起始地址开始,每8个离散量输入(8Bit,1个字节)为一个数据块,依次打包成数据1、数据2…数据N,离散量输入按照地址由低到高的顺序依次排列到数据块的低位至高位,若最后离散量输入数量不足8个,则高位空缺部分填充0,其数据包格式为:

从站 地址 功能

数据

字节数

数据1数据2数据3

CRC16

校验Lo

CRC16

校验Hi

11 02 03 CD 6B 32 45 C4

解析回复的数据包,其含义如下:

地址 220219 218 217216215214213数据块 HEX

状态 OFF OFF ON ON OFF OFF ON OFF数据块3 32

地址 212211 210 209208207206205

状态 OFF ON ON OFF ON OFF ON ON数据块2 6B

地址 204203 202 201200199198197

状态 ON ON OFF OFF ON ON OFF ON数据块1 CD 演示截图如下:

(3)03(0x03) 读保持寄存器

REV 1 SECT 19 DATE 2010-12-30 PAGE 9 如主站读取硬件地址为17(0x11)的从站中地址为40109~40111(起始地址为108,

0x006C)的3(0x0003)个保持寄存器的数值,则主站查询包格式为(其中11 03 00 6C 00 03的CRC16校验码为0x46C7):

从站 地址 功能

起始

地址Hi

起始

地址Lo

读取

数量Hi

读取

数量Lo

CRC16

校验Lo

CRC16

校验Hi

11 03 00 6C 00 03 C7 46

从站回复时,是从起始地址开始,每个保持寄存器(16Bit,1个字)为一个数据块,依次打包成数据1、数据2…数据N,其数据包格式为:

从站 地址 功能

数据

字节数

数据1

Hi

数据1

Lo

数据2

Hi

数据2

Lo

数据3

Hi

数据3

Lo

CRC16

校验Lo

CRC16

校验Hi

11 03 06 6B CD 0E B2 00 1B 2B 7A

解析回复的数据包,其含义如下:

地址 数据块 数值

40111 数据3 001B

40110 数据2 0EB2

40109 数据1 6BCD

演示截图如下:

(4)04(0x04) 读输入寄存器

如主站读取硬件地址为17(0x11)的从站中地址为39157~39159(起始地址为9156,0x23C4)的3(0x0003)个输入寄存器的数值,则主站查询包格式为(其中11 04 23 C4 00 03的CRC16校验码为0x E2F8):

从站 地址 功能

起始

地址Hi

起始

地址Lo

读取

数量Hi

读取

数量Lo

CRC16

校验Lo

CRC16

校验Hi

11 04 23 C4 00 03 F8 E2

从站回复时,是从起始地址开始,每个输入寄存器(16Bit,1个字)为一个数据块,依次打包成数据1、数据2…数据N,其数据包格式为:

REV 1 SECT 19 DATE 2010-12-30 PAGE 10

从站 地址 功能

数据

字节数

数据1

Hi

数据1

Lo

数据2

Hi

数据2

Lo

数据3

Hi

数据3

Lo

CRC16

校验Lo

CRC16

校验Hi

11 04 06 6B CD 0E B2 00 1B 6A 9C

解析回复的数据包,其含义如下:

地址 数据块 数值

39159 数据3 001B

39158 数据2 0EB2

39157 数据1 6BCD

演示截图如下:

(5)05(0x05) 强制单个线圈

如主站将硬件地址为17(0x11)的从站中地址为00219(起始地址为218,0x00DA)的线圈强制为ON(0x FF00),则主站强制包格式为(其中11 05 00 DA FF 00的CRC16校验码为0x51AF):

从站 地址 功能

起始

地址Hi

起始

地址Lo

强制

数值Hi

强制

数值Lo

CRC16

校验Lo

CRC16

校验Hi

11 05 00 DA FF 00 AF 51 从站回复包格式为:

从站 地址 功能

起始

地址Hi

起始

地址Lo

强制

数值Hi

强制

数值Lo

CRC16

校验Lo

CRC16

校验Hi

11 05 00 DA FF 00 AF 51 演示截图如下:

REV 1 SECT 19 DATE 2010-12-30 PAGE 11 注:强制为ON时的强制数值为0xFF00,强制为OFF是强制数值为0x0000。

(6)06(0x06) 预置单个保持寄存器

如主站将硬件地址为17(0x11)的从站中地址为40312(起始地址为311,0x0137)的

保持寄存器数值预置为0x ABCD,则主站强制包格式为(其中11 06 01 37 AB CD的CRC16

校验码为0x CD85):

从站 地址 功能

起始

地址Hi

起始

地址Lo

预置

数值Hi

预置

数值Lo

CRC16

校验Lo

CRC16

校验Hi

11 06 01 37 AB CD 85 CD 从站回复包格式为:

从站 地址 功能

起始

地址Hi

起始

地址Lo

预置

数值Hi

预置

数值Lo

CRC16

校验Lo

CRC16

校验Hi

11 06 01 37 AB CD 85 CD

演示截图如下:

(7)15(0x0F) 强制多个线圈

如主站将硬件地址为17(0x11)的从站中地址为00415~00435(起始地址为414,

0x019E)的21(0x0015)个线圈分别强制为:

地址 438 437 436 435434433432431数据块 HEX

状态 OFF OFF OFF ON ON OFF ON ON数据3 1B

地址 430 429 428 427426425424423

状态 ON ON OFF OFF ON ON OFF ON数据2 CD

地址 422 421 420 419418417416415

状态 ON ON ON OFF ON ON ON ON数据1 EF 则主站是从起始地址开始,每8个线圈(8Bit,1个字节)为一个数据块,依次打包成

数据1、数据2…数据N,线圈状态按照地址由低到高的顺序依次排列到数据块的低位至高

REV 1 SECT 19 DATE 2010-12-30 PAGE 12 位,若最后线圈数量不足8个,则高位空缺部分填充0,其数据包格式为(其中11 0F 01

9E 00 15 03 EF CD 1B的CRC16校验码为0x4BF7):

从站 地址 功能

起始

地址

Hi

起始

地址

Lo

线圈

数量

Hi

线圈

数量

Lo

数据

字节

数据

1

数据

2

数据

3

CRC16

校验

Lo

CRC16

校验

Hi

11 0F 01 9E 00 15 03 EF CD

1B F7 4B

从站回复数据包格式为:

从站 地址 功能

起始

地址Hi

起始

地址Lo

线圈

数量Hi

线圈

数量Lo

CRC16

校验Lo

CRC16

校验Hi

11 0F 01 9E 00 15 F6 86

演示截图如下:

(8)16(0x10) 预置多个保持寄存器

如主站将硬件地址为17(0x11)的从站中地址为40356~40358(起始地址为355,

0x0163)的3(0x0003)个保持寄存器数值分别预置为:

地址 数据块 数值

40358 数据3 CADB

40357 数据2 BADC

40356 数据1 ABCD

则主站是从起始地址开始,每个保持寄存器(16Bit,1个字)为一个数据块,依次打包成数据1、数据2…数据N,其数据包格式为(其中11 10 01 63 00 03 06 AB CD BA DC CA DB的CRC16校验码为0x4FE9):

REV 1 SECT 19 DATE 2010-12-30 PAGE 13

从站 地址 功能

起始

地址

Hi

起始

地址

Lo

寄存

数量

Hi

寄存

数量

Lo

数据

字节

数据

1

Hi

数据

1

Lo

数据

2

Hi

数据

2

Lo

数据

3

Hi

数据

3

Lo

CRC

校验

Lo

CRC

校验

Hi

11 10 01 63 00 03 06 AB CD BA DC CA DB E9 4F

从站回复数据包格式为:

从站 地址 功能

起始

地址Hi

起始

地址Lo

寄存器

数量Hi

寄存器

数量Lo

CRC16

校验Lo

CRC16

校验Hi

11 10 01 63 00 03 73 7A

演示截图如下:

3 数据类型

计算机系统中,常用的数据类型有如下几种:

类型标识符 类型

说明

长度

(字节)

范围 备注

short int

整型

2 -32768~32767 2-15~(215-1)

unsigned short int 无符号

短整型

2 0~65535 0~(216-1)

int 整

4 -2147483648~2147483647 -231~(231-1)

unsigned int 无符号

整型

4 0~429496729

5 0~(232-1)

float

实型

(单精度)

4 1.18×10-38~3.40×10387位有效位

double

实型

(双精度)

8 2.23×10-308~1.79×1030815位有效位

long doubule

实型

(长双精度)

10 3.37×10-4932~1.18×10493219位有效位

REV 1 SECT 19 DATE 2010-12-30 PAGE 14 下面简单介绍不同数据类型的二进制表示方法:

(1)无符号短整型

对于无符号短整型数据,直接将二进制转换成十进制,即表示数值,如(0x ABCD表示43981):

Bit 15 14 13 12 11 10 9 876543210

BIN 1 0 1 0 1 0 1 111001101

HEX A B C D

DEC 43981

演示截图如下:

(2)短整型

对于短整型数据,最高位(Bit15)为符号位,若最高位为0,则表示正数,此时直接

将二进制转换成十进制,即表示数值,如(0x2BCD表示11213):

Bit 15 14 13 12 11 10 98 76 5 4 3 2 10 BIN 0 0 1 0 1 0 1 1 110 0 1 1 01 HEX + 2 B C D

DEC 11213

演示截图如下:

REV 1 SECT 19 DATE 2010-12-30 PAGE 15 若最高位(Bit15)为1,则表示为负数,此时需要将剩下的二进制数按位取反,然后

加1,将最终的二进制数转换成十进制,即表示数值的绝对值,如(0x ABCD表示-21555):

Bit 15 14 13 12 11 109 8 7 6 5 4 3 2 1 0 BIN 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 HEX A B C D

按位取反 - 1 0 1 0 1 0 0 0 0 1 1 0 0 1 0 HEX - 5 4 3 2

加1 - 1 0 1 0 1 0 0 0 0 1 1 0 0 1 1 HEX - 5 4 3 3

DEC - 21555

演示截图如下:

(3)单精度实型

IEEE754标准在表示单精度浮点数(32位)时,每个浮点数均由三部分组成:

符号位S: 0代表正号,1代表负号。

指数部分E: E的取值范围为0~255(无符号整数),实际数值e=E-127。

尾数部分M: M也叫有效数字位(sinificand)、系数位(coefficient), 甚至被称作“小数”。

在一般情况下,N=(1.M)(2进制),使得实际起作用范围为1≤尾数<2。

为了对溢出进行处理,以及扩展对接近0的极小数值的处理能力,IEEE 754对M做了

一些额外规定。

单精度浮点数格式(32位)表示为:除去符号位1位后,E占8位,M占23位。

31 30 ......... 23 22 0

S E M

REV 1 SECT 19 DATE 2010-12-30 PAGE 16 我们最重要的是掌握单精度格式的表示法。在IEEE754标准中,约定小数点左边隐含有一位,通常这位数就是1,这样实际上使尾数的有效位数为24位,即尾数为1.M。指数的值在这里称为阶码,为了表示指数的正负,所以阶码部分采用移码表示,移码值为127,阶码

值即从1到254变为-126至+127,在IEEE754中所有的数字位都得到了使用,明确地表示

了无穷大和0,并且还引进了“非规格化数”,使得绝对值较小的数得到更准确表示。请看

下表:

S(1位) E(8位) M(23位) N(32位)

符 0 0 (-1) ×S×0(+0,-0)

0 不等于0 (-1) ×S×2-126× (0.M) 为非规格数

号 1到254之间 不等于0 (-1) ×S×2E-127 ×(1.M) 为规格化数

255 不等于0 NaN(非数值)

位 255 0 (-1) ×S×∞(+∞,-∞)

其中红色字0、1表示隐含位,注意当数字N为非规格化数或是0时,隐含位是0。

下面通过两个简单的例子说明:

如某数据为0x42 A0 30 CB

转换成二进制为:0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 1

其中S=0,说明数据为正数;E=1 0 0 0 0 1 0 1;M=0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 1(十进制:E=133;M=2109643×2-23)

因此转换后实际数据为:2(133-127)×(1+M)=80.0953

演示截图如下:

REV 1 SECT 19 DATE 2010-12-30 PAGE 17 再如某数据为0x C2 B6 C1 44

转换成二进制为:1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0

其中S=1,说明数据为负数;E=1 0 0 0 0 1 0 1;M=0 1 1 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0(十进制:E=133;M=3588420×2-23)

因此转换后实际数据为:(-1)×2(133-127)×(1+M)=-91.3775

演示截图如下:

学过数据类型以后,大家都知道有些数据(例如单精度浮点数)必须要用两个或两个以上的字来表示,若MODBUS从站如果未经特殊定义,其传输数据时,是将高字放在低地址的

寄存器中,将低字放在高地址的寄存器中(参阅MODBUS的03功能码部分),而主站如果未经特殊定义时,默认高地址的寄存器为数据的高字部分,低地址的寄存器为数据的低字部分,这样当数据还原时,就会出现高、低字颠倒的情况,恢复的数据就会出现错乱,以一个 例子来说明这种情况:

仍然以数据0x C2 B6 C1 44为例进行说明;若从站未经特殊定义,其装填数据时,会将数据的高字部分(0x C2 B6)装填进地址为40355的寄存器,将数据的低字部分(0x C1

44)装填进地址为40356的寄存器,而主站在默认情况下,恢复数据时是将高地址寄存器(40356)的数据作为高字,将低地址寄存器(40355)的数据作为低字,这样一个双字的数据就被恢复成0x C1 44 C2 B6,导致数据恢复不正确:

十六进制 恢复成浮点数

C2 B6 C1 44 -91.3775

C1 44 C2 B6 -12.2975

REV 1 SECT 19 DATE 2010-12-30 PAGE 18 演示截图如下:

此时若将主站的数据类型选择为Swapped FP(高低字交换的浮点型)格式后,数据恢复:

其它类型的数据(双字或以上)也可能存在此种情况,使用MODBUS通信时需要注意。

另外,对于串口通信感兴趣的同事,建议拥有以下串口软件:

1、串口精灵,可以自己发送或者接收串口原始数据包并进行CRC计算

2、ModScan,可以模拟MODBUS主站并查看原始数据包

REV 1 SECT 19 DATE 2010-12-30 PAGE 19

3、ModSim,可以模拟MODBUS从站并查看原始数据包

4、IEE,不同数据类型转换的小软件

5、Virtual Serial Port,虚拟串口软件,可以模拟真实的串口互连

modbus_通讯协议_实例

上海安标电子有限公司 ——PC39A接地电阻仪通信协议 通信协议: 波特率:9600数据位:8校验位:无停止位:1 上位机(计算机): 字节号 1 2 3 4 5 6 7 8 意义ID Command 数据地址V alue CRC 注:1 ID:1个字节,由单机来定(0~255) 2 Command:1个字节,读:3或4,写:6 3 数据地址:2个字节,寄存器地址,读从100开始,写从200开始 4 V alue:2个字节,读:个数(以整型为单位),写:命令/ 数据(以整型为单位) 5 CRC:计算出CRC 下位机(PC39A): 读数据,若正确 字节号 1 2 3 3+N (N=个数*2) 3+N+1 3+N+2 意义ID Command=3 / 4 数据个数数据CRC 注:1 ID:1个字节,由单机来定(0~255) 2 Command:1个字节,收到的上位机命令 3数据个数:1个字节,返回数据个数(以字节为单位) 4 V alue:N个字节,是返回上位机的数据 5 CRC:计算出CRC 写命令,若正确 返回收到的数据: 若错误 字节号 1 2 3 4 5 意义ID Command 数据CRC 注:1 ID:1个字节,由单机来定(0~255) 2 Command:1个字节,收到的上位机命令或上0x80, 如收到3,返回0x83 3数据:1个字节,错误的指令 错误指令 1:表示command不存在 2:表示数据地址超限 4 CRC:计算出CRC

例如读PC39A 电流数据: 机器地址为12,电流的数据地址100,数据为15.45(A) (一个整型数据) 主机: ID Command 数据地址 V alue CRC 16进制 0x0c 0x03 0x0064 0x0001 CRC_H CRC_L 10进制 12 3 100 1 CRC_H CRC_L 从机返回 如正确: ID Command 数据个数(以字节为单位) V alue CRC 16进制 0x0c 0x03 0x002 0x0609 CRC_H CRC_L 10进制 12 3 2 1545 CRC_H CRC_L 如错误: ID Command 数据 CRC 16进制 0x0c 0x83 0x02 CRC_H CRC_L 10进制 12 131 2 CRC_H CRC_L 例如发PC39A 启动命令: 机器地址为12,命令的地址200,数据为25000(25000表示启动) 主机: ID Command 数据地址 V alue CRC 16进制 0x0c 0x06 0x00c8 0x61a8 CRC_H CRC_L 10进制 12 6 200 25000 CRC_H CRC_L 从机返回 如正确: ID Command 数据地址 V alue CRC 16进制 0x0c 0x06 0x00c8 0x61a8 CRC_H CRC_L 10进制 12 6 200 25000 CRC_H CRC_L 如错误: ID Command 数据 CRC 16进制 0x0c 0x86 0x02 CRC_H CRC_L 10进制 12 134 2 CRC_H CRC_L 0011 10000110 错误码0x83 功能码0x06错误码0x86

单独传感器标准MODBUS485通讯协议

A、读取数据(标准modbus协议) 地址默认为0x01,可以更改 1、读取数据 主机呼: 0103 00 0000 01 840A 从机答: 0103 02 XX XX XX XX 上面02,XX等均为一个字节。数据为两个字节,高位字节在前。每帧的开头和结尾至少有3。5个字节时间的间隔. 2。读设备地址 0020 CRC (4个字节)(读取:00 20 0068) 00 20 Adress CRC (5个字节) 3.写设备地址 00 10 Adress CRC (5个字节)(地址设为01:00 10 01 BD C0) 00 10CRC?(4个字节)(返回:00 1000 7C) 说明: 1.读写地址命令的地址位必须是00。 2。Adress为1个字节,范围为0-255。 用户在为主机编程时,除了站号(地址)和CRC校验码之外,其它字节的字符均采用上面的内容不变。主机格式中的读取点数为01。从机回答帧中的功能码(03)和读单元字节数(01)不变。

计算CRC码的步骤: 1、预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器; 2、把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器; 3、把寄存器的内容右移一位(朝低位),用0填补最高位,并检查右移后的移出位; 4、如果最低位为0:重复第3步(再次移位) 如果最低位为1:CRC寄存器与多项式A001(10100000 0000 0001)进行异或; 5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理; 6、重复步骤2到步骤5,进行下一步8位数据的处理; 7、最后得到的CRC寄存器即为CRC码; 8、将CRC结果放入信息帧时,将高低位交换,低位在前。 //************************************************************************************************ //**名称:CRC16 //**说明:CRC效验函数 //**形参:*p效验帧的指针帧长 datalen //**返回值:效验字 //************************************************************************************************ unsignedint CRC16(unsigned char * p, uint16 datalen ) { unsigned char CRC16Lo,CRC16Hi,CL,CH,SaveHi,SaveLo; int i,Flag; CRC16Lo =0xFF; CRC16Hi= 0xFF; CL = 0x01; CH= 0xA0; for(i=0;i>= 1 ; //高位右移一位,低位右移一位if ((SaveHi &0x01) ==0x01) //如果高位字节最后一位为1 CRC16Lo|=0x80 ; //则低位字节右移后前面补1否则自动补0 if ((SaveLo&0x01) ==0x01) //如果LSB为1,则与多项式码进行异或 { CRC16Hi^= CH;CRC16Lo ^= CL;} } }

通讯格式、传输方式及MODBUS协议简介

MODBUS协议、通讯格式、传输方式 淘宝店铺: MODBUS简介 MODBUS是一种单主站的主/从通信模式。MODBUS网络上只能有一个主站存在,主站在MODBUS网络上没有地址,从站的地址范围为 0 - 247,其中 0 为广播地址,从站的实际地址范围为 1 - 247。 MODBUS通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。 MODBUS具有两种串行传输模式,ASCII和RTU。它们定义了数据如何打包、解码的不同方式。支持MODBUS协议的设备一般都支持 RTU 格式。 通信双方必须同时支持上述模式中的一种。 实际也就是发送与接收双方商量一下,定好规则,发送方想要接收方做某件事,就发送某种格式的信息给接收方,接收方收到信息后,按照事先约定好的规则分析信息,执行命令。 您如果愿意,也可以自己定义一个通讯规范,用PLC 或是VB 语言按照您自己定义的这个规范处理,如果您定义的这个规范可靠性、便于分析性超过MODBUS,那您的通讯规范就是最流行的了! MODBUS 的通讯规范: 起始符 + 设备地址 + 功能代码 + 数据 + 校验和 + 结束符

通讯格式 通讯格式设置举例:9600,o,8,1 即: 波特率为9600; 校验方式为奇校验; 数据位为八位; 停止位为一位; ------------------------------------------------------------ 1、波特率: 波特率是每秒钟传输的数据位数;什么是位数呢? 计算机处理的语言是"0"和"1"组合而成的信息,即机器语言! 一个"0"或是一个"1"就是一个位; 设置波特率的作用? 如果把波特率设为9600,即一秒钟之内能够传输9600个"0"或是"1",它决定了通讯的数据传输速度。 常用的波特率数值有:2400、4800、9600、19200、38400、57600、115200;

MODBUS协议最简单又是最直白的解释

Modbus是一种单主站的主/从通信模式。Modbus网络上只能有一个主站存在,主站在Modbus网络上没有地址,从站的地址范围为0 - 247,其中0 为广播地址,从站的实际地址范围为1 - 247。Modbus通信标准协议可以通过各种传输方式传播,如RS232C、RS485、光纤、无线电等。 Modbus具有两种串行传输模式,ASCII 和RTU。它们定义了数据如何打包、解码的不同方式。支持Modbus 协议的设备一般都支持RTU 格式。通信双方必须同时支持上述模式中的一种。 上面说的是官话,下面是我说的大白话: modbus协议也只是通讯协议的一种,没什么神秘的,通讯协议包括两个方面: 一、通讯格式,即:波特率,检验方式,数据位,停止位 波特率:一秒钟传送的位数,也就是通讯速率;比如波特率为9600,即,一秒种可以传送9600个位数,位的概念看下面的数据位介绍 校验方式:奇校验或偶校验或无校验,目的是判断传输过程中是否有错误!它只是用于判断一个字符(比如八个位或是七个位组成一个字符)传输是否有错误。但是它并不能完全能够判断传输是否有错。比如偶校验,在检验送八个“11111111”时,如果到达接收方,由于干扰而变成了“10111101”,“1”的个数仍然是偶数,接收方就判断不出来传送的字符已经错误! 数据位:传输一个字符由几个位组成,计算机的基本单位就是“位”,其值非“0”即“1”,又如传送A,定义通讯格式时,是定义的八位,其传送的数据可能就是:00001010; 停止位:传输一个字符有几个停止位,用天判断某个字符是否传输结束,以便开始接收下一个字符。 通讯格式的作用是规范发送方与接收方的传输格式,如果双方通讯格式不一样,接收方就不可能正确判断发送方发来的东西是什么。 比如,接收方设置的波特率是10(一秒只接收十个位)位,而发送方的波特率是20(一秒发送二十个位),那么发送方一秒种发送的20个字符,接收方就不可能都收到,只能接收到10个,造成通讯出错。 校验方式:双方校验方式不一样,就没有一个统一的标准认定传输是否有错误。 数据位,接收方设定的七位,即它接收到七个位就认为是一个字符,而实际发送方设定的是八位,那么接收方认定的字符与发送方发送的字符就不一样了。 ***参预通讯的双方设定的通讯格式必须一样的!! 二、通讯规范(这个词是我自己定义的,不能引用,会被人笑话的) 通讯格式只是保证接收方正确地接收到发送方传输过来的每一个字符(实际如上所述,检验方式并不能保证完全正确,还要靠通讯规范中的校验和计算来验证整体正确性,下面会继续说明),那么接收到的整串字符做什么用呢,就要靠通讯规范了 MODBUS的通讯规范很简单! 先说ASCII方式: ASCII方式发送时的规范定义如下: 起始符+ 设备地址+ 功能代码+数据+ 校验+ 结束符 1\起始符: 接收到一串字符,总要知道这串字符从哪个地方开始吧,这就是起始符的作用,接收方不管以前收到多少个字符。当接收到起始符时,以前的字符就不再理它了,从起始符开始分析以后的字符!MODBUS的ASCII方式起始符是一个冒号“:”

modbus协议

编号:_______________本资料为word版本,可以直接编辑和打印,感谢您的下载 modbus协议 甲方:___________________ 乙方:___________________ 日期:___________________

1 . MODBUS 规约 MODBUS规约是MODICOM 公司开发的一个为很多厂商支持的开放规约 Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通 信的。它描述了控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样 侦测错误并记录。它制定了消息域格局和内容的公共格式。 当在Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。 标准的Modbus 口是使用RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号 位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。 控制器通信使用主一从技术,即仅设备(主设备)能初始化传输(查询)。其它设备(区设备)根据主设备查询提供的数据做出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。 主设备可单独和从设备通信, 也能以广播方式和所有从设备通信。如果单独通信,从设住回消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了匕 设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、错误检测域。 从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回 的数据、和错误检测域。如果在消息接收过程中发生错误,或从设备不能执行其 命令,从设备将建立错误消息并把它作为回应发送出去。 在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。 这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可 允许同时发生的传输进程。 在消息位,Modbus协议仍提供了主一从原则,尽管网络通信方法是“对等”。

Modbus 通讯协议的原理和标准

Modbus 通讯协议的原理和标准 工业控制已从单机控制走向集中监控、集散控制,如今已进入网络时代,工业控制器连网也为网络管理提供了方便。Modbus 就是工业控制器的网络协议中的一种。 一、Modbus 协议简介 Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。 当在一Modbus 网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus 协议发出。在其它网络上,包含了Modbus 协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。 1、在Modbus 网络上转输 标准的Modbus 口是使用一RS-232C 兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem 组网。 控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据做出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。 主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus 协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。 从设备回应消息也由Modbus 协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。 2、在其它类型网络上转输 在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。 在消息位,Modbus 协议仍提供了主—从原则,尽管网络通信方法是“对等”。如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。 3、查询—回应周期 (1)查询 查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03 是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。

MODBUS协议解析

MODBUS协议解析 Modbus是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。目前,可以通过下列三种方式实现Modbus通信: 以太网上的TCP/IP; 各种介质(有线:EIA/TIA-232-F、EIA-422、EIA/TIA-485-A;光纤、无线等)上的异步串行传输; Modbus PLUS,一种高速令牌传递网络。 作为中国国家标准的“基于Modbus协议的工业自动化网络规范”在描述Modbus应用协议的基础上,提供了Modbus应用协议在串行链路和TCP/IP上的实现指南。 Modbus 通信线 Modbus数据单元 Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU),特定总线或网络上的Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域。启动Modbus事务处理的客户机创建Modbus PDU,其中的功能码向服务器指示将执行哪种操作,功能码后面是含有请求和响应参数的数据域。 通用Modbus帧 当Modbus应用在串行链路上时,Modbus ADU的地址域只含有从站地址,而差错校验码是根据报文内容执行“冗余校验”计算的结果,根据使用的传输模式(RTU或ASCII)采用不同的计算方法。 串行链路上的Modbus帧 当Modbus应用在TCP/IP上时,将使用一种专用报文头——MBAP报文头(Modbus应用协议报文头)来识别Modbus应用数据单元。 TCP/IP上的Modbus帧

Modbus标准功能码 Modbus协议定义了三种功能码: 公共功能码:被确切定义的、唯一的功能码,由Modbus-IDA组织确认、可进行一致性测试且已在MB IETF RFC中归档 用户定义的功能码:用户无需Modbus-IDA组织的任何批准就可以选择和实现的功能码,但是不能保证被选功能码的使用是唯一的 保留功能码:某些公司在传统产品上现行使用的功能码,不作为公共使用。 公共功能码定义如下表所示。 Modbus通信原理 Modbus是一种简单的客户机/服务器型应用协议,其通信遵循以下的过程: 客户端准备请求并向服务器发送请求; 服务器分析并处理客户端的请求,然后向客户端发送结果; 如果出现任何差错,服务器将返回一个异常功能码。 Modbus事务处理 统一的标准 Modbus串行链路、Modbus PLUS和Modbus TCP/IP使用的是一种统一的应用协议,因而使得信息从一个网络传输到另一个网络而不需改变通讯协议成为了可能。 当Modbus在TCP/IP上实施时,用户还可以从IP路由功能中得益,使得分布于世界任何地方的设备之间都可以进行通讯。施耐德电气还提供了全套的网关,用于实现Modbus TCP/IP网络与现有的Modbus PLUS 或Modbus串行链路网络之间的互连。 IANA委员会给施耐德电气公司分配了已为大家熟知的TCP 502端口,以专为Modbus协议保留。由此可见,Modbus协议现在已经成为Internet标准。Modbus和Modbus TCP/IP 也被IEC 61158国际标准承认为一种现场总线,同时它们还是由ITEI管理的中国国家标准。 Modbus拥有著名的TCP端口502 Modbus TCP/IP是唯一个被分配到互联网端口的工业以太网专题">工业以太网协议! 23 -Telnet 远程登录协议 21 -FTP 文件传输协议 161 -SNMP 简单网络管理协议 25 -SMTP 简单邮件传输协议 53 -DNS 域名解析服务

Modbus协议中文版(比较完善)

GB/T ××××—×××× 前言 -----------串行链路和TCP/IP上的MODBUS标准介绍 该标准包括两个通信规程中使用的MODBUS应用层协议和服务规范: ·串行链路上的MODBUS MODBUS串行链路取决于TIA/EIA标准:232-F和485-A。 ·TCP/IP上的MODBUS MODBUS TCP/IP取决于IETF标准:RFC793和RFC791有关。 串行链路和TCP/IP上的MODBUS是根据相应ISO层模型说明的两个通信规程。 下图强调指出了该标准的主要部分。绿色方框表示规范。灰色方框表示已有的国际标准(TIA/EIA和IETF标准)。 Modbus 协议规范 45页 MODBUS应用层MODBUS报文传输在TCP/IP 上的实现指南49页 在TCP/IP上的MODBUS映射 TCP IETF RFC 793 MODBUS报文IP IETF RFC 791 传输在串行链路 上的实现指南 45页 串行链路主站/从站以太网II/802.3 IEEE 802.2 TIA/EIA-232-F TIA/EI A-485-A 以太网物理层 MODBUS标准分为三部分。第一部分(“Modbus协议规范”)描述了MODBUS事物处理。第二部分(“MODBUS报文传输在TCP/IP上的实现指南”)提供了一个有助于开发者实现TCP/IP上的MODBUS应用层的参考信息。第三部分(“MODBUS报文传 输在串行链路上的实现指南”)提供了一个有助于开发者实现串行链路上的MODBUS 应用层的参考信息。

GB/T ××××—××××第一部分:Modbus协议 1

Modbus标准通讯协议格式

Modbus通讯协议 Modbus协议 Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 当在网络上通信时,Modbus协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成应答并使用Modbus 协议发送给询问方。 Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave 端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。 Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。 下面我来简单的给大家介绍一下,对于Modbus的ASCII、RTU和TCP协议来说,其中TCP和RTU协议非常类似,我们只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。所以在这里我仅介绍一下

MODBUS协议简介

第一章MODBUS协议简介 MODBUS协议详细定义了校验码、数据序列等,这些都是特定数据交换的必要内容。 MODBUS协议在一根通讯线上使用RS485应答式连接(半双工),这意味着在一根单独的通讯线上信号沿着相反的两个方向传输。首先,主计算机的信号寻址到一台唯一的终端设备(从机),然后,在相反的方向上终端设备发出的应答信号传输给主机。 MODBUS协议只允许在主计算机和终端设备之间,而不允许独立的设备之间的数据交换,这就不会在使它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。 1.1传输方式 传输方式是一个数据帧内一系列独立的数据结构以及用于传输数据的有限规则,下面定义了与MODBUS 协议– RTU方式相兼容的传输方式。 ◆Coding System 二进制编码8位 ◆Start bit 起始位1位 ◆Data bits 数据位8位 ◆Parity 校验无奇偶校验 ◆Stop bit 停止位1位 ◆Error checking 错误检测CRC(循环冗余校验) [注]瑞士DAE公司的网络电力仪表响应查询信号的时间为0.1 ~ 1.0秒(典型值为0.4秒) 1.2协议 当数据帧到达终端设备时,它通过一个简单的“口”进入寻址到的设备,该设备去掉数据帧的“信封”(数据头),读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据加入到取得的“信封”中,把数据帧返回给发送者。返回的响应数据中包含了以下内容:终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和一个校验码(Check)。发生任何错误都不会有成功的响应。 1.2.1数据帧格式 图 1 – 1 .数据帧格式 1.2.2地址(Address)域 地址域在帧的开始部分,由一个字节8位(0 ~ 255)组成,这些位标明了用户指定的终端设备的地址,该设备将接收来自与之相连的主机数据。每个终端设备的地址必须是唯一的,仅仅被寻址到的终端会响应包含了该地址的查询。当终端发送回一个响应,响应中的从机地址数据便告诉了主机哪台终端正与之进行通信。

modbus协议

modbus协议中提到线圈、寄存器地址等定义,如下表: 1、线圈可不可以直接定义成一个位变量或者直接置某变量的某一位? 答:可以 2、功能码01与02有什么区别?03与04有什么区别? 答:01:线圈,继电器状态 02:输入,开关量状态 03:保持寄存器,设置的各种参数 04:输入寄存器,实时数据 3、功能码11和12分别是什么意思? 答:3、11:通信超时或错误时询问用 12:询问从机检测到的各种故障、异常事件 4、表2的数据类型是不是指相应的功能码只能传送或修改相应的数据类型,比如功能码01只能进行位的操作? 答:功能码01、02读到的位满8个组合成一个字节,可以用功能04读取 5、功能码实现的功能可不可以自己随便定义?比如让01功能实现某变量自加或进行EEP操作等? 答:不可以 6、对于CRC16,我用模2除得到的校验码与用查表法得到的数据始终不一样,不晓得是为什么?(为计算简单,只取一个8位二进制数算校验码。而且用同样的方法,对应书上的简单例子(比如,4位二进制,R=3)的校验用模2除是对的)答:#include (未验证过) 7、这里提到的保持和输入寄存器是不是可以直接对应某一个变量,而不是指真正的寄存器?继电器状态和开关量状态也是这样?

答:是的。 8、好多资料都提到单片机上应用Modbus一般不会是标准的Modbus,是Modbus 的一个变形。那可否用04功能来读系统设置的参数,03功能来读取AD或其它检测的实时数据?或者由03或04中的一个来完成读系统设置的参数和AD或其它设备检测到的实时数据。 答:如果你要和别家的Modbus兼容,哪你要按标准。读系统设置的参数用03,读取AD或其它检测的实时数据用04。如果不需要兼容则随便什么功能码 表1 ModBus功能码 功能码名称作用 01 读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF) 02 读取输入状态取得一组开关输入的当前状态(ON/OFF) 03 读取保持寄存器在一个或多个保持寄存器中取得当前的二进制值 04 读取输入寄存器在一个或多个输入寄存器中取得当前的二进制值 05 强置单线圈强置一个逻辑线圈的通断状态 06 预置单寄存器把具体二进值装入一个保持寄存器 07 读取异常状态取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态 08 回送诊断校验把诊断校验报文送从机,以对通信处理进行评鉴 09 编程(只用于484)使主机模拟编程器作用,修改PC从机逻辑 10 控询(只用于484)可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送

Modbus+RTU+标准通讯协议格式

HLP_SV Modbus RTU 标准通讯协议格式 通信资料格式 Address Function Data CRC check 8 bits 8 bits N×8bits 16bits 1)Address通讯地址:1-247 2)Function:命令码8-bit命令 01 读线圈状态 上位机发送数据格式: ADDRESS 01 ADDRH ADDRL NUMH NUML CRC 注: ADDR: 00000 --- FFFF(ADDR=线圈地址-1);NUM: 0010-----0040 (NUM为要读线圈状态值的二进制数位数) 正确时变频器返回数据格式: ADDRESS 01 BYTECOUNT DA TA1 DA TA2 DA TA3 DA TAN CRC 注: BYTECOUNT:读取的字数 错误时变频器返回数据格式: ADDRESS 0X81 Errornum CRC 注: Errornum为错误类型代码 如:要检测变频器的输出频率 应发送数据:01 01 00 30 00 10 3D C9(16进制) 变频器返回数据:01 01 02 00 20 B8 24(16进制) 发送数据:0030hex(线圈地址49) 返回的数据位为“0020”(16进制),高位与低位互换,为2000。即输出频率为 303(Max Ref)的50%。关于2000对应50%,具体见图1。

03读保持寄存器 上位机发送数据格式: ADDRESS 03 ADDRH ADDRL NUMH NUML CRC 注:ADDR: 0 --- 0XFFFF;NUM: 0010-----0040 (NUM为要读取数据的字数) ADDR=Parameter Numbe r×10-1 正确时变频器返回数据格式: ADDRESS 03 BYTECOUNT DA TA1 DA TA 2 DA TA 3 DA TAN CRC 注: BYTECOUNT:读取的字节数 错误时变频器返回数据格式: ADDRESS 0X83 Errornum CRC 如:要读变频器参数303的设定值 应发送数据:01 03 0B D5 00 02 95 BC (16进制) Parameter 303(3029)=0BD5HEX 变频器返回数据:“:”01 03 04 00 00 EA 60 B5 7B 返回的数据位为“00 00 EA 60”(16进制)转换为10进制数为60000, 表示303设置值为60.000 ※当参数值为双字时,NUM的值必须等于2。否则无法读取或读取错误。 05 写单个线圈状态 上位机发送数据格式: ADDRESS 05ADDRH ADDRL DA TAH DA TAL CRC 注:ADDR: 0 ---- 0XFFFF(ADDR=线圈地址-1);DATA=0000HEX(OFF) OR FF00(ON) HEX 正确时变频器返回数据格式: ADDRESS 05 DATAH DATAL BYTECOUNT CRC 错误时变频器返回数据格式: ADDRESS 0X85 Errornum CRC 如:要使写参数为写入RAM和EEPROM 应发送数据:01 05 00 40 FF 00 CRC(16进制) 变频器返回数据:01 05 FF 00 00 01 CRC(16进制) 发送数据:0040hex(线圈地址65) 06 写单个保持寄存器值(只能写参数值为单个字的参数) 上位机发送数据格式: ADDRESS 06 ADDRH ADDRL DA TAH DA TAL CRC 注:ADDR: ADDR=Parameter Numbe r×10-1 正确时变频器返回数据格式: ADDRESS 06 ADDRH ADDRL DA TAH DA TAL CRC 错误时变频器返回数据: ADDRESS 0X86 Errornum CRC 如:要对变频器参数101写入1 应发送数据:01 06 00 03 F1 00 01 19 BD(16进制) 变频器返回数据:01 06 03 F1 00 01 19 BD(16进制) PARAMETER 101(1009)=03F1 HEX

MODBUS-TCP协议介绍

MODBUS-TCP ~ ~~ IEEE 802.3 CSMA/CD 10Mb/s (1)10 Base 5 RG-8 500m (2)10 Base 2 RG-58 185m (3)10 Base T UTP STP 100m ~~ 100Mb/s 802.3a 100 Base Tx 100 Base Fx ~~ 10/100M 100M “ ” (UTP) 100m 2 3km 100km 1000Mb/s 802.3z/802.3ab 10Gb/s 802.3ae ~ ~~ IEEE802.3 EN50081-2 EN50082-2 1 DIN UTP STP( ) ~TCP/IP 1. TCP/IP ~~ TCP/IP 20 80 X.25 TCP/IP ( ) TCP/IP TCP/IP TCP/IP

Internet TCP/IP TCP/IP ~~ TCP/IP OSI OSI TCP/IP 1 TCP/IP 2. Internet Protocol(IP) ~~IP Internet RFC79 ( RFC: Request For Comments ) ~~IP IP “ ” I/O IP IP IP “IP ” “ ” “ ” “ ” IP IP ~~IP IP 2

~~IP 4 ( 3 ) A 16387064 (1 126) B 64516 ( 128 191) C 254 ( 192 223) D (“0.0.0.0”) 1 (“255.255.255.255”) 3. Transmission Control Protocol (TCP) ~~TCP ( 4 ) RFC793 TCP TCP TCP

MODBUS TCPIP协议 介绍

1.该规范的发展概况 原始版本1997年9月3日作为公共评论的草案。 再版1999年3月29日,即修订版1.0。 没有大的技术改动,仅作了补充说明。增加了附录A和B作为对一些常用执行问题的回应。 该Modbus/TCP规范在万维网上公开发行。它表明开发者的意愿是把它作为工业自动化领域具有互用性的标准。 既然MODBUS和MODBUS/TCP作为事实上的“实际”标准,而且很多生产商已经实现了它的功能,此规范主要是阐述在互连网上具有普遍可用性的基于TCP通讯协议的MODBUS 报文的特殊编码。 2. 概述 MODBUS/TCP是简单的、中立厂商的用于管理和控制自动化设备的MODBUS系列通讯协议的派生产品。显而易见,它覆盖了使用TCP/IP协议的“Intranet”和“Internet”环境中MODBUS报文的用途。协议的最通用用途是为诸如PLC’s,I/O模块,以及连接其它简单域总线或I/O模块的网关服务的。 MODBUS/TCP协议是作为一种(实际的)自动化标准发行的。既然MODBUS已经广为人知,该规范只将别处没有收录的少量信息列入其中。然而,本规范力图阐明MODBU S中哪种功能对于普通自动化设备的互用性有价值,哪些部分是MODBUS作为可编程的协议交替用于PLC’s的“多余部分”。

它通过将配套报文类型“一致性等级”,区别那些普遍适用的和可选的,特别是那些适用于特殊设备如PLC’s的报文。 2.1 面向连接 在MODBUS中,数据处理传统上是无国界的,使它们对由噪音引起的中断有高的抵抗力,而且在任一端只需要最小的维护信息。 编程操作,另一方面,期望一种面向连接的方法。这种方法对于简单变量通过唯一的“登录”符号完成,对于Modbus Plus变量,通过明确的“程序路径”容量来完成,而“程序路径”容量维持了一种双向连接直到被彻底击穿。 MODBUS/TCP处理两种情况。连接在网络协议层很容易被辨认,单一的连接可以支持多个独立的事务。此外,TCP允许很大数量的并发连接,因而很多情况下,在请求时重新连接或复用一条长的连接是发起者的选择。 熟悉MODBUS的开发者会感到惊讶:为什么面向连接TCP协议比面向数据报的UDP 要应用广泛。主要原因是通过封装独立的“事务”在一个连接中,此连接可被识别,管理和取消而无须请求客户和服务器采用特别的动作。这就使进程具有对网络性能变化的适应能力,而且容许安全特色如防火墙和代理可以方便的添加。 类似的推理被最初的万维网的开发者所采用,他们选用TCP及端口80去实现一个作为单一事务的最小的环球网询问。 2.2 数据编码

Modbus协议

㈠MODBUS规约 MODBUS规约是MODICOM公司开发的一个为很多厂商支持的开放规约, Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 最主要的是它被很多组态软件所兼容,开发速度较快,受到了很多工控厂商的追捧。但是协议还是有点小麻烦的。 此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。 当在Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus 协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。 标准的Modbus口是使用RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。 控制器通信使用主—从技术,即仅设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据做出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。 主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、错误检测域。 从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据和错误检测域。如果在消息接收过程中发生错误,或从设备不能执行其命令,从设备将建立错误消息并把它作为回应发送出去。 在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。 在消息位,Modbus协议仍提供了主—从原则,尽管网络通信方法是“对等”。如果控制器发送消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到消息,它将建立一从设备回应格式并返回给发送的控制器。 .主设备查询 查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据

modbus协议解析

目录 1、Modbus简介 (2) 1.1MODBUS功能码简述 (3) 1.2功能码说明 (4) 1.3寄存器种类说明 (5) 1.4 PLC地址和协议地址区别 (6) 1.4.1 寄存器PLC地址 (6) 1.4.2 寄存器协议地址 (6) 2.MODBUS指令说明 (6) 2.1 读线圈寄存器01H (6) 2.2 读离散输入寄存器02H (9) 2.3 读保持寄存器03H (11) 2.4 读输入寄存器04H (13) 2.5 写单个线圈寄存器05H (15) 2.6 写单个保持寄存器06H (17) 2.7 写多个线圈寄存器0FH (18) 2.8 写多个保持寄存器10H (21)

1、Modbus简介 Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。 ModBus网络只有一个主机,所有通信都由他发出。网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定. Modbus比其他通信协议使用的更广泛的主要原因有: (1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。目前,支持Modbus的厂家超过400家,支持Modbus 的产品超过600种。 (2)Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。 (3)Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。其传输模式有:RTU、ASSCII 、TCP

相关主题