Moubus协议

一、基础知识

1、Modbus

         Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。

         Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。

2、物理层:Modbus协议目前存在用于串口以太网以及其他支持互联网协议的网络的版本。大多数Modbus设备通信通过串口EIA-485物理层进行。

3、特点:控制器通信使用主从技术,即仅一台设备(主设备)能初始化传输(查询)。其他设备(从设备)根据主设备查询提供的数据做出相应的反应。主设备可以单独和从设备通信,也能以广播方式和所有从设备通信。

4、基本名称

(1)数据模型:Coil和Register

Modbus中定义的两种数据类型。Coil是位(bit)变量;Register是整型(Word,即16-bit)变量。每一种数据,根据读写方式的不同,又可细分为两种(只读,读写)

 Modbus四种数据类型:
  Discretes Input    位变量    只读
  Coils          位变量       读写
  Input Registers    16-bit整型      只读
  Holding Registers     16-bit整型      读写

(2)Slave和Master与Server和Client

        同一种设备在不同领域的不同叫法。
  Slave: 工业自动化用语;响应请求;
  Master:工业自动化用语;发送请求;
  Server:IT用语;响应请求;
  Client:IT用语;发送请求;

(3)Modbus地址范围对应表

设备地址     Modbus地址      描述                   功能   R/W
1~10000       address-1           Coils(Output)              0            R/W
10001~20000    address-10001    Discrete Inputs                01          R
30001~40000    address-30001    Input Registers               04           R
40001~50000    address-40001    Holding Registers           03           R/W

(4)Modbus分类:Modbus有下列三种通信方式

  • 以太网,对应的通信模式是MODBUS TCP。
  • 异步串行传输(各种介质如有线RS-232-/422/485/;光纤、无线等),对应的通信模式是MODBUS RTU或MODBUS ASCII。
  • 高速令牌传递网络,对应的通信模式是Modbus PLUS。

所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。“数据数量”字段只有在响应包中才有:

 

        Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。

        Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。

  • 地址码:地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。
  • 功能码:通讯传送的第二个字节。ModBus通讯规约定义功能号为1到127。本仪表只利用其中的一部分功能码。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应操作或发送出错。
  • 数据区:数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。
  • CRC码:二字节的错误检测码。

5、通信过程

       当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就不发送任何信息。

6、数据帧结构

地址码功能码数据区错误校验
8位8位N*8位16位
  • 地址码:地址码是信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送。当从机回送信息时,相当的地址码表明该信息来自于何处。
  • 功能码:主机发送的功能码告诉从机执行什么任务。
  • 数据区:数据区包含需要从机执行什么动作或由从机采集的返送信息。这些信息可以是数值、参考地址等等。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。
  • 错误校验码:主机或从机可用校验码进行判别接收信息是否出错。错误校验采用CRC-16校验方法。

应用举例:

(1)01号命令,读可读写数字量寄存器(线圈状态)

       算机发送命令:[设备地址] [命令号01] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]   如:[11] [01] [00][13] [00][25] [CRC低][CRC高]

设备地址:在一个485总线上可以挂接多个设备,此处的设备地址表示想和哪一个设备通讯。例子中为想和17号(十进制的17是十六进制的11)通讯。

命令号01:读取数字量的命令号固定为01

起始地址高8位、低8位:表示想读取的开关量的起始地址(起始地址为0)。比如例子中的起始地址为19。

寄存器数高8位、低8位:表示从起始地址开始读多少个开关量。例子中为37个开关量

CRC校验:是从开头一直校验到此之前

设备响应:[设备地址] [命令号01] [返回的字节个数][数据1][数据2]...[数据n] [CRC校验的高8位] [CRC校验的低8位]

例:[11][01][05][CD][6B][B2][0E][1B] [CRC高] [CRC低]

设备地址和命令号和上面的相同。

返回的字节个数:表示数据的字节个数,也就是数据1,2...n中的n的值。

(2)05号命令,写数字量(线圈状态)

计算机发送命令:[设备地址] [命令号05] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]

例:[11][05][00][AC][FF][00][CRC高][CRC低]

命令号:写数字量的命令号固定为05。

需下置的寄存器地址高8位,低8位:表明了需要下置的开关的地址。

下置的数据高8位,低8位:表明需要下置的开关量的状态。例子中为把该开关闭合。注意,此处只可以是[FF][00]表示闭合[00][00]表示断开,其他数值非法。

设备响应:如果成功把计算机发送的命令原样返回,否则不响应

(3)03号命令,读可读写模拟量寄存器(保持寄存器):

计算机发送命令:[设备地址] [命令号03] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的高8位] [CRC校验的低8位]

例:[11][03][00][6B][00][03] [CRC高][CRC低]

命令号:读模拟量的命令号固定为03。

起始地址高8位、低8位:表示想读取的模拟量的起始地址(起始地址为0)。比如例子中的起始地址为107。

寄存器数高8位、低8位:表示从起始地址开始读多少个模拟量。例子中为3个模拟量。注意,在返回的信息中一个模拟量需要返回两个字节。

设备响应:[设备地址] [命令号03] [返回的字节个数][数据1][数据2]...[数据n] [CRC校验的高8位] [CRC校验的低8位]

例:[11][03][06][02][2B][00][00][00][64] [CRC高] [CRC低]

设备地址和命令号和上面的相同。

返回的字节个数:表示数据的字节个数,也就是数据1,2...n中的n的值。例子中返回了3个模拟量的数据,因为一个模拟量需要2个字节所以共6个字节。

数据1...n:其中[数据1][数据2]分别是第1个模拟量的高8位和低8位,[数据3][数据4]是第2个模拟量的高8位和低8位,以此类推。例子中返回的值分别是555,0,100。

(4)06号命令,写单个模拟量寄存器(保持寄存器)

计算机发送命令:[设备地址] [命令号06] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的高8位] [CRC校验的低8位]

例:[11][06][00][01][00][03] [CRC高] [CRC低]

命令号:写模拟量的命令号固定为06。

需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。

下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为3。

设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

(5)16号命令,写多个模拟量寄存器(保持寄存器):

计算机发送命令:[设备地址] [命令号16] [需下置的寄存器地址高8位] [低8位] [数据数量高8位] [数据数量低8位] [下置的数据高8位] [低8位][……][……] [CRC校验的高8位] [CRC校验的低8位]

例:[11][16][00][01][00][01][00][05] [CRC高] [CRC低]

命令号:写模拟量的命令号固定为16。

需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。

需下置的数据数量高8位,低8位:表明了需要下置的数据数量,这里为1。

下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为5。

设备响应:如果成功把计算机返回的如下命令,否则不响应。

设备响应:[设备地址] [命令号16] [需下置的寄存器地址高8位] [低8位] [数据数量高8位] [数据数量低8位] [CRC校验的高8位] [CRC校验的低8位],如上例返回:

[11][16][00][01][00][01] [CRC高] [CRC低]

参考:http://www.sohu.com/a/230628953_315598

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值