Modbus通讯协议常见问题

合集下载

Modbus通讯协议详解

Modbus通讯协议详解

Modbus通讯协议详解一、引言Modbus通讯协议是一种常用的串行通信协议,广泛应用于工业自动化领域。

本文将详细解析Modbus通讯协议的基本原理、数据格式、通信流程以及常见问题。

二、基本原理1. Modbus通讯协议采用主从结构,主要包括一个主站和多个从站。

主站负责发起通信请求,从站负责响应请求并返回数据。

2. Modbus通讯协议基于传统的串行通信方式,支持RS-232、RS-485等物理层接口。

3. Modbus通讯协议采用简单的请求/响应模式,主站发送请求帧,从站响应并返回数据帧。

三、数据格式1. Modbus通讯协议的数据单元被称为“寄存器”,分为输入寄存器(Input Register)、保持寄存器(Holding Register)、线圈(Coil)和离散输入(Discrete Input)四种类型。

2. 输入寄存器用于从站向主站传输只读数据,保持寄存器用于双向传输读写数据,线圈用于从站向主站传输开关量数据,离散输入用于主站向从站传输只读开关量数据。

3. Modbus通讯协议采用16位的数据单元标识符,用于标识寄存器的类型和地址。

4. 数据帧包括起始符、设备地址、功能码、数据区、错误校验等字段。

四、通信流程1. 主站向从站发送请求帧,请求帧包括设备地址、功能码、数据区等字段。

2. 从站接收到请求帧后,根据功能码执行相应的操作,并将结果存储在数据区中。

3. 从站发送响应帧,响应帧包括设备地址、功能码、数据区等字段。

4. 主站接收到响应帧后,解析数据区中的结果,并进行相应的处理。

五、常见问题1. Modbus通讯协议的数据传输是基于字节的,因此在不同字节序的系统中需要进行字节序转换。

2. Modbus通讯协议的速率、数据位、停止位和校验位等参数需要保持一致,否则通信将无法建立。

3. Modbus通讯协议的设备地址是唯一的,主站通过设备地址来区分不同的从站。

4. Modbus通讯协议的功能码定义了不同的操作类型,主站通过功能码来指定所需的操作。

ModbusTCP通讯协议

ModbusTCP通讯协议

ModbusTCP通讯协议协议名称:ModbusTCP通讯协议一、引言ModbusTCP通讯协议是一种基于TCP/IP协议的通信协议,用于在工业自动化系统中实现设备之间的数据通信。

本协议旨在定义ModbusTCP通讯协议的基本规范和通信流程,以确保设备之间的可靠通信和数据交换。

二、术语和定义在本协议中,以下术语和定义适用:1. ModbusTCP:基于TCP/IP协议的Modbus通讯协议。

2. 客户端:发起通信请求的设备或软件。

3. 服务器:响应客户端请求的设备或软件。

4. 单元标识符:用于标识设备或软件的唯一标识符。

5. 寄存器:用于存储和交换数据的内存单元。

三、通信流程1. 建立连接客户端通过TCP/IP协议与服务器建立连接。

客户端发送连接请求,服务器接受请求并返回确认信息,建立连接成功。

2. 请求报文格式客户端向服务器发送请求报文,报文格式如下:- 事务标识符:用于标识请求的唯一标识符。

- 协议标识符:用于标识ModbusTCP协议。

- 长度字段:指定报文长度。

- 单元标识符:用于标识设备或软件的唯一标识符。

- 功能码:指定请求的功能类型。

- 数据字段:包含请求的具体数据。

3. 响应报文格式服务器接收到请求后,根据请求的功能码进行相应的处理,并返回响应报文。

报文格式如下:- 事务标识符:与请求报文相同的标识符。

- 协议标识符:与请求报文相同的标识符。

- 长度字段:指定报文长度。

- 单元标识符:与请求报文相同的标识符。

- 功能码:与请求报文相同的功能码。

- 数据字段:包含响应的具体数据。

4. 功能码ModbusTCP通讯协议定义了多种功能码,用于实现不同类型的数据交换和操作。

常用的功能码包括:- 读取线圈状态:用于读取设备的线圈状态。

- 读取输入状态:用于读取设备的输入状态。

- 读取保持寄存器:用于读取设备的保持寄存器数据。

- 读取输入寄存器:用于读取设备的输入寄存器数据。

- 写单个线圈:用于写入设备的单个线圈状态。

Modbus协议使用常见问题分析

Modbus协议使用常见问题分析

Modbus协议使用常见问题分析Modbus 协议最初由Modicon 公司开发出来,是针对PLC 设备设计的基于串行总线的主从模式的应用层总线设备协议。

ModbusTCP 是封装在TCP包内的Modbus 协议,虽然有一些变化,但是根本上还是主从模式。

随着嵌入式技术的发展,国内很多系统的控制和采集单元部分为公司自主研发,一般建议这些公司的串行通讯协议采用Modbus 协议,很多用户在modbus 协议存在着理解错误,现在分析如下:一、modbus 的保持和输入寄存器是以word(16bit)为单位的。

比如4****(保持寄存器/输出寄存器)和3****(输入寄存器)是以字为单位的。

所以,如果读40001 寄存器开始的一个16 位的无符号数,那么返回2 个Byte,并可以从40002 开始读下一个16 位的无符号数。

但是,如果读40001 寄存器开始的一个32 位浮点数,那么,返回4 个Byte,而且,下一个32 位浮点数必须从40003 开始。

常见问题:1)、将40001 定义为一个Byte 的数据;2)、将40001 定义为32 位浮点数,40002 为下一个32 位浮点数。

二、寄存器最小地址为1,而报文起始地址为0。

在数据报文中,所有的modbus 地址都是从0 开始的。

也就是首次出现的数据项在报文中的地址为0。

比如: 1.在控制器中,线圈1 在Modbus 报文的地址域中的地址为00 00。

2.线圈127 的十六进制报文地址为007E hex(十进制的126) 3.保持寄存器40001 的报文地址为00 00。

因为报文功能码明确要操作保持寄存器,所以,协议就以4XXXX 代表这个寄存器。

4.保持寄存器40108 的报文地址为006B hex (十进制107)总之,Modbus 地址一般指4****(保持寄存器/输出寄存器)和3****(输入寄存器),这时应用层面的:比如设备说明书可以简要说明设备支持Modbus RTU 标准协议,并详细描述其地址对应关系为:40001 -- 模拟量采集通道1,16 位有。

modbus 通讯常见问题

modbus 通讯常见问题

Modbus 通讯常见问题这里不介绍过多Modbus的原理和理论,我也不熟悉。

废话少说,直接开始常见问题。

1、接线问题:现在大部分采用两线制(四线制较少用,这里不介绍)接线方式,采用屏蔽双绞线。

大部分厂家的接线端子标识为:A、B,但是由于各厂家之间的有可能采用的规范不太一样,有的A是正极,有的B是正极,再加上有第三方设备接线混乱,正负经常接反。

通讯之前干两件事:a)第三方设备,也就是从站线接好,用万用表量线间电压,通常会量到1~5V(个别的会到8V)的电压,没有电压,通讯肯定不通,检查线路和接线,以及第三方设备;b)量到电压,判断正负,接到主站设备对应端子上来。

2、信号源问题:确认线路正常,通讯配置及读取地址正确,通讯还是不通,有可能就是信号源的问题。

信号源的问题通常是信号衰减或者有干扰源。

Modbus通讯的理论距离是1200M,距离越长,信号衰减越厉害,加上有一些电缆质量较差,衰减更厉害。

干扰源就不用介绍了。

解决的方法如下:a)信号衰减:更换质量更好的电缆,或者在通讯电缆中间加中继器(优点可以延长Modbus通讯的理论距离,缺点是需要供电);b)干扰源:最理想的方法是排除干扰源(比较艰难)。

也可以尝试更换屏蔽效果更好的电缆,尽量减少和供电电缆放到一起。

另外,有些设备Modbus接线端子没有终端电阻,可以在电缆两端各并联一个终端电阻(电阻为120欧,哪端如果有,就不用加了,具体有没有查看设备样本,一般都会有说明)。

3、通讯配置:主从站配置(波特率、数据位数、停止位数、奇偶校验)一致就可以,不多说了。

4、通讯地址:这个是问题最多的,下面我把自己碰到问题列出来及解决方法列出来,供大家参考。

a)地址偏移:有时会发现第三方设备给你的地址表和你自己读取的不一致,甚至是读不出来,你可以尝试往前或往后读一位,比如说,地址是40001,你可以尝试读取40000或者40002;b)读取数量:有一些设备寄存器较小,读太多和通讯错误;还有一些设备,主站读取数量必须与从站一致,比如说,16位模拟量有三个,你就只能读取三个,数字量有7位,你只能读取7位。

“MODBUS”常见问题解答

“MODBUS”常见问题解答

“MODBUS”常见问题解答1. 我的设备支持modbus设备,能否直接与组态王软件连接?只要设备是标准的modbus 协议设备,即可使用组态王设备列表下的PLC-->莫迪康-->MODBUSRTU(或者ACSII 码)进行通信。

但具体的寄存器地址对照表必须从设备厂家索取。

2. 我的支持modbus 协议的串口设备,能否与多个上位软件(比如组态王软件和某品牌触摸屏)同时通讯?因为modbus 串口协议不支持多主站,所以不能多个软件同时与modbus 设备同时通信。

3. 在组态王工程中建立多个modbusTCPIPserver 设备定义,分别使用两台客户端对其访问,只有站点高的那个server 通讯ok,站点低的通讯失败,为什么?这是因为在组态王软件中只支持建立一个modbusTCPIPserver,当建立多个server 时,组态王客户端则会自动与站点高的server进行通讯,所以会导致站点低的通讯失败。

4. 如何实现组态王数据通过串口或者以太网驱动方式传送到其他组态软件或者应用程序中?如果其他组态软件或者应用程序支持modbus 协议,则可以通过组态王提供的modRTUserver 或者modbusTCPserver 驱动来实现。

5. 组态王与支持Modbus协议的设备进行通讯时,组态王画面上显示的数据不正确常有哪些原因?引起数据不正确的原因主要有如下几点:1)组态王中定义的寄存器地址跟实际设备不一致导致。

比如某些使用modbus 协议通讯的设备的数据地址是从0 开始的,而组态王modbus 协议驱动寄存器地址是从1 开始的,所以遇到此种情况时在组态王中定义变量时,寄存器地址要进行加1 处理;2)数据词典中最大原始值和最大值定义不不当;比如最大原始值和最大值不一样会导致画面看到的数据和实际设备不一致;3)组态王读取FLOAT 和LONG 类型的数据时,没有使用提供的SwapF 和SwapL 寄存器来调整FLOAT 型和LONG型数据的字节顺序;4)LONG 或FLOAT 型的双字的数据,没有按照间隔隔地址方式定义;因为modbus 协议所对应的参数地址一般按照字为基本单位进行分地址排序的。

西门子S7-200-SMART之Modbus-RTU-通信常见问题及错误代码含义

西门子S7-200-SMART之Modbus-RTU-通信常见问题及错误代码含义

常见问题1.S7-200 SMART 是否支持Modbus ASCII 通信模式?STEP 7-Micro/WIN SMART 软件未提供Modbus ASCII 通信模式指令库。

S7-200 SMART CPU若用于Modbus ASCII 通信时,则需要用户使用自由口通信模式进行编程。

2. S7-200 SMART CPU 集成的RS485 端口(端口0 )以及SB CM01 信号板(端口1 )两个通信端口能否同时作为Modbus RTU 主站或者同时作为Modbus RTU从站?S7-200 SMART V2.2版本支持两个通信端口同时做MODBUS RTU主站,不支持同时做MODBUS RTU从站。

3. S7-200 SMART CPU作为Modbus RTU 主站如何访问Modbus 地址范围大于49999 的保持寄存器?通常Modbus 协议的保持寄存器范围在40001 到49999 之间,这个范围对于多数应用来说已经足够了,但有些Modbus 从站保持寄存器区的地址会超出该范围。

Modbus RTU 主站协议库支持保持寄存器地址范围为(40001 到49999)或者(400001 到465536)。

如果Modbus 从站地址范围为400001 –465536,只需在调用MBUS_MSG 子程序时给Addr 参数赋相应的值即可,如416768。

4.S7-200 SMART CPU作为Modbus RTU 主站,多次调用MBUS_MSG 指令时,为什么该指令会出现6# 错误代码?同一时间只能有一条MBUS_MSG 指令处于激活状态,如果激活多条MBUS_MSG 指令,将执行第一条MBUS_MSG 指令,所有后续MBUS_MSG 指令将中止执行并出现6# 错误代码。

多条MBUS_MSG 指令的执行需要采用轮询方式。

5.S7-200 SMART CPU作为Modbus RTU 主站,从站故障或者通信线路断开时,主站会尝试发送多次请求报文,从而导致通信时间过长。

通讯协议002——Modbus通讯常见故障处理

通讯协议002——Modbus通讯常见故障处理

Modbus通讯常见故障处理本文对modbus通讯常见的故障进行分析,并提出相应的处理方法。

Modbus通讯故障判断也是要围绕通讯三要素入手,即:通讯接口、通讯参数、数据格式(报文格式)。

1、通讯不上/通讯中断:多半是通讯接口、通讯链路上的问题。

调试软件会显示“connection failed”、“timeout error”的错误提示。

modscan、modbus poll(登录网信智汇wangxinzhihui下载)工具错误提示如下。

更多可能的原因及处理如下表所示:2、通讯不稳定:表现为数据断断续续,多半是由于线路干扰、接口不匹配、程序不稳定、设备老化等原因造成。

可通过modscan或modbus poll工具中的发送接收包数量来判断,两者相差越大,说明通讯越差。

更多可能的原因及处理如下表所示:1)请求功能不存在时,modbus poll显示错误“01 lllega function”,界面如下:Modscan显示错误“Modbus Exception Response from slave device”,界面如下:2)请求的数据不存在时,modbus poll显示错误“02 lllega data function”,界面如下:Modscan显示错误“Modbus Exception Response from slave device”,界面如下:更多可能的原因及处理如下表所示:常见modbus通讯错误码如下:功能码说明01 非法功能。

请求不存在的功能。

02 非法数据地址。

请求不存在的数据地址。

03 非法数据值。

对于服务器(或从站)来说,询问中包括的值是不可允许的值。

例如:隐含长度是不正确的。

04 从站设备故障。

当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。

05 确认。

与编程命令一起使用,服务器(或从站)已经接受请求,并且正在处理这个请求,但是需要长持续时间进行这些操作,返回这个响应防止在客户机(或主站)中发生超时错误,客户机(或主机)可以继续发送轮询程序完成报文来确认是否完成处理。

Modbus通讯注意事项及测试

Modbus通讯注意事项及测试

Modbus通讯注意事项及测试经常看到有很多同学在做Modbus通讯时,不知道如何设置参数,同时,如果通讯失败后,如何判断失败原因。

本文将重点介绍Modbus通讯的几个常见注意事项、通讯超时时间计算及常用的Modbus通讯测试工具。

很多同学在做Modbus通讯时,需要连续读取多个现场设备的数据,虽然也编写了Modbus轮询的程序,但是有时还是无法正常通讯。

有时虽然能够保证通讯,但是所有现场设备的轮询周期很长。

本文将从MBUS_CTRL的超时时间参数设置来说明超时时间设置的重要性。

一、通讯地址设定利用Modbus协议可以实现设备间的数据交换。

Modbus通讯理论上支持4种Modicon PLC地址,即0*、1*、3* 和4*四种,分别表示开出(中间线圈)、开入、模入、模出(中间寄存器)等数据地址。

与西门子或其它设备中的开入、开出、模入、模出地址完全不对应。

可以理解为0*和1*对应位地址的读写操作,3* 和4*字地址的读写操作。

此处0*、1*、3* 和4*表示长度有的为5位数字、有的为6位,其实和Modbus通讯无关,只是和软件的表示方式有关。

按照Modbus通讯时最常用的是RTU读请求格式:从站地址(1个字节)、功能代码(1个字节)、从站数据起始地址(2个字节)、读数据长度(2个字节)、CRC校验(2个字节)可见,只需设置起始从站数据区起始地址和通讯长度即可。

特别注意,Modbus地址遵从IEC1的地址标准(最小地址为*1),西门子遵从IEC0的标准(最小地址为0,如M0.0)。

因此,不同标准的地址做通讯时需要做地址变换,即加1的操作。

二、通讯故障诊断在做Modbus通讯时经常会出现通讯失败的现象,如果判断是程序问题还是别的问题,其实完全可以利用常见的Modbus测试软件来判断。

常见的Modbus测试软件有Modscan和Modsim。

也可以使用常见的串口调试工具软件,如SSCOM42等。

其中Modscan软件可以读取Modbus从站的数据,如果利用Modscan软件可以建立连接,但是设备间直连后无法通讯,问题可以在RS485极化、主站上。

MODBUS通讯协议经典问题

MODBUS通讯协议经典问题

1. 我的设备支持modbus设备,能否直接与组态王软件连接?只要设备是标准的modbus 协议设备,即可使用组态王设备列表下的PLC-->莫迪康-->MODBUSRTU(或者ACSII 码)进行通信。

但具体的寄存器地址对照表必须从设备厂家索取。

2. 我的支持modbus 协议的串口设备,能否与多个上位软件(比如组态王软件和某品牌触摸屏)同时通讯?因为modbus 串口协议不支持多主站,所以不能多个软件同时与modbus 设备同时通信。

3. 在组态王工程中建立多个modbusTCPIPserver 设备定义,分别使用两台客户端对其访问,只有站点高的那个server 通讯ok,站点低的通讯失败,为什么?这是因为在组态王软件中只支持建立一个modbusTCPIPserver,当建立多个s erver时,组态王客户端则会自动与站点高的server进行通讯,所以会导致站点低的通讯失败。

4. 如何实现组态王数据通过串口或者以太网驱动方式传送到其他组态软件或者应用程序中?如果其他组态软件或者应用程序支持modbus 协议,则可以通过组态王提供的modRTUserver 或者modbusTCPserver 驱动来实现。

5. 组态王与支持Modbus协议的设备进行通讯时,组态王画面上显示的数据不正确常有哪些原因?引起数据不正确的原因主要有如下几点:1)组态王中定义的寄存器地址跟实际设备不一致导致。

比如某些使用modbus 协议通讯的设备的数据地址是从0 开始的,而组态王modbus 协议驱动寄存器地址是从1 开始的,所以遇到此种情况时在组态王中定义变量时,寄存器地址要进行加1 处理;2)数据词典中最大原始值和最大值定义不不当;比如最大原始值和最大值不一样会导致画面看到的数据和实际设备不一致;3)组态王读取FLOAT 和LONG 类型的数据时,没有使用提供的SwapF 和SwapL寄存器来调整FLOAT 型和LONG型数据的字节顺序;4)LONG 或FLOAT 型的双字的数据,没有按照间隔隔地址方式定义;因为m odbus协议所对应的参数地址一般按照字为基本单位进行分地址排序的。

阿尔法MODBUS通讯协议应用常见问题及解决方法总结

阿尔法MODBUS通讯协议应用常见问题及解决方法总结

MODBUS通讯协议应用常见问题及解决方法总结――不能建立的通讯一、问题描述ALPHA6000和ALPHA6000S/V变频器,全部内置了RS485通讯协议,且硬件上也全部内置,为标准配置。

因此可以随时启用通讯功能。

但客户在使用中,也碰到不能通讯的情况,经常打电话询问变频器是不是有标配有通讯功能,485通讯是否遵循modbus协议等。

这就需要我们耐心的给客户解释。

二、原因分析1、ALPHA6000和ALPHA6000S/V变频器只支持03,06,10号指令,且只支持一个字节读写。

多写,多读,变频器不支持。

用文本屏或触摸屏,因为对通讯模式选择不对,可能发出的不是规定的03,06,10号指令,而是其他指令,如04号等,也可能发出读写2个字的指令,这些变频器都不响应。

2、通讯格式错误,没有按照modbus协议规范发出规约的数据,通常是CRC校验错误。

3、PLC或主机没有设定和变频器一致的波特率,通讯地址,奇偶校验。

4、通讯线路断开或接反了,报CCF6故障,通讯禁止。

5、通讯命令没有发出。

如写PLC程序,没有PLC定时条件或端子闭合发送条件,通讯命令还没有执行。

6、变频器欠压或数据写保护。

7、写入数据超出上下限,变频器不接受。

8、文本屏或PLC写入的参数不能保存。

三、解决措施及结果评估与原因分析相对应可以采取以下措施1、告知客户,阿尔法变频器遵循modbus协议,因为是精简的,目前只支持1个字读写,指令可用03,06,10号指令。

其他指令暂时不支持。

2、利用正确的指令格式,计算CRC,并发出数据。

3、修改变频器参数,使主机和变频器,波特率,地址,奇偶校验,3个统一4、检查线路,确认通讯线路是正常的,且没有接反;按STOP复位CCCF6故障后,恢复通讯功能。

5、查看PLC程序,确保通讯数据能够发出,且格式正确。

6、保证电压正常或使PF.01参数不写保护,运行中不能修改的参数,则不可修改,但可读出。

7、检查发出的数据,在说明书中,参数设定范围内。

S7200组态王通讯的问题MODBUS

S7200组态王通讯的问题MODBUS

“MODBUS”常见问题解答1. 我的设备支持modbus设备,能否直接与组态王软件连接?只要设备是标准的modbus 协议设备,即可使用组态王设备列表下的PLC-->莫迪康-->MODBUSRTU(或者ACSII 码)进行通信。

但具体的寄存器地址对照表必须从设备厂家索取。

2. 我的支持modbus 协议的串口设备,能否与多个上位软件(比如组态王软件和某品牌触摸屏)同时通讯?因为modbus 串口协议不支持多主站,所以不能多个软件同时与modbus 设备同时通信。

3. 在组态王工程中建立多个modbusTCPIPserver 设备定义,分别使用两台客户端对其访问,只有站点高的那个server 通讯ok,站点低的通讯失败,为什么?这是因为在组态王软件中只支持建立一个modbusTCPIPserver,当建立多个server时,组态王客户端则会自动与站点高的server进行通讯,所以会导致站点低的通讯失败。

4. 如何实现组态王数据通过串口或者以太网驱动方式传送到其他组态软件或者应用程序中?如果其他组态软件或者应用程序支持modbus 协议,则可以通过组态王提供的modRTUserver 或者modbusTCPserver 驱动来实现。

5. 组态王与支持Modbus协议的设备进行通讯时,组态王画面上显示的数据不正确常有哪些原因?引起数据不正确的原因主要有如下几点:1)组态王中定义的寄存器地址跟实际设备不一致导致。

比如某些使用modbus 协议通讯的设备的数据地址是从0 开始的,而组态王modbus 协议驱动寄存器地址是从 1 开始的,所以遇到此种情况时在组态王中定义变量时,寄存器地址要进行加1 处理;2)数据词典中最大原始值和最大值定义不不当;比如最大原始值和最大值不一样会导致画面看到的数据和实际设备不一致;3)组态王读取FLOAT 和LONG 类型的数据时,没有使用提供的SwapF 和SwapL寄存器来调整FLOAT 型和LONG型数据的字节顺序;4)LONG 或FLOAT 型的双字的数据,没有按照间隔隔地址方式定义;因为modbus协议所对应的参数地址一般按照字为基本单位进行分地址排序的。

ModbusTCP通讯协议 (2)

ModbusTCP通讯协议 (2)

ModbusTCP通讯协议协议名称:ModbusTCP通讯协议一、引言ModbusTCP通讯协议是一种基于TCP/IP网络的通信协议,用于在不同设备之间进行数据传输和通信。

本协议旨在规范ModbusTCP通讯的数据格式、通信方式、错误处理等相关内容,以确保通信的可靠性和一致性。

二、术语定义1. ModbusTCP:基于TCP/IP网络的Modbus通信协议。

2. 主站:发送请求并接收响应的设备。

3. 从站:接收请求并发送响应的设备。

4. 传输单元标识符(Unit Identifier):用于标识从站设备的唯一标识符。

5. 功能码(Function Code):用于定义Modbus请求的类型和操作。

6. 寄存器(Register):用于存储数据的内存单元。

三、通信方式1. 连接建立主站与从站之间的连接通过TCP/IP网络建立。

主站作为客户端发起连接请求,从站作为服务器接受连接请求。

2. 数据格式ModbusTCP通讯协议采用大端字节顺序(Big-Endian)进行数据传输。

数据包括请求数据包和响应数据包。

请求数据包格式:- 事务标识符(Transaction Identifier):2字节,用于标识请求和响应的匹配关系。

- 协议标识符(Protocol Identifier):2字节,用于标识ModbusTCP协议。

- 长度字段(Length Field):2字节,表示后续字段的字节数。

- 单元标识符(Unit Identifier):1字节,用于标识从站设备。

- 功能码(Function Code):1字节,用于定义Modbus请求的类型和操作。

- 数据字段(Data Field):可变长度,根据具体功能码和操作而定。

- CRC校验(Cyclic Redundancy Check):2字节,用于检测数据传输的错误。

响应数据包格式:- 事务标识符(Transaction Identifier):2字节,与请求数据包的事务标识符匹配。

Modbus通讯协议使用常见问题分析

Modbus通讯协议使用常见问题分析

Modbus通讯协议使用常见问题分析Modbus协议最初由Modicon公司开发出来,是针对PLC设备设计的基于串行总线的主从模式的应用层总线设备协议。

ModbusTCP是封装在TCP包内的Modbus协议,虽然有一些变化,但是根本上还是主从模式。

随着嵌入式技术的发展,国内很多系统的控制和采集单元部分为公司自主研发,我一般建议这些公司的串行通讯协议采用Modbus协议,在和客户的沟通中,我发现很多常见的针对modbus协议理解错误,现在分析如下:1、modbus的保持和输入寄存器是以word(16bit)为单位的。

(Data is packed as two bytes per register.)比如4****(保持寄存器/输出寄存器)和3****(输入寄存器)是以字为单位的。

所以,如果读40001寄存器开始的一个16位的无符号数,那么返回2个Byte,并可以从40002开始读下一个16位的无符号数。

但是,如果读40001寄存器开始的一个32位浮点数,那么,返回4个Byte,而且,下一个32位浮点数必须从40003开始。

客户问题:1)、将40001定义为一个Byte的数据;2)、将40001定义为32位浮点数,40002为下一个32位浮点数。

我们可以参考一下国标GBT_19582-1 2008 (基于Modubs协议的工业自动化网络规范)的功能码表:2、寄存器最小地址为1,而报文起始地址为0。

(Register 1 is addressed as 0)在数据报文中,所有的modbus地址都是从0开始的。

也就是首次出现的数据项在报文中的地址为0。

比如:(All data addresses in Modbus messages are referenced to zero. The first occurrence of a data item is addressed as item number zero. For example:)在控制器中,“线圈1”在Modbus报文的地址域中的地址为00 00。

关于ModBus RTU的常见问题汇总

关于ModBus RTU的常见问题汇总

一、ModBus RTU通讯协议与ModBus通讯协议有什么区别?ModBus协议是应用层报文传输协议(OSI模型第7层),它定义了一个与通信层无关的协议数据单元(PDU),即PDU=功能码+数据域。

ModBus协议能够应用在不同类型的总线或网络。

对应不同的总线或网络,Modbus协议引入一些附加域映射成应用数据单元(ADU),即ADU=附加域+PDU。

目前,Modbus有下列三种通信方式:1.以太网,对应的通信模式是MODBUSTCP。

2.异步串行传输(各种介质如有线RS-232-/422/485/;光纤、无线等),对应的通信模式是MODBUSRTU或MODBUSASCII。

3.高速令牌传递网络,对应的通信模式是ModbusPLUS。

二、关于ModBus RTU通讯协议的提问?ModBus主要由站地址(一个字节)+功能码(一个字节)+首地址(两个字节)+访问字数(两个字节)+校验码(CRC16或LRC两个字节)总共8个字节组成。

其实VB中编程很简单从组建添加MSComm组建就行了,难的是校验,三、ModBus、RTU、ModBus RTU分别是什么?ModBus协议是工控行业的标准协议,前身为莫迪康所写,现已被施奈德收购。

而ModBus 分为两种协议:即串口协议(ModBus rtu)和网口协议(ModBus tcp)协议,一般的工控机只支持rs232或者RS485的串口模式,这个时候工控机的协议栈里就只有modbusRTU协议,当他从串口接收到数据时,会直接根据报文中的数据进行控制,如果需要用modbusTCP协议进行传输,则需要使用带有网口的PLC。

具体的帧格式如下:ModBus RTU 地址域功能码数据差错校验ModBus TCP 目的地址协议id 长度单元号功能码数据简单的说tcp是由RTU加工而来的,而RTU则是另外一种概念,不包含在ModBus协议内,是工控行业对监控设备的简称。

四、关于modbus_RTU协议主机发送的命令的一些问题01 读保持线圈状态(Read coilstatus)02 读输入线圈状态(Readinput status)03 读保持寄存器(Readholding register)04 读输入寄存器(Readinput register)05 写单个线圈(Forcesingle coil)06 写单个寄存器(Presetsingle register)15 写多个线圈(Forcemultiple coils)16 写多个寄存器(Presetmultiple registers)这些都是什么意思答:01 读取逻辑线圈组状态02 读取离散量线圈组状态03 读取一个或多个保持寄存器的二进制值04 读取一个或多个输入寄存器的二进制值05 改变逻辑线圈状态06 改变单个寄存器的二进制值15 改变多个寄存器的二进制值16 指定多个操持寄存器的二进制值五、OPC转modbusRTU方式我现在有一个OPC服务器,里面很多tag,tag是AB里出来的,怎么将tag连到ModBus?Profibus、Fielbus、Modbus、CC-link等等是各中PLC硬件支持的通讯协议,这个是各厂商的硬件属性一样.只是现在计算机组态软件都支持很多种协议的PLC.你理解反了。

使用MODBUS协议与传感器、工控屏对接时碰到的问题

使用MODBUS协议与传感器、工控屏对接时碰到的问题

使用MODBUS协议与传感器、工控屏对接时碰到的问题当控制器作为可编程逻辑器件用于工控系统时,其需要与各种不同的传感器对接,同时需要与工控屏对接,以提供人机界面与用户进行交互;对接的传感器功能多种多样,有检测环境的温、湿度、二氧化碳、光照等的传感器。

有检测电压、电流、功率等的智能电表。

有用于智能灌溉用于检测雨量和水量的传感器。

...控制器与MODBUS设备的连接框图从传感器读取的数据的数据格式不同功能的传感器,其数据类型也可能不相同的。

控制器作为MODBUS主模式从作为从模式的传感器读取到数据之后,需要考虑采用什么样的数据格式对读取到的数据进行解析、处理、判断。

大部分情况下,数据是16位的无符号,但是也有一些特别的,比如:1.温度是16位的有符号数,一般温度会保留一位小数,比如从温度传感器读到的数据为65526时。

‘温度并不是6552.6°C,转为16位有符号数为-10,对应温度为-1°C。

2.有一次,帮客户对接RS485智能电表时,从智能电表读取到的有功功率出现了6000多kw的情况。

经排查,也是因为把本该是有符号数当作无符号数处理,另外智能电表在计算有功功率时没有做下限判断或者取绝对值处理,当小于0时置为0。

没有取绝对值处理,万一用户将电缆穿过电流互感器时,穿错了方向,导致读到的数据都是负数。

需要采集数据方做取绝对值的处理。

3.环境光照的动态范围很大,最低可能到1lux,最高可能到10*9次方lux,如下:黑夜:0.001—0.02lux;月夜:0.02—0.3lux;阴天室内:5—50lux;阴天室外:50—500lux;晴天室内:100—1000lux;夏季中午太阳光下的照度:约为10*9次方;因此,光照的数据格式为32位的无符号数。

4.有些水量传感器的数据为16位或者32位的BCD数。

以上,从传感器读取到的数据需要根据传感器的数据格式定义进行数据转换。

工控屏和传感器接到同一个RS485总线一般情况下,控制器工作于MODBUS主模式,传感器工作于MODBUS从模式。

wincc 走modbus tcp 通讯中断解决方案 概述及解释说明

wincc 走modbus tcp 通讯中断解决方案 概述及解释说明

wincc 走modbus tcp 通讯中断解决方案概述及解释说明1. 引言1.1 概述在现代工业控制系统中,使用Modbus TCP通讯协议来实现设备之间的数据交换已成为一种常见的方式。

然而,在使用WinCC软件进行Modbus TCP通讯时,经常会遇到通讯中断的问题。

因此,本文旨在介绍WinCC软件走Modbus TCP通讯中断的解决方案,并对可能出现的异常情况进行分析和解释。

1.2 文章结构文章主要分为五个部分:引言、正文、解决方案介绍、常见中断问题及解决方案以及结论。

首先,在引言部分,我们将概述本文内容并介绍文章的结构,为读者提供一个整体的了解。

1.3 目的本文的目的是帮助读者了解WinCC软件在走Modbus TCP通讯过程中可能遇到的中断问题,并提供相应的解决方案。

通过对Modbus TCP通讯原理以及WinCC软件的介绍,读者可以更好地理解该通讯方式下可能出现的异常情况,并学习如何针对这些问题进行处理和排查故障。

以上是引言部分内容,请根据需要进行详细补充或修改。

2. 正文正文部分将重点介绍WinCC走Modbus TCP通讯中断解决方案。

在使用WinCC 软件进行Modbus TCP通讯过程中,可能会遇到一些异常情况导致通讯中断。

本节将详细探讨这些异常情况及其解决方案。

首先,我们会介绍Modbus TCP通讯的原理和工作机制。

Modbus TCP是一种基于TCP/IP协议的通讯协议,通过以太网传输数据。

我们将深入了解它的通信流程和数据帧结构。

接下来,我们会对WinCC软件进行介绍。

WinCC是西门子公司开发的一款用于监控和数据采集的软件,它能够与各种PLC和设备进行通讯。

我们将了解其主要特点、功能以及在工业自动化领域中的应用。

然后,我们将深入研究WinCC在走Modbus TCP通讯时可能出现的异常情况。

这些异常包括网络中断、数据传输错误以及硬件故障引起的中断等情况。

我们将分析这些异常情况产生的原因,并提供相应的解决方案。

Modbus通讯错误代码

Modbus通讯错误代码

常见的错误代码有:3:基本上是从站无响应,从站地址错了102:从站不支持此种数据地址,地址40000,30000等不对,在从站中没有对应的地址103:从站不支持此种数据类型,类型不对,开头的4,3,1,0没有选择正确,应看清楚是读写型整型还是只读型整型还是读写型开关量。

读写型整型是4开头,只读型整型是3开头,读写型开关量是0开头,只读型开关量是1开头。

计算方法为:3个字符包含9-10个位(8个数据位+1或2个停止位),即27-30个位,在波特率为9600的情况下,传输速率约为3ms。

MODBUS最高能到多少波特率?38.4k应该没有问题;我公司是SIEMENS PLC 和MODBUS 通信,最大19200;这个跟从站有很大的关系,与所选的接口芯片有直接关系;西门子S7-200的居然可以达到115200最大的都是理论值,现实中用的很少;115200的话,就该用ASCii协议了,RTU估计是容易丢包了;根据需要设置,与串口通讯波特率一样,常用的有19200、38400;根据下位机的波特率来决定通讯的波特率。

RS485是硬件连接,modbus是软件协议,波特率是串口通信的比特流速率。

Modbus从属协议执行错误代码:错误代码说明0 无错误1 内存范围错误2 非法波特率或校验3 非法从属地址4 非法Modbus参数值5 保持寄存器与Modbus从属符号重叠6 收到校验错误7 收到CRC错误8 非法功能请求/功能不受支持9 请求中的非法内存地址10 从属功能未启用1、重新设置主站询问时间,波特率、奇偶检验,停止位。

2、主、从站地址不能相同。

范围1-2473、检查通信线连接是否正常。

4、可采用MODBUS 串口软件测试下从站是否正常。

错误是10是未使能。

1、编程时使用SM0.1调用子程序MBUS_INIT进行初始化,使用SM0.0调用MBUS_SLAVE。

2、检查相关参数是否正常:、模式选择:启动/停止Modbus,1=启动;0=停止。

modbus协议响应帧长度不对,协议不完整

modbus协议响应帧长度不对,协议不完整

modbus协议响应帧长度不对,协议不完整让我们来了解一下什么是Modbus协议以及相关的响应帧长度不对和协议不完整的问题。

Modbus协议是一种用于工业领域的通信协议,用于实现设备之间的数据交换和通信。

在Modbus通信中,存在主机和从机的概念,主机负责向从机发送命令并接收响应,而从机负责接收命令并做出相应的响应。

然而,有时在使用Modbus协议进行通信时,会出现响应帧长度不对或协议不完整的问题。

这可能会导致通信数据的丢失或错误,进而影响到整个系统的稳定性和可靠性。

了解如何解决这些问题对于确保Modbus通信的正常运行至关重要。

接下来,让我们从简单到复杂,由浅入深地探讨这个主题。

1. Modbus协议简介Modbus协议是一种开放的通信协议,广泛应用于工业控制领域。

它基于主从架构,主机发送指令给从机,并接收从机的响应。

Modbus协议可以通过串行口或以太网等多种通信方式进行数据传输。

2. 响应帧长度不对的问题在Modbus通信中,响应帧长度不对的问题可能会导致通信数据的丢失或混乱。

这可能是由于数据传输过程中发生了错误,或者是设备本身存在故障。

从机发送的响应帧长度不符合预期,主机在解析响应时无法正确识别数据内容。

3. 协议不完整的原因另协议不完整可能是由于通信过程中发生了中断或丢包等问题导致的。

这可能是由于通信设备、网络环境或软件问题引起的,需要进行全面的排查和分析。

4. 解决响应帧长度不对和协议不完整的方法针对响应帧长度不对和协议不完整的问题,我们可以采取一系列措施来解决。

对通信设备和网络环境进行全面检查,确保设备工作正常且网络畅通。

可以通过调整通信参数或协议格式来避免响应帧长度不对和协议不完整的问题。

还可以优化通信协议的解析算法,提高数据解析的鲁棒性和准确性。

总结回顾:通过对Modbus协议响应帧长度不对和协议不完整的问题进行全面评估,我们深入了解了这些问题可能的原因和解决方法。

在实际应用中,我们需要重视通信设备的稳定性和可靠性,及时排查和解决通信问题,确保系统正常运行。

modbus 通讯常见问题

modbus 通讯常见问题

Modbus 通讯常见问题这里不介绍过多Modbus的原理和理论,我也不熟悉。

废话少说,直接开始常见问题。

1、接线问题:现在大部分采用两线制(四线制较少用,这里不介绍)接线方式,采用屏蔽双绞线。

大部分厂家的接线端子标识为:A、B,但是由于各厂家之间的有可能采用的规范不太一样,有的A是正极,有的B是正极,再加上有第三方设备接线混乱,正负经常接反。

通讯之前干两件事:a)第三方设备,也就是从站线接好,用万用表量线间电压,通常会量到1~5V(个别的会到8V)的电压,没有电压,通讯肯定不通,检查线路和接线,以及第三方设备;b)量到电压,判断正负,接到主站设备对应端子上来。

2、信号源问题:确认线路正常,通讯配置及读取地址正确,通讯还是不通,有可能就是信号源的问题。

信号源的问题通常是信号衰减或者有干扰源。

Modbus通讯的理论距离是1200M,距离越长,信号衰减越厉害,加上有一些电缆质量较差,衰减更厉害。

干扰源就不用介绍了。

解决的方法如下:a)信号衰减:更换质量更好的电缆,或者在通讯电缆中间加中继器(优点可以延长Modbus通讯的理论距离,缺点是需要供电);b)干扰源:最理想的方法是排除干扰源(比较艰难)。

也可以尝试更换屏蔽效果更好的电缆,尽量减少和供电电缆放到一起。

另外,有些设备Modbus接线端子没有终端电阻,可以在电缆两端各并联一个终端电阻(电阻为120欧,哪端如果有,就不用加了,具体有没有查看设备样本,一般都会有说明)。

3、通讯配置:主从站配置(波特率、数据位数、停止位数、奇偶校验)一致就可以,不多说了。

4、通讯地址:这个是问题最多的,下面我把自己碰到问题列出来及解决方法列出来,供大家参考。

a)地址偏移:有时会发现第三方设备给你的地址表和你自己读取的不一致,甚至是读不出来,你可以尝试往前或往后读一位,比如说,地址是40001,你可以尝试读取40000或者40002;b)读取数量:有一些设备寄存器较小,读太多和通讯错误;还有一些设备,主站读取数量必须与从站一致,比如说,16位模拟量有三个,你就只能读取三个,数字量有7位,你只能读取7位。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

?1)、写单个寄存器:
置单线圈(Force Single Coil)功能码05(0x05)
写单个寄存器(Preset Single Holding Register)功能码06(0x06)
------------------------------------------------------------------------------
设备地址 功能码 起始地址 寄存器个数 校验
11 03 00 00 00 02 --
客户问题:
1)、使用和定义40000地址;
2)、分析报文时,直接将报文起始地址当作应用层寄存器地址。
问题2:
有的Modbus设备对写命令没有返回,这样设备的上位机就不能确定这次写是否成功。
具体请参考:Modicon_Modbus协议.pdf
1.在控制器中,“线圈1”在Modbus报文的地址域中的地址为00 00。
(The coil known as ‘coil 1’ in a programmable controller is addressed as coil
0000 in the data address field of a Modbus message.)
Holding register 40001 is addressed as register 0000 in the data address field
of the message. The function code field already specifies a ‘holding register’
1、modbus的保持和输入寄存器是以word(16bit)为单位的。(Data is packed as two bytes per register.)
比如4****(保持寄存器/输出寄存器)和3****(输入寄存器)是以字为单位的。
所以,
如果读40001寄存器开始的一个16位的无符号数,那么返回2个Byte,并可以从40002开始读下一个16位的无符号数。
2.线圈127的十六进制报文地址为007E hex(十进制的126)
Coil 127 decimal is addressed as coil 007E hex (126 decimal).
3.保持寄存器40001的报文地址为00 00。因为报文功能码明确要操作“保持寄存器”,所以,协议就以“4XXXX”代表这个寄存器。
线圈(Coil)是状态量,对应Modbus设备的开关量输出(DO),保持寄存器(Holding Registers)是模拟量,对应Modbus设备模拟量输出(AO),这些寄存器需要Modbus设备的上位机进行设置,也就是为可以写的寄存器。
在Modicon_Modbus协议 协议中,写线圈(Coil)和保持寄存器(Holding Registers)都有两种写命令:
Modbus通讯协议使用常见问题分析
Modbus协议最初由Modicon公司开发出来,是针对PLC设备设计的基于串行总线的主从模式的应用层总线设备协议。ModbusTCP是封装在TCP包内的Modbus协议,虽然有一些变化,但是根本上还是主从模式。
随着嵌入式技术的发展,国内很多系统的控制和采集单元部分为公司自主研发,我一般建议这些公司的串行通讯协议采用Modbus协议,在和客户的沟通中,我发现很多常见的针对modbus协议理解错误,现在分析如下:
2、寄存器最小地址为1,而报文起始地址为0。(Register 1 is addressed as 0)
在数据报文中,所有的modbus地址都是从0开始的。也就是首次出现的数据项在报文中的地址为0。比如:(All data addresses in Modbus messages are referenced to zero. The first occurrence of a data item is addressed as item number zero. For example:)
?2)、写多个寄存器
写多线圈(Force Multiple Coils)功能码15(0x0F)
写多个寄存器(Preset Multiple Registers)功能码16(0作不全面,比如针对Holding Register,只支持16功能码,当定制Modbus设备只支持06功能码写的时候,出现这个DCS系统不能写此Modbus设备。
但是,
如果读40001寄存器开始的一个32位浮点数,那么,返回4个Byte,而且,下一个32位浮点数必须从40003开始。
客户问题:
1)、将40001定义为一个Byte的数据;
2)、将40001定义为32位浮点数,40002为下一个32位浮点数。
我们可以参考一下国标GBT_19582-1 2008 (基于Modubs协议的工业自动化网络规范)的功能码表:
operation. Therefore the ‘4XXXX’ reference is implicit.
4.保持寄存器40108的报文地址为006B hex (十进制107)
Holding register 40108 is addressed as register 006B hex (107 decimal).
比如组态软件的地址设置,一般为输出寄存器,从地址1开始,连续多少个。或者指明400001:16位有符号数。
但是,在数据报文层面,寄存器起始地址从0开始。
数据报文包括:设备地址+功能码+起始地址+寄存器个数+校验位。其中,起始地址是从0开始的。
举例说明:从设备17读40001开始的2个寄存器数据的报文
上面摘自Modicon_Modbus协议.pdf Page27
总之,Modbus地址一般指4****(保持寄存器/输出寄存器)和3****(输入寄存器),这时应用层面的:
比如设备说明书可以简要说明设备支持Modbus RTU标准协议,并详细描述其地址对应关系为:40001 -- 模拟量采集通道1,16位有符号数,.....。
3、Modbus的写寄存器命令的不同。
常用Modbus寄存器有:线圈(Coil)、输入(Input)、保持寄存器(Holding Registers)和输入寄存器(Input Registers)。
从Modbus设备角度看,输入是上位机采集Modbus设备的信息,也就是这些寄存器是只读的,所以,Modbus协议没有写输入(Input)和输入寄存器(Input Registers)的命令。
相关文档
最新文档