Modbus-TCP/IP

准备工具

首先看两个工具:Modbus Slave 和 Modbus Poll;

        这两款软件在调试通讯的时候,必不可少;

Modbus概述

Modbus 协议已广泛应用于当今工业控制领域。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC 可编程控制器等。Modbus 通讯物理接口可以选用串口(包括RS232 和 RS485),也可以选择以太网口。其通信遵循以下的过程:

    ●   主设备向从设备发送请求;

    ●   从设备分析并处理主设备的请求,然后向主设备发送结果;

    ●   如果出现任何差错,从设备将返回一个异常功能码。

注:带前缀     0x 或后缀   H 的数据为十六进制。

Modbus TCP/IP

在 Modbus 协议中,主机发送 Modbus 请求,从机根据请求内容向主机返回响应。主机总是主动方,从机总是被动方; 在 Modbus TCP 中,主机是客户端,而从机是服务器端,因此,在一个局域网中可存在多个主机和多个从机。主机和从机、服务端和客户端的关系如图:

Modbus TCP 指令说明

    PDU(报文)由功能码+数据组成。功能码为 1 字节,数据长度不定,由具体功能决定。常用功能码如下表所示:

  1. 读线圈寄存器            01H

(1)描述:读线圈寄存器当前状态。

(2)查询:例如从机地址为 01H,线圈寄存器的起始地址为 0013H,结束地址为 0037H。该次查询总共访问 37个线圈寄存器。

我们先从这两个工具中获取一段报文:

打开这两个软件:

 建立连接:(Modbus Poll 同理)

选择读取线圈状态 

点击OK,打开连接

Modbus Poll 连接设置(与Modbus Slave基本类似) :

点击OK,建立连接

通讯设置好后,设置值,如下图:

如果上面设置没问题,此时两边的号地址内容是同时变化:

我们截取报文,分析发送报文,打开方式如下:

 

报文成对出现,Tx是请求报文,Rx是响应报文 ,我们选中一段报文Copy出来分析:

Tx:006-

02 12 00 00 00 06 01 01 00 00 00 0A


Rx:007-

02 12 00 00 00 05 01 01 02 01 00
 

Client request:

02 12 00 00 00 06 01 01 00 00 00 0A

上面是modbus客户端发出的报文内容,为modbus tcp/ip协议格式,其前面的六个字节为头字节( header handle);

02 12 00 00 00 06
02 12两个字节是Client发出的检验信息,Sever端只是需要将这两个字节的内容copy以后再放到response的报文的相应位子就可以了。

00 00 两个字节是表示tcp/ip 的协议的modbus的协议;

00 06 两个字节表示的是header handle后面还有多长的字节,即表示的是该字节以后的字节长度(lengch),可以看到在00 06后面还有 “01 01 00 00 00 0A” 6个字节,所以这两个字节表示的就是6;

PDU:

01 01 00 00 00 0A

01 一个字节表示slave address;

01 为Fuction code ;

00 00 表示Client request的寄存器地址;

00 0A 表示request 10个寄存器的长度;(寄存器个数)16进制的0A 即0*16+10=10。


Server response:

02 12 00 00 00 05 01 01 02 01 00

Header handle : “ 02 12 00 00 00 05

02 12 为Server返回的检验码,copy from Client request;

其它的表示与客户端的表示相同

00 00 两个字节是表示tcp/ip 的协议的modbus的协议;

00 05 两个字节表示的是header handle后面还有多长的字节,即表示的是该字节以后的字节长度(lengch),可以看到在00 05后面还有 “01 01 02 00 00” 5个字节,所以这两个字节表示的就是5;

PDU:

 01 01 02 00 00

01 是Slave address,从地址数;

01 是Function code ;
 
02 表示了回复给Clientrequest的需要读的寄存器的值的个数;

01 00 表示了2 个字节的值。(数据从左往右表示 高低位调换即: 0000 0001 ->01,与Modbus Slave中显示的1000 0000 00,4个为一个16进制数值;一个寄存器16个位,即2个字节);

其余功能码报文解析与上文基本类似。

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值