精华内容
下载资源
问答
  • Modbus 通讯协议 (RTU传输模式)

    万次阅读 多人点赞 2018-02-04 10:30:10
    第一章Modbus协议简介 Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制...

    注:( 2020.05.22 )

    GB/T 19582.2-2008 《基于Modbus协议的工业自动化网络规范 第1部分:Modbus协议在串行链路上的实现指南》

     

    1、对于modbus ASCII 模式,使用的是高位字节在前,低位字节在后。使用LRC校验。

     

    2、对于modbus rtu 模式,使用的是低位字节在前,高位字节在后。使用CRC校验。

     

     

     

     

    第一章          Modbus协议简介

     

    Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

    此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

    当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

    协议在一根通讯线上使用应答式连接(半双工),这意味着在一根单独的通讯线上信号沿着相反的两个方向传输。首先,主计算机的信号寻址到一台唯一的终端设备(从机),然后,在相反的方向上终端设备发出的应答信号传输给主机。 协议只允许在主计算机和终端设备之间,而不允许独立的设备之间的数据交换,这就不会在使它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。

     

    1. 1  传输方式

    传输方式是一个信息帧内一系列独立的数据结构以及用于传输数据的有限规则,以RTU模式在Modbus总线上进行通讯时,信息中的每8位字节分成2个4位16进制的字符,每个信息必须连续传输下面定义了与Modebus 协议– RTU方式相兼容的传输方式。

    代码系统

    ·   8位二进制,十六进制数0...9,A...F

    ·   消息中的每个8位域都是一个两个十六进制字符组成

    每个字节的位

    ·   1个起始位

    ·   8个数据位,最小的有效位先发送

    ·   1个奇偶校验位,无校验则无

    ·   1个停止位(有校验时),2个Bit(无校验时)

    错误检测域

    ·   CRC(循环冗长检测)

    1.2      协议

    信息帧到达终端设备时,它通过一个简单的“口”进入寻址到的设备,该设备去掉数据帧的“信封”(数据头),读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据加入到取得的“信封”中,把数据帧返回给发送者。返回的响应数据中包含了以下内容:终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和一个校验码(Check)。发生任何错误都不会有成功的响应。

    1.2.1          信息帧

    Address

    Function

    Data

    Check

    8-Bits

    8-Bits

    N x 8-Bits

    16-Bits

    图 1 – 1 . 信息帧格式

    特注:Modbus信息帧所允许的最大长度为256个字节,即N的范围是大于等于零且小于等于252(N{0,252})。

    即,所有的数据一共256个,数据剩下253个。

    1.2.2          地址(Address)域

    信息帧地址域(信息地址)在帧的开始部分,由8位组成,有效的从机设备地址范围0-247(十进制),各从机设备的寻址范围为1-247。主机把从机地址放入信息帧的地址区,并向从机寻址。从机响应时,把自己的地址放入响应信息的地址区,让主机识别已作出响应的从机地址。

    地址0广播地址,所有从机均能识别。当Modbus协议用于高级网络时,则不允许广播或其它方式替代。

    1.2.3          功能(Function)域

      信息帧功能域代码告诉了被寻址到的终端执行何种功能。有效码范围1-225(十进制) ,有些代码是适用于所有控制器,有些适应于某种控制器,还有些保留以备后用。有关功能代替码的全部内容见附录A

    当主机向从句发送信息时,功能代码向从机说明应执行的动作。如读一组离散式线圈或输入信号的ON/OFF状态,读一组寄存器的数据,读从机的诊断状态,写线圈(或寄存器),允许下截、记录、确认从机内的程序等。当从机响应主机时,功能代码可说明从机正常响应或出现错误(即不正常响应),正常响应时,从句简单返回原始功能代码;不正常响应时,从机返回与原始代码相等效的一个码,并把最高有效位设定为“1”。

    如,主机要求从机读一组保持寄存器时,则发送信息的功能码为:

    0000 0011 (十六进制03)

    若从机正确接收请求的动作信息后,则返回相同的代码值作为正常响应。发现错时,则返回一个不正常响信息:

    1000 0011(十六进制83)

    从机对功能代码作为了修改,此外,还把一个特殊码放入响应信息的数据区中,告诉主机出现的错误类型和不正常响应的原因,不正常响应见附录B。主机设备的应用程序负责处理不正常响应,典型处理过程是主机把对信息的测试和诊断送给从机,并通知操作者。表 1 – 1列出了所有设备常用的功能码、它们的意义及它们的初始功能。

    表 1 – 1 常用功能码

    代码

    名称

    作用

    01

    读取线圈状态

    取得一组逻辑线圈的当前状态(ON/OFF)

    02

    读取输入状态

    取得一组开关输入的当前状态(ON/OFF)

    03

    读取保持寄存器

    在一个或多个保持寄存器中取得当前的二进制值

    04

    读取输入寄存器

    在一个或多个输入寄存器中取得当前的二进制值

    05

    强置单线圈

    强置一个逻辑线圈的通断状态

    06

    预置单寄存器

    放置一个特定的二进制值到一个单寄存器中

    07

    读取异常状态

    取得8个内部线圈的通断状态

    15

    强置多线圈

    强置一串连续逻辑线圈的通断

    16

    预置多寄存器

    放置一系列特定的二进制值到一系列多寄存器中

    17

    报告从机标识

    可使主机判断编址从机的类型及该从机运行指示灯的状态

    1.2.4          数据域

    数据域包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这些数据的内容可能是数值、参考地址或者极限值。他由数据区有2个16进制的数据位(2的8次方256),数据范围为00-FF(16进制)。例如:功能域码告诉终端读取一个寄存器数据域则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机之间的不同能力而有所不同。若无错误出现,从机向主机的响应信息中包含了请求数据,若有错误出现,则数据中有一个不正常代码,使主机能判断并作出下一步的动作。数据区的长度可为“零”以表示某类信息。

    1.2.5          错误校验域

    该域允许主机和终端检查传输过程中的错误。有时,由于电噪声和其它干扰,一组数据在从一个设备传输到另一个设备时在线路上可能会发生一些改变,出错校验能够保证主机或者终端不去响应那些传输过程中发生了改变的数据,这就提高了系统的安全性和效率,出错校验使用了16位循环冗余的方法,即CRC校验。

    错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。故CRC的高位字节是发送消息的最后一个字节。

    1.2.6          字符的连续传输

    当消息在标准的Modbus系列网络传输时,每个字符或字节按由左到右的次序方式发送:

    最低有效位(LSB)...最高有效位(MSB)。

    位的序列是:

    有奇偶校验

    启始位

    1

    2

    3

    4

    5

    6

    7

    8

    奇偶位

    停止位

    无奇偶校验

    启始位

    1

    2

    3

    4

    5

    6

    7

    8

    停止位

    停止位

    图 1 –2 .  位顺序(RTU)

    1.3   错误检测

    1、奇偶校验

    用户可以配置控制器是奇或偶校验,或无校验。这将决定了每个字符中的奇偶校验位是如何设置的。

    如果指定了奇或偶校验,“1”的位数将算到每个字符的位数中(ASCII模式7个数据位,RTU中8个数据位)。例如RTU字符帧中包含以下8个数据位:1 1 0 0 0 1 0 1

    整个“1”的数目是4个。如果便用了偶校验,帧的奇偶校验位将是0,便得整个“1”的个数仍是4个。如果便用了奇校验,帧的奇偶校验位将是1,便得整个“1”的个数是5个。

    如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测。代替一附加的停止位填充至要传输的字符帧中。

    2、CRC检测

    RTU方式时,采用CRC方法计算错误校验码,CRC校验传送的全部数据。它忽略信息中单个字符数据的奇偶校验方法。

    循环冗余校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传送设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。

    CRC开始时先把寄存器的16位全部置成“1”,然后把相邻2个8位字节的数据放入当前寄存器中,只有每个字符的8位数据用作产生CRC,起始位,停止位和奇偶校验位不加到CRC中。

           在生成CRC时,每个8位字节与寄存器中的内容进行异或,然后将结果向低位移位,高位则用“0”补充,最低位(LSB)移出并检测,如果是1,该寄存器就与一个预设的固定值进行一次异或运算,如果最低位为0,不作任何处理。

           上述处理重复进行,知道执行完了8次移位操作,当最后一位(第8位)移完以后,下一个8位字节与寄存器材的当前值进行异或运算,同样进行上述的另一个8次移位异或操作,当数据帧中的所有字节都作了处理,生成的最终值就是CRC值。

    生成一个CRC的流程为:

    1、       预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

    2、       把数据帧中的第一个8位字节与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。

    3、       将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。

    4、       如果最低位为0:重复第3步(下一次移位)。

     如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。

    5、       重复第3步和第4步直到8次移位。这样处理完了一个完整的八位。

    6、       重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。

    7、       最终CRC寄存器得值就是CRC的值。

    CRC值附加到信息时,低位在先,高位在后。查阅附录C中的一个实例,它详细说明了CRC的校验。

    第二章  Modbus数据和控制功能详解

           Modbus信息中的所有数据地址以零作为基准,各项数据的第一个数据地址的编号为0。若无特殊说明在此节文中用+进制值表示,图中的数据区则用十六进制表示

    图2--1为一个例子,说明了Modbus的查询信息,图2--2为正常响应的例子,这两例子中的数据均是16进制的,也表示了以RTU方式构成数据帧的方法。

    主机查询是读保持寄存器,被请求的从机地址是06,读取的数据来自地址40108保持寄有器。注意,该信息规定了寄存器的起始地址为0107 (006BH)。

    从机响应返回该功能代码,说明是正常响应,字节数“Byle count”中说明有多少个8位字节被返回。它表明了附在数据区中8位字节的数量,当在缓冲区组织响应信息时,“字节数”区域中的值应与该信息中数据区的字节数相等。如RTU方式时,63H 用一个字节(01100011)发送。8个位为一个单位计算“字节数”,它忽略了信息帧用组成的方法。

     

    Addr

    Fun

    Data start reg hi

    Data start reg lo

    Data #of regs hi

    Data #of regs lo

    CRC16

    hi

    CRC16

    lo

    06H

    03H

    00H

    6BH

    00H

    01H

    XXH

    XXH

    图 2 – 1 Modbus的查询信息

    Addr

    Fun

    Byte

    count

    Data1

    hi

    Data1

    Lo

    Data 2

    hi

    Data2

    lo

    Data3

    hi

    Data3

    lo

    CRC16

    hi

    CRC16

    lo

    06H

    03H

    06H

    02H

    2BH

    00H

    00H

    00H

    63H

    XXH

    XXH

    图 2 – 2 Modbus的响应信息

    2.1  读取线圈状态(功能码01)

    读取从机离散量输出口(DO,0X类型)的 ON/OFF 状态,不支持广播。

    查询   

    查询信息规定了要读的起始线圈和线圈量,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H –0015H(DO1=0000H,DO2=0001H,依此类推)。

           图 2 – 3 的例子是从地址为17的从机读取DO1至DO6的状态。

    Addr

    Fun

    DO start reg hi

    DO start reg lo

    DO #of regs hi

    DO #of regs lo

    CRC16

    hi

    CRC16

    lo

    11H

    01H

    00H

    00H

    00H

    06H

    XXH

    XXH

    图 2 – 3 读取线圈状态----查询

            响应

      响应信息中的各线圈的状态与数据区的每一位的值相对应,即每个DO占用一位(1 = ON, 0= OFF),第一个数据字节的LSB为查询中的寻址地址,其他的线圈按顺序在该字节中由低位向高位排列,直至8个为止,下一个字节也是从低位向高位排例。若返回的线圈数不是8的倍数,则在最后的数据字节中的剩余位至字节的最高位全部填0,字节数区说明全部数据的字节数。

    图2 – 4所示为线圈的输出状态响应的实例。

    Addr

    Fun

    Byte count

    Data

    CRC16  hi

    CRC16  lo

    11H

    01H

    01H

    2AH

    XXH

    XXH

           

         数据

    0

    0

    0

    0

    0

    0

    DO2

    DO1

    MSB

    7

    6

    5

    4

    3

    2

    LSB

    图 2 – 4读取线圈状态----响应

    2.2  读取输入状态(功能码02)

    读取从机离散量输入信号(DI,0X类型)的ON/OFF状态,不支持广播。

    查询

    查询信息规定了要读的输入起始地址,以及输入信号的数量。输入的起始地址为0000H,1-16个输入口的地址分别为0-15(DO1=0000H,DO2=0001H,依此类推)。

    图 2 – 5 的例子是从地址为17的从机读取DI1到DI16的状态。

     

    Addr

    Fun

    DI start

    addr  hi

    DI start

    addr  lo

    DI num

    hi

    DI num

    lo

    CRC16

    hi

    CRC16

    lo

    11H

    02H

    00H

    00H

    00H

    10H

    XXH

    XXH

    图 2 – 5读取输入状态----查询

    响应

           响应信息中的各输入口的状态,分别对应于数据区中的每一位值,1 = ON; 0 = OFF,第一个数据字节的LSB为查询中的寻址地址,其他输入口按顺序在该字节中由低位向高位排列,直至8个位为止。下一个字节中的8个输入位也是从低位到高位排列。若返回的输入位数不是8的倍数,则在最后的数据字节中的剩余位直至字节的最高位全部填零。字节数区说明了全部数据的字节数。

    图2 – 6 所示为读数字输出状态响应的实例。

    Addr

    Fun

    Byte count

    Data1

    Data2

    CRC16 hi

    CRC16 lo

    11H

    02H

    02H

    33H

    CCH

    XXH

    XXH

    数据 1

     DI8

     DI7

     DI6

     DI5

     DI4

     DI3

     DI2

     DI1

           MSB                                       LSB  

    数据 2

     DI16

     DI15

     DI14

     DI13

     DI12

     DI11

     DI10

     DI9

        MSB                                             LSB  

    图 2 – 6读取输入状态----响应

    2.3  读取保持寄存器(功能码03)

    读取从机保持寄存器(4X类型)的二进制数据,不支持广播。

    查询

    查询信息规定了要读的保持寄存器起始地址及保持寄存器的数量,保持寄存器寻址起始地址为0000H,寄存器1-16所对应的地址分别为0000H –0015H。

    图2 – 7 的例子是从17号从机读3个采集到的基本数据U1、U2、U3,U1的地址为0000H, U2的地址为0001H,U3的地址为0002H。

    Addr

    Fun

    Data start

    addr  hi

    Data start

    addr lo

    Data #of

    regs hi

    Data #of

    regs lo

    CRC16

    hi

    CRC16

    lo

    11H

    03H

    00H

    00H

    00H

    03H

    XXH

    XXH

    图 2 – 7读取保持寄存器----查询

    响应

    响应信息中的寄存器数据为二进制数据,每个寄存器分别对应2个字节,第一个字节为高位值数据,第二个字节为低位数据。

    图 2 – 8的例子是读取U1,U2,U3(U1=03E8H,U2=03E7H,U3=03E9H)的响应。

    Addr

    Fun

    Byte

    count

    Data1

    hi

    Data1

    Lo

    Data 2

    hi

    Data2

    lo

    Data3

    hi

    Data3

    lo

    CRC16

    hi

    CRC16

    lo

    11H

    03H

    06H

    03H

    E8H

    03H

    E7H

    03H

    E9H

    XXH

    XXH

    图 2 – 8读取保持寄存器----响应

    2.4   读取输入寄存器(功能码04)

    读取从机输入寄存器(3X类型)中的二进制数据,不支持广播。

    查询

    查询信息规定了要读的寄存器的起始地址及寄存器的数量,寻止起始地址为0,寄存器1-16所对应的地址分别为0000H –0015H。

    图 2 – 9的例子是请求17号从机的0009寄存器。

    Addr

    Fun

    DO addr

    hi

    DO addr

    lo

    Data #of

    regs hi

    Data #of

    regs lo

    CRC16

    hi

    CRC16

    lo

    11H

    04H

    00H

    08H

    00H

    01H

    XXH

    XXH

    图 2 – 9读取输入寄存器----查询

    响应

    响应信息中的寄存器数据为每个寄存器分别对应2个字节,第一个字节为高位数据,第二个字节为低位数据。

    图 2 – 10的例子寄存器30009中的数据用000AH 2个字节表示。

    Addr

    Fun

    Byte

    count

    Data

    hi

    Data

    Lo

    CRC16

    hi

    CRC16

    lo

    11H

    04H

    02H

    00H

    0AH

    XXH

    XXH

    图 2 – 10读取输入寄存器----响应

    2.5   强置单线圈(功能码05)

    强制单个线圈(DO,0X类型)为ON或OFF状态,广播时,该功能可强制所有从机中同一类型的线圈均为ON或OFF状态。

    该功能可越过控制器内存的保护状态和线圈的禁止状态。线圈强制状态一直保持有效直至下一个控制逻辑作用于线圈为止。控制逻辑中无线圈程序时,则线圈处于强制状态。

    查询

    查询信息规定了需要强制一个单独线圈的类型,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H –0015H(DO1=0000H,DO2=0001H,依此类推)。

    由查询数据区中的一个常量,规定被请求线圈的ON/OFF状态, FF00H值请求线圈处于ON状态,0000H值请求线圈处于OFF状态,其它值对线圈无效,不起作用。

    图示 2-11的例子是请求17号从机开DO1的On状态。

     

    Addr

    Fun

    DO addr

    hi

    DO addr

    lo

    Value

    hi

    Value

    lo

    CRC16

    hi

    CRC16

    lo

    11H

    05H

    00H

    00H

    FFH

    00H

    XXH

    XXH

    图示 2-11强制单线圈----查询

    响应

    图2 – 12所示为对这个命令请求的正常响应是在DO状态改变以后传送接收到的数据。

     

    Addr

    Fun

    DO addr

    hi

    DO addr

    lo

    Value

    hi

    Value

    lo

    CRC16

    hi

    CRC16

    lo

    11H

    05H

    00H

    00H

    FFH

    00H

    XXH

    XXH

    图示 2-12强制单线圈----响应

    2.6 预置单寄存器(功能码06)

    把一个值预置到一个保持寄存器(4X类型)中,广播时,该功能把值预置到所有从机的相同类型的寄存器中

    该功能可越过控制器的内存保护。使寄存器中的预置值保持有效。只能由控制器的下一个逻辑信号来处理该预置值。若控制逻辑中无寄存器程序时,则寄存器中的值保持不变。

    查询

           查询信息规定了要预置寄存器的类型,寄存器寻址起始地址为0000H,寄存器1所对应的地址为0000H。

           图示 2-13的例子是请求17号从机0040H.的值为2717。

    Addr

    Fun

    Data start

    reg  hi

    Data start

       reg lo

    Value

      hi

    Value    

      lo

    CRC

      hi

    CRC

      lo

     11H

    06H

       00H

       40H

      0AH

     9DH

     XXH

     XXH

    图示 2-13预设单寄存器----查询

    响应

    图2 – 14所示对于预置单寄存器请求的正常响应是在寄存器值改变以后将接收到的数据传送回去。

    Addr

    Fun

    Data start

    reg  hi

    Data start

       reg lo

    Value

      hi

    Value    

      lo

    CRC

      hi

    CRC

      lo

     11H

    06H

       00H

       40H

      0AH

     9DH

     XXH

     XXH

    图示 2-14预设单寄存器----响应

    2.7读取异常状态(功能码7)

    读从中机中8个不正常状态线圈的数据,某些线圈号已在不同型号的控制器中预定义,而其它的线圈由用户编程,作为有关控制器的状态信息,如“machine ON/OFF”,“heads retraced”,(缩回标题),“safeties satisfied”(安全性满意),“errorconditions”(存在错误条件)或其它用户定义的标志等。该功能码不支持广播。

    该功能代码为存取该类信息提供了一种简单的方法,不正常线圈的类型是已知的(在功能代码中不需要线圈类型) 预定义的不正常线圈号如下:

    控制器型号                 线圈                 设定

    M84,184/384,584,984           1-8                    用户定义

    484                          257                  电池状态

                                              258-264             用户定义

             884                          761                   电池状态

                                              762                   内存保护状态

                                              763                   R10工况状态

                                       764-768         用户预定义

    查询     

           图示 2-15的例子是请求读从机设备17中的不正常状态。

    Addr

    Fun

    CRC16  hi

    CRC16  lo

    11H

    07H

    XXH

    XXH

    图示 2-15读取异常状态----查询

    响应

    正常响应包含 8 个不正常的线圈状态,为一个数据字节,每个线圈一位。LSB对应为最低线圈类型的状态。

    图2 – 16所示按查询要求返回响应:

    Addr

    Fun

    DO Data

    CRC16  hi

    CRC16  lo

    11H

    07H

    6DH

    XXH

    XXH

    图示 2-16读取异常状态----响应

    该例子中,线圈数据为 6DH (二进制0110 ,1101),从左到右 (最高位至最低位) 的线圈状态分别为: OFF – ON – ON – OFF – ON –ON – OFF – ON。若控制器型号为 984,这些位表示线圈 8 至 1 的状态;若控制器型号为 484 则表示线圈 264 至 257 的状态。

    2.8 强置多线圈(功能码15)

    按线圈的顺序把各线圈 (DO,0X 类型) 强制成 ON 或 OFF。广播时,该功能代码可对各从机中相同类型的线圈起强制作用。

    该功能代码可越过内存保护和线圈的禁止状态线圈。保持强制状态有效,并只能由控制器的下一个逻辑来处理。若无线圈控制逻辑程序时,线圈将保持强制状态。

    查询

    查询信息规定了被强制线圈的类型,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H –0015H(DO1=0000H,DO2=0001H,依此类推)。

    查询数据区规定了被请求线圈的 ON/OFF 状态,如数据区的某位值为“1”表示请求的相应线圈状态为ON,位值为“0”,则为OFF状态。

    图示 2-17例子为请求从机设备 17 中一组 10 个线圈为强制状态,起始线圈为 20 (则寻址地址为 19 或 13H),查询的数据为 2 个字节,CD01H (二进制 11001101 0000 0001) 相应线圈的二进制位排列如下:

    Bit:

    1

    1

    0

    0

    1

    1

    0

    1

    0

    0

    0

    0

    0

    0

    0

    1

    Coll:

    27

    26

    25

    24

    23

    22

    21

    20

    -

    -

    -

    -

    -

    -

    29

    28

    传送的第一个字节 CDH 对应线圈为 27-20,  LSB 对应线圈 20,传送的第二个字节为 01H,对应的线圈为 29-28, LSB 为继圈 28,其余未使用的位均填“0”。

    Addr

    Fun

    DO addr

    hi

    DO addr

    lo

    Data #of

     reg  hi

    Data #of

     reg lo

    Byte   

    count      

    Value

      hi

    Value

     lo

    CRC

      hi

    CRC

      lo

     11H

    0FH

       00H

       13H

       00H

       0AH

      02H

     CDH

     01H

     XXH

     XXH

    图示 2-17强置多线圈----查询

    响应

    正常响应返回从机地址,功能代码,起始地址以及强制线圈数。

    图2 – 18对上述查询返回的响应。

    Addr

    Fun

    DO addr

    hi

    DO addr

    lo

    Data #of

    reg  hi

    Data #of

    reg lo

    CRC16

    hi

    CRC16

    lo

    11H

    0FH

    00H

    13H

    00H

    0AH

    XXH

    XXH

    图示 2-18强置多线圈----响应

    2.9预置多寄存器(功能码16)

    把数据按顺序预置到各 (4X类型) 寄存器中,广播时该功能代码可把数据预置到全部从机中的相同类型的寄存器中。

    该功能代码可越过控制器的内存保护,在寄存器中的预置值一直保持有效,只能由控制器的下一个逻辑来处理寄存器的内容,控制逻辑中无该寄存器程序时,则寄存器中的值保持不变。

    查询

           查询信息规定了要预置寄存器的类型,寄存器寻址起始地址为0000H,寄存器1所对应的地址为0000H。

           图示 2-19的例子是请求17号从机0040H.的值为178077833。

    Addr

    Fun

    Data start

    reg  hi

    Data start

       reg lo

    Data #of

     reg  hi

    Data #of

     reg lo

    Byte   

    count      

    Value

      hi

    Value

     lo

    Value

      hi

    Value    

      lo

    CRC

      hi

    CRC

      lo

     11H

    10H

       00H

       40H

       00H

       02H

      04H

     40H

     89H

      0AH

     9DH

     XXH

     XXH

    图示 2-19预设多寄存器----查询

    响应

    图2 – 20所示对于预置单寄存器请求的正常响应是在寄存器值改变以后将接收到的数据传送回去。

    Addr

    Fun

    Data start

    reg  hi

    Data start

    reg lo

    Data #of

    reg  hi

    Data #of

    reg lo

    CRC16

    hi

    CRC16

    lo

    11H

    10H

    00H

    40H

    00H

    02H

    XXH

    XXH

    图示 2-20预设多寄存器----响应

    2.10报告从机标识(功能码17)

    返回一个从机地址控制器的类型,从机的当前状态,以及有关从机的其他说明,不支持广播。

    查询

                  图示 2-21的例子是请求报告从机设备 17 的 标识ID 和状态。

    Addr

    Fun

    CRC16  hi

    CRC16  lo

    11H

    11H

    XXH

    XXH

    图示 2-21报告从机标识----查询

    响应

    图2 – 22所示正常响应格式,数据内容对应每台控制器的类型。

    Addr

    Fun

    Byte

    Count

    Slave ID

    Run Indicator Status

    Additfional

    Data

    CRC16

    hi

    CRC16

    lo

    11H

    11H

    XXH

    XXH

    XXH

    XXH

    XXH

    XXH

    图示 2-22报告从机标识----响应

    从机 ID 总结

    数据区第一个字节为 Modicon 控制器返回的从机 ID

    Slave ID               Controller

    0                                                    Micro 84

    1                                                    484

    2                                                    184/384

    3                                                    584

    8                    884

    9                    984

    特注:详细信息见Modbus协议英文版或中文版。

    第三章  附录

    附录A:MODBUS全部功能码

    ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。下表3--1是ModBus的功能码定义。

    表3--1 ModBus功能码

    功能码

    名称

    作用

    01

    读取线圈状态

    取得一组逻辑线圈的当前状态(ON/OFF)

    02

    读取输入状态

    取得一组开关输入的当前状态(ON/OFF)

    03

    读取保持寄存器

    在一个或多个保持寄存器中取得当前的二进制值

    04

    读取输入寄存器

    在一个或多个输入寄存器中取得当前的二进制值

    05

    强置单线圈

    强置一个逻辑线圈的通断状态

    06

    预置单寄存器

    把具体二进值装入一个保持寄存器

    07

    读取异常状态

    取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态

    08

    回送诊断校验

    把诊断校验报文送从机,以对通信处理进行评鉴

    09

    编程(只用于484)

    使主机模拟编程器作用,修改PC从机逻辑

    10

    控询(只用于484)

    可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送

    11

    读取事件计数

    可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时

    12

    读取通信事件记录

    可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误

    13

    编程(184/384 484 584)

    可使主机模拟编程器功能修改PC从机逻辑

    14

    探询(184/384 484 584)

    可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送

    15

    强置多线圈

    强置一串连续逻辑线圈的通断

    16

    预置多寄存器

    把具体的二进制值装入一串连续的保持寄存器

    17

    报告从机标识

    可使主机判断编址从机的类型及该从机运行指示灯的状态

    18

    (884和MICRO 84)

    可使主机模拟编程功能,修改PC状态逻辑

    19

    重置通信链路

    发生非可修改错误后,是从机复位于已知状态,可重置顺序字节

    20

    读取通用参数(584L)

    显示扩展存储器文件中的数据信息

    21

    写入通用参数(584L)

    把通用参数写入扩展存储文件,或修改之

    22~64

    保留作扩展功能备用

     

    65~72

    保留以备用户功能所用

    留作用户功能的扩展编码

    73~119

    非法功能

     

    120~127

    保留

    留作内部作用

    128~255

    保留

    用于异常应答

    ModBus网络只是一个主机,所有通信都由他发出。网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。表3--2是ModBus各功能码对应的数据类型。

    表3--2 ModBus功能码与数据类型对应表

    代码

    功能

    数据类型

    01

    02

    03

    整型、字符型、状态字、浮点型

    04

    整型、状态字、浮点型

    05

    06

    整型、字符型、状态字、浮点型

    08

    N/A

    重复“回路反馈”信息

    15

    16

    整型、字符型、状态字、浮点型

    17

    字符型

    附录B:不正常响应

    不正常响应:

    除广播外,主机向从机设备发送查询并希望有一个正常响应,主机查询中有可能产生4种事件:

    ¨  从机接收查询,通讯错误正常处理信息,则返回一个正常响应事件。

    ¨  由于通讯出错,从机不能接收查询数据,因而不返回响应。此时,主机依靠处理程序给出查询超时事件。

    ¨  若从机接收查询,发现有 (LRC或CRC) 通讯错误,并返回响应,此时,依靠主机处理程序给出查询超时事件。

    ¨  从机接收查询,无通讯错误,但无法处理(如读不存在的线圈和寄存器)时,向主机报告错误的性质。

    不正常响应信息有2个与正常响应不相同的区域:

    功能代码区:正常响应时,从机的响应功能代码区,带原查询的功能代码。所有功能代码的MSB为0(其值低于80H)。不正常响应时,从机把功能代码的MSB置为1,使功能代码值大于80H,高于正常响应的值。这样,主机应用程序能识别不正常响应事件,能检查不正常代码的数据区。

    数据区:正常响应中,数据区含有(按查询要求给出的) 数据或统计值,在不正常响应中,数据区为一个不正常代码,它说明从机产生不正常响应的条件和原因。

    例:主机发出查询,从机不正常响应。(为十六进制数据)。

    查询:

    Addr

    Fun

    DO start reg hi

    DO start reg lo

    DO #of regs hi

    DO #of regs lo

    CRC16

    Hi

    CRC16

    Lo

    0AH

    01H

    04H

    A1H

    00H

    01H

    XXH

    XXH

    响应(不正常或例外):

    Addr

    Fun

    Exception Code

    CRC16

    Hi

    CRC16

    Lo

    0AH

    81H

    02H

    XXH

    XXH

    图 3 – 1 . 不正常信息帧格式

    上例中,从机设备地址10(0AH),读线圈状态的功能代码(01),主机请求线圈状态的地址为1245(04A1H)。注意:只读一个指定线圈,地址为(0001).

    若从机中不存在此线圈地址时,即以不正常代码(02),向主机返回一个不正常响应。说明为不合法地址。

    表3--3 ModBus的不正常代码:

    代码

    名称

    含义

    01

    不合法功能代码

    从机接收的是一种不能执行功能代码。发出查询命令后,该代码指示无程序功能。

    02

    不合法数据地址

    接收的数据地址,是从机不允许的地址。

    03

    不合法数据

    查询数据区的值是从机不允许的值。

    04

    从机设备故障

    从机执行主机请求的动作时出现不可恢复的错误。

    05

    确认

    从机已接收请求处理数据,但需要较长的处理时间,为避免主机出现超时错误而发送该确认响应。主机以此再发送一个“查询程序完成”未决定从机是否已完成处理。

    06

    从机设备忙碌

    从机正忙于处理一个长时程序命令,请求主机在从机空闲时发送信息。

    07

    否定

    从机不能执行查询要求的程序功能时,该代码使用十进制13或14代码,向主机返回一个“不成功的编程请求”信息。主机应请求诊断从机的错误信息。

    08

    内存奇偶校验错误

    从机读扩展内存中的数据时,发现有奇偶校验错误,主机按从机的要求重新发送数据请求。

    ///

    功能码

    描述

    是否支持广播

    起始地址

    备注

    01

    读线圈状态DO

    不支持

    0000H

    离散量输出口(0X类型)状态

    02

    读输入位状态DI

    不支持

    0000H

    离散量输入信号(0X类型)状态

    03

    读保持寄存器

    不支持

    0000H

    保持寄存器数据

    04

    读输入寄存器

    不支持

    0000H

    输入寄存器(3X类型)数据

    05

    强制单个线圈DO

    支持

    0000H

    强制单个线圈(0X类型)状态

    06

    预置单个保持寄存器

    支持

    0000H

    保持寄存器(4X类型)

    07

    读不正常状态

    不支持

     

     

    08

    诊断(见第3章)

     

    不支持

    0000H

     

    09

    程序 484

    0000H

    没查到

    10

    查询 484

    0000H

    没查到

    11

    通讯事件控制

    不支持

     

     

    12

    通讯事件记录

    不支持

     

     

    13

    程序控制器

    0000H

    没查到

    14

    查询控制器

    0000H

    没查到

    15

    强制多个线圈DO

    支持

    0000H

    强制各线圈 (0X 类型)状态

    16

    预置多个保持寄存器

    支持

    0000H

    保持寄存器(4X类型)

    17

    报告从机 ID

    不支持

     

     

    18

    程序 884/M84

    0000H

    没查到

    19

    通讯链路复位

    0000H

    没查到

    20

    读通用参考值

    不支持

    0000H

    扩展寄存器(6X类型)

    21

    写通用参考值

    不支持

    0000H

    扩展寄存器(6X类型)

    22

    掩码写入4X类型寄存器

    不支持

    0000H

    保持寄存器(4X类型)

    23

    读/写4X类型寄存器

    不支持

    0000H

    保持寄存器(4X类型)

    24

    读FIFO查询数据

    不支持

    0000H

    保持寄存器(4X类型)

     

    展开全文
  • 文章目录通讯协议TCP/IP协议TCP/IP模型osi版基本版应用层传输层网络层数据链层 通讯协议 我们想要进⾏数据通讯分⼏步? 1、找到对⽅ip 2 、数据要发送到对⽅指定的应⽤程序上。为了标识这些应⽤程序,所以给这些 ⽹络...

    通讯协议

    我们想要进⾏数据通讯分⼏步?
    1、找到对⽅ip
    2 、数据要发送到对⽅指定的应⽤程序上。为了标识这些应⽤程序,所以给这些 ⽹络应⽤程序都⽤数字进⾏了标识。为了⽅便称呼这个数字,叫做 端⼝。这⾥ 的端⼝ 我们⼀般都叫做 ‘逻辑端⼝’
    3、 定义通讯规则。这个通讯规则我们⼀般称之为协议

    通讯协议又称通信规程,是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传送速度,传送步骤,检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守,它也叫做链路控制规程。
    电脑与电脑之间的沟通必须讲述相同的语言,才能互相传输信息,自然资料在国际互联网上传递,每一份都要符合一定的规格(即是相同的语言),否则中国送出的资料,在美国那边要怎么收下呢?
    这些规格(语言)的规定都是事先在会议上讲好的,一般我们称之为“协议”(英文称为protocol),而这种在网络上负责定义资料传输规格的协议,我们就统称为通讯协议

    其实每一种网络所使用的通讯协议都不太一样,但就以我们最常用的Internet为例,当资料要送到Internet上时,就必须要使用Internet用的通讯协议。

    TCP/IP协议

    TCP/IP协议定义了在互联网络中如何传递、管理信息(文件传送、收发电子邮件、远程登录等),并制定了在出错时必须遵循的规则。

    TCP/IP(Transmission Control Protocol/Internet
    Protocol,传输控制协议/网际协议)是指能够在多个 不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP
    和IP两个协议,而是指一个由 FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,
    只是因为在TCP/IP协议中TCP协议和IP协议最 具代表性,所以被称为TCP/IP协议

    TCP/IP模型

    osi版

    OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐所有公司使用这个规范来控制网络。这样所有公司都有相同的规范,就能互联了。
    OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型
    在这里插入图片描述

    基本版

    在这里插入图片描述
    TCP/IP协议层按照层次由上到下,层层包装。
    数据就像被层层包装的快递,一层一层被包裹着,当传输到传输对象手中被一层一层剥开,这就是通讯,通讯中数据的传递

    应用层

    最上面的是应用层,这里面有http,ftp,等等我们熟悉的协议。

    作用:控制应用程序;

    典型协议:telnet, ssh, http, ftp, smtp, rip, BGP, …

    备注:为应用程序提供网络服务;
    HTTPS是什么呢?

    https=http+ssl,顾名思义,https是在http的基础上加上了SSL保护壳,信 息的加密过程就是在SSL中完成的 https,是以安全为⽬标的HTTP通道,简单讲是HTTP的安全版。即HTTP下 加⼊SSL层,HTTPS的安全基础是SSL
    SSL怎么理解? SSL也是⼀个协议主要⽤于web的安全传输协议
    在这里插入图片描述

    传输层

    而第二层则是传输层,著名的TCP和UDP协议就在这个层次。
    作用:提供可靠和尽力而为的传输;

    典型协议:TCP,UDP,SPX,port(65535个端口),EIGRP,OSPF,

    PDU:fragment 段;

    无典型设备;

    备注:负责网络传输和会话建立;

    网络层

    第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定传输的目标。

    作用:定义一个逻辑的寻址,选择最佳路径传输,路由数据包;

    典型协议:IP,IPX,ICMP,ARP(IP->MAC),IARP;

    PDU:packet/数据包;

    设备:路由器

    备注:实现寻址

    数据链层

    第四层是数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。
    作用:定义如何格式化数据,支持错误检测;

    典型协议:以太网,帧中继(古董级VPN)

    PDU:frame(帧)设备:以太网交换机;

    备注:交换机通过MAC地址转发数据,逻辑链路控制;
    我们举个栗子
    在这里插入图片描述
    x从新疆某地到美国拉斯维加斯某酒店:

    1. 汽车:坐汽车到火车站
    2. 火车:坐火车到北京
    3. 地铁:坐地铁到北京国际机场
    4. 飞机:坐飞机到纽约国际机场
    5. 地铁:坐地铁到火车站
    6. 火车:坐火车到拉斯维加斯
    7. 汽车:坐汽车到最终目的地

    而x就相当于数据,汽车、火车、地铁、飞机等等就相当于数据链层

    物理层

    作用:定义一些电器,机械,过程和规范,如集线器;

    PDU(协议数据单元):bit/比特

    设备:集线器HUB;

    注意:没有寻址的概念;

    展开全文
  • 自定义通讯协议——网络通讯协议

    热门讨论 2009-04-14 17:15:28
    自定义通讯协议可以让你使用现成的通讯协议,只需要调用编程接口即可完成协议的组建。 内附:demo DLL (debug|release)版 include 如有好的改进意见请发送e-mail:huyansen@yahoo.cn 与我联系
  • SPI通讯协议介绍

    万次阅读 多人点赞 2017-08-07 18:38:24
    来到SPI通讯协议了。废话两句,“SPI很重要”,这是我在学校时候听那些单片机开发工程师说的。出来实习,到后来工作,确实如此,SPI的使用很常见,那么自然重要咯。  SPI(Serial peripheral interface)即串行外围...

      来到SPI通讯协议了。废话两句,“SPI很重要”,这是我在学校时候听那些单片机开发工程师说的。出来实习,到后来工作,确实如此,SPI的使用很常见,那么自然重要咯。

      SPI(Serial peripheral interface)即串行外围设备接口,是由Motorola首先在其MC68HCxx系列单片机上定义的,基于高速全双工总线的通讯协议。(又是高速,而且全双工,确实强大)被广泛应用于ADC、LCD等设备与MCU之间。

      跟前面学习I2C、USART一样,学习一种协议,还是从两个层面分析:物理层和协议层。

    ###1. SPI物理层
    SPI通讯需要使用4条线:3条总线和1条片选
    这里写图片描述

      SPI还是遵循主从模式,3条总线分别是SCK、MOSI和MISO,片选线为nSS(低电平有效),SPI协议适用于一主多从的工作场景:
    这里写图片描述

    (1) nSS(Slave Select):片选信号线,用于选中SPI从设备。每个从设备独立拥有这条nSS信号线,占据主机的一个引脚。设备的其他总线是并联到SPI主机的,即无论多少个从设备,都共同使用这3条总线。当从设备上的nSS引脚被置拉低时表明该从设备被主机选中。
    (2) SCK(Serial Clock):时钟信号线,通讯数据同步用。时钟信号由通讯主机产生,它决定了SPI的通讯速率。
    (3) MOSI(Master Ouput Slave Input):主机(数据)输出/从设备(数据)输入引脚,即这条信号线上传输从主机到从机的数据。
    (4) MISO(Master Input Slave Ouput):主机(数据)输入/从设备(数据)输出引脚,即这条信号线上传输从机从到主机的数据主从机通过两条信号线来传输数据,那么自然是全双工通讯的了。之前的I2C通讯,数据只在一条SDA线上传输,主从机数据交互只能采用半双工。

    ###2. SPI协议层
    这里写图片描述

      如上为SPI通讯时序图,nSS、SCK、MOSI信号均由主机产生,MISO信号由从机产生。在nSS为低电平的前提下,MOSI和MISO信号才有效,在每个时钟周期MOSI和MISO传输一位数据。
    跟I2C通讯类似,SPI通讯也需要通讯的起始/结束信号,有效数据和同步时钟。

    ####2.1 通讯的起始/结束信号
      图中的nSS信号由高电平变为低电平即为SPI通讯的起始信号,反过来,nSS信号由低电平变为高电平即为SPI通讯的结束信号。这个可比I2C简单得多吧。当从机检测到自身的nSS引脚被拉低时就知道自己被主机选中,准备和主机进行通讯。

    ####2.2 有效数据的采集
      SPI通讯的数据采集是个相对复杂的环节,先不说其他,以上图为例:
    图中红色框框即为有效数据被采集的时间点,"CPOL = 0"所在的脉冲信号表示的是用于进行数据同步的SCK,MOSI和MISO线上的数据在每个SCK时钟周期传输一位数据,注意,数据的输入/输出是可以同时进行的。
      由图可见,在SCK为奇数(更正:这里应该是偶数)边沿(在这里该边沿为下降沿)时,数据得到有效采样,也就是说,在这个时刻,MISO和MOSI的数据有效,高电平表示数据1,低电平表示数据0,在其它时刻数据并无效,可以理解为为下一次MISO和MOSI的数据传输做准备。
      数据在传输中,高位在先还是低位在先,SPI协议并无明确规定,但是数据要在主从机中正确传输,自然双方要先约定好,一般会采用高位在先(MSB)方式传输。

      这里需要再提及的概念是时钟极性(CPOL)和时钟相位(CPHA)。

      时钟极性(CPOL)指通讯设备处于空闲状态(SPI开始通讯前、nSS线无效)时,SCK的状态。

    CPOL = 0:SCK在空闲时为低电平
    CPOL = 1:SCK在空闲时为高电平
    

      时钟相位(CPHA)指数据的采样时刻位于SCK的偶数边沿采样还是奇数边沿采样。

    CPHA = 0:在SCK的奇数边沿采样
    CPHA = 1:在SCK的偶数边沿采样
    

      那么这样说来,SPI的采样时刻并非由上升沿/下降沿决定的。注意的是,在数据采样时刻,MOSI和MOSI的电平为有效电平,数据不能在这个时刻进行切换注意的是,在数据采样时刻,MOSI和MOSI的电平为有效电平,数据不能在这个时刻进行切换。在非采样时刻MOSI和MISO上的信号才能切换。

      完整的时序图如下:
    这里写图片描述

      所以说,SPI有4中工作模式:
    这里写图片描述
    更正:工作模式3的CPOL应为1。
    注意要让主机和从机需要在相同的工作模式下,这样才可以实现正常通讯。

    展开全文
  • 工控协议——S7通讯协议

    千次阅读 2020-02-18 10:18:14
    工控协议——S7通讯协议S7协议简介2. TPKT协议3.COTP协议 S7协议简介 S7以太网协议本身也是TCP/IP协议簇的一员,S7协议在OSI中的位置相当于将物理层和数据链路层之上的协议进行了定义,S7comm的协议栈修改程度更高,...

    S7协议简介

    S7以太网协议本身也是TCP/IP协议簇的一员,S7协议在OSI中的位置相当于将物理层和数据链路层之上的协议进行了定义,S7comm的协议栈修改程度更高,在应用层组织的数据经过COTP协议、TPKT协议的进一步处理后,最终通过TCP进行传输
    在这里插入图片描述
    S7协议与TCP/IP其中的对应关系:

    ISO-OSI参考模型 TCP/IP模型 S7以太网协议模型
    7-应用层 4-应用层 6-S7 Communication
    6-表示层 5-S7 Communication (COTP)
    5-会话层 4- S7 Communication (TPKT)
    4-传输层 3-传输层 3-TCP(102端口)
    3-网络层 2-网络层 2-IP
    2-数据链路层 1-网络接口层 1-工业以太网
    1-物理层

    备注:这里的S7模型并不是说S7是独立于TCP/IP的,只是为了标出S7模型下比较有代表性的内容,事实上S7就是TCP的一种定制,是TCP协议簇的一种

    在进行报文分析前,我们首先把s7的大概分析如下:

    2. TPKT协议

    TPKT(Transport Service ontop of the TCP):通过TCP的传输服务。介于TCP和COTP之间。属于传输服务类的协议,它为上层的COTP和下层TCP进行了过渡。功能为在COTP和TCP之间建立桥梁,其内容包含了上层协议数据包的长度。一般与COTP一起发送,当作Header段。我们常用的RDP协议(remote desktop protocol,windows的远程桌面协议)也是基于TPKT的,TPKT的默认TCP端口为102(RDP为3389),其实它本身为payload增加的数据并不多,主要就是以下几个:
    在这里插入图片描述
    version,1byte,表明版本信息
    reserved,1byte,看到这个名字就知道是保留的了
    length,2byte,包括payload和这三部分在内的总长度

    接下我们用2018工控比赛流量包来实际看一眼:
    在这里插入图片描述
    可以看到,版本号是3号,长度为31,除此之外该层并没有什么有用信息了

    3.COTP协议

    COTP协议的全称是(Connection-Oriented Transport Protocol),即面向连接的传输协议,从这个名字就可以看出,它的传输必然是依赖于连接的,所以在传输数据前必然有类似TCP握手建立链接的操作。

    接下来我们看看具体的流量包:
    

    在这里插入图片描述
    首先是TCP的三次握手,在192.168.25.146与192.168.25.139间建立了TCP连接,之后是两个COTP的包,注意,这里wireshark为我们标注出了CR和CC,后面的COTP包都是DT,这里的CR和CC其实分别是connect request(请求连接)和connect confirm(确认连接)的,也就是建立连接的过程,之后连接建立成功后,发送DT包,也就是data ,是在发送数据。
    (备注:wireshark是网络封包分析软件:下载地址为:https://www.wireshark.org/download.html有兴趣的可以去下载了解一下)

    接下来我们看看他们所携带的数据:
    在这里插入图片描述
    可以看到,DT包和连接包有着明显的不同,连接包明显多了一堆内容,这其实是COPT包的两种形态,COTP连接包(COTP Connection Packet)和COTP功能包(COTP Fuction Packet)

    首先来看COPT连接包,通过上面的wireshark的分析我们可以看到,主要有以下几个字段:

    • length,1byte,数据的长度,但并不包含length这个字段(至于为什么这样,不清楚)
    • PDU type,1 byte,标识类型,图中的0x0d即为连接确认的类型,常有的还有
      • 0xe,连接请求
      • 0x0d,连接确认
      • 0x08,断开请求
      • 0x0c,断开确认
      • 0x05,拒绝
    • DST reference,2byte,目标的引用,可以认为是用来唯一标识目标
    • SRC reference,2byte,源的引用,同上
    • option,1byte,可以看到wireshark将8位拆为了前四位和后两位:
      • 前四位标识class,也就是标识类别
      • 倒数第二位对应Extended formats,是否使用拓展样式
      • 倒数第一位对应No explicit flow control,是否有明确的指定流控制
    • parameter,附加的参数字段,参数可以有多个,每个参数又由以下几个字段构成:
      • code,1byte,标识类型,主要有:
        • 0xc0,tpdu的size,tpdu即传送协议数据单元,也就是传输的数据的大小(是否和前面的length有重复之处?)
        • 0xc1,src-tsap,翻译过来应该叫源的端到端传输(在完整的TCP/IP协议栈中,这个字段代表的是应用与应用之间的通信,我这里猜测可能是为了),但从西门子给的手册来看,它标记的应该是机架号,可是不管我怎么查,也没有找到wireshark解析出的字符串。那么逆向我们找不到答案,就只能正向来了,在parameter字段的最后我们再来详细说这到底是个啥。
          在这里插入图片描述
        • 0xc2,dst-tsap,同上,之后我们再探索
      • length,长度
      • 对应的数据
        接着COPT功能包,其实个人感觉这两种包可以归为一种,但是看到文献都是分为两种的,那我们也就划分为两种吧
        length,1byte,长度
        PDU type,1 byte,图中为0x0f,即为数据传输,此外的type都不太常用,这里不再提了(其实是我没找到相关的流量包……有这方面流量的大佬希望补全以下)
        option,1byte,以位为单位划分:
        第一位,标识是否为最后一个数据包(从这可以看出,COPT协议当数据较多时,会分为几个单元传输
        后七位,标识TPDU的number
        到这COPT包我们就算是分析的彻彻底底了,当然,上面还留了个小问题,parameter里的tsap到底是个什么东西?

    S7通信支持两种方式

    1.基于客户端(Client)/服务器(Server)的单边通信;
    客户端(Client)/服务器(Server)模式是最常用的通信方式,也称作S7单边通信。在该模式中,只需要在客户端一侧进行配置和编程;服务器一侧只需要准备好需要被访问的数据,不需要任何编程(服务器的“服务”功能是硬件提供的,不需要用户软件的任何设置)。
    2.基于伙伴(Partner)/伙伴(Partner)的双边通信;
    有时候,我们需要双向的数据操作,这就要使用伙伴(Partner)/伙伴(Partner)通信模式。
    伙伴(Partner)/伙伴(Partner)通信模式也称为S7双边通信,也有人称其为客户端(Client)—客户端(Client)模式。不管是什么名字,该通信方式有如下几个特点:

    • 通信双方都需要进行配置和编程;
    • 通信需要先建立连接。主动请求建立连接的是主动伙伴(Active Partner),被动等 待建立连接的是被动伙伴(Passive Partner);
    • 当通信建立后,通信双方都可以发送或接受数据;

    举例:在S7-300中,使用FB12(BSend)/FB13(BRecv)进行发送和接收。当一方调用发送指令时,另一方必须同时调用接收指令才能完成数据的传输。

    S7comm协议

    S7comm的结构主要分为三部分:

    Header
    Header:主要是数据的描述性信息,包含长度信息,PDU参考和消息类型常量,最重要的是要表明PDU的类型
    Parameter:参数,随着不同类型的PDU会有不同的参数
    Data:数据,该数据是一个可选字段来携带数据,例如存储器值,块代码,固件数据等。
    如下图:
    在这里插入图片描述

    Header:

    在这里插入图片描述
    在这里插入图片描述
    Protocol id 1 byte,即协议的id,始终设置为0x32
    ROSCTR 1byte,pdu(协议数据单元(Protocol Data Unit))的类型,一般由以下几种:

    • 0x01-job:开工干活的意思,主设备通过job向从设备发出“干活”的命令,具体是读取数据还是写数据由parameter决定
    • 0x02-ack:确认 确认有没有数据字段
    • 0x03-ack-data:从设备回应主设备的job
    • 0x07-Userdata:原始协议的扩展,参数字段包含请求/响应id,(用于编程/调试,SZL读取,安全功能,时间设置,循环读取…)

    Reserved:2byte,保留,始终设置为0x0000
    PDU reference:|pdu的参考–由主站生成,每次新传输递增,用于链接对其请求的响应,Little-Endian(注意:这是WinCC,Step7和其他西门子程序的行为,它可能是随机的生成后,PLC只将其复制到回复中)
    parameter length:参数的长度
    error class:错误类型,像是图中的0x00就是没有错误的意思,而常见的请求错误则是0x85
    error code:错误码,结合错误类型来确定错误,图中的0x00同样是没有错误的意思
    关于具体的错误类型和错误码的信息大家可以自行搜索,因为太多了这里就不再展开说明了。
    推荐地址:https://www.jianshu.com/p/19798f2768e1

    Parameter:取决于不同的pdu类型,
    下面来看看具体的流量包

    可以看到该pdu为job,也就是主设备在发号施令,而通过parameter可以看到,function是0x04的read,也就是读取数据,item count意思是后续跟了几个item,该pdu就一个,所以为1。

    而这个item的结构就有要单独说说了:
    variable specification,1byte,一般就是0x12
    Length:Length of following address specification,数据的长度
    Syntax Id:符号id,一个标志,决定了一些格式性问题,这里是0x10是Address data S7-Any pointer-like DBx.DBXx.x的意思,具体意思我们下面再提,详细的大家还是可以去自己看看,主要就是对于后续的寻址起到了一定的限定
    Transport size: 传输大小,也可以认为是传输类型,在这是4,也就是WORD
    DB number: 就是数据块编号的意思,0就代表要找的东西不在数据块里
    Area: 要操作的“东西”,比如0x82,就是读设备的输出,通过这一位也可以看到,我们要读的数据不在DB里,所以DB number为0,如果为DB的话,这1byte应该为0x84
    Address: 具体的地址,如下图所示,前五位没用到,第六位到第二十一位是Byte地址,最后三位是Bit的地址

    首先,它定义了格式为Address data S7-Any pointer-like DBx.DBXx.x,然后指定了读取的”东西“为设备的输出,读取的大小为word,其实到这里这个pdu的全部信息就已经分析完了,为了更好的理解上面定义的格式,我们还是继续看一下。

    它读的DB number是0那么根据格式就是DB0.DBXx.x,而读取的address是Byte为0,Bit为0,也就是DB0.DBX0.0,如果我们指定的”东西“为数据块的话,就按照这种格式读取。这就是格式的意思,再比如说0xb2,描述为Symbolic address mode of S7-1200,实际上格式就是符号地址,就不再是这样的组织形式了。

    再来看看上个pdu的相应,这里截图没截到header,header最值得关注的是pdu的类型,这里是0x03,也就是我们之前提到过的对于job的相应
    而paramter部分可以看到,function是与job pdu的相同的。Data部分就是传回来的具体数据了,return code是返回码,用来标识job让干活的结果,这里是0xff,代表的是成功的意思,除了这个,还有以下几种:
    0x01,硬件错误
    0x03,想访问的东西不让访问
    0x05,地址越界了
    0x06,你请求的数据类型和请求的”东西“的数据类型不一致
    接着是data的长度(是真的data的长度,不包含前面),最后就是具体的data了,可以看到,这里读到的是0x0000。

    下面结合具体案例分析
    工业协议数据流量包分析
    在这里插入图片描述
    可以看到一大堆的协议,不过整体思路还是刚才清晰的,首先是ARP协议去找mac地址(不知道arp的,补一下计算机网络的知识吧……),接着是标准的TCP三次握手,接着是COTP的建立连接(要不以后我叫他两次握手?),接着就到了S7comm和modbus来具体干活了。
    思路体现如下:
    ARP–>mac地址–>TCP三次握手–>COTP建立连接–>S7comm干活

    我们可以看到这个job和我们之前的并不一样,打开仔细瞧瞧

    我们看到parameter中的funtion为0xf0,是建立通信的意思,这其实是和上面的TCP、COPT有些相似的,都是在两个设备之间建立通信,而参数的主要信息是MAX AMQ calling和MAX AMQ called。
    下面一个ack_data的pdu自然是相应建立通信的意思了,经过TCP握手、COPT建立连接、S7comm建立通信,这样设备间的通信才正式建立完毕了。
    往后的S7comm可以看到是read,也就是在读数据,数据包和上面提到的一样,
    总结
    S7comm作为一个私有协议,它的可出题点其实更多,而且由于是私有协议,很多地方都还有挖掘的空间,这篇文章只是带大家按照我的思路,从无到有的分析了S7comm的各个部分,肯定有不完全正确的地方,也肯定有细节没有考虑到,希望大家能更进一步,探索更多的秘密。
    数据来源:https://github.com/w3h/icsmaster/tree/master/pcap

    2.S7 协议工作流程

    1. client与server通过socket建立连接,过程是标准的TCP连接方式,这一步完成连接的建立
    2. client发送COTP,请求连接PLC,报文中包含CR Connect Request和Destination TSAP,从而标识出CPU的机架号和槽号
    3. PLC返回COTP,确认连接,报文中包含CC Connect Confirm,此时server已经明确client与哪个CPU进行通讯
    4. client发送S7 Communication给server,报文中包含Setup communication,即通讯请求
    5. server返回S7
      Communication给client,报文的ROSCTR为ACK_DATA,有确认的意思,包含了对作业请求的回复
    6. client与server发送交换数据的报文,仍以S7 Communication完成

    注:2-5的步骤中,2与3完成数据传输前连接的功能,4与5则完成连接之后的通讯请求,如果绕过通讯请求的建立,在有TCP时就进行数据交换,服务器一般会直接断连
    另外推荐几个有用的协议网站
    开源通信库snap7:http://snap7.sourceforge.net/
    S7 wireshark解析器:https://sourceforge.net/projects/s7commwireshark/
    S7捕获包:https://github.com/gymgit/s7-pcaps
    PLC4X: http://plc4x.apache.org/protocols/s7/index.html

    展开全文
  • FastDFS服务端与客户端通讯协议 1. 通讯协议介绍 FastDFS服务端与客户端通讯时候采用的是自定义的通讯协议,如下图所示 协议包由两部分组成:header和body header共10字节,格式如下: 8 bytes body length 1 ...
  • 单线通讯协议

    千次阅读 2019-12-04 09:32:29
    单线通讯协议 一:双方TTL信号通过一根信号线,一根地线来进行通讯。 二:通讯硬件协议: 1:开始通讯前:主机为发状态,从机为收状态。主机CPU发起,给一个20ms的低脉冲信号,通知主机准备接收主机命令。 2:主机...
  • 串口通讯协议

    万次阅读 多人点赞 2018-03-02 10:02:47
    文章转载自http://www.cnblogs.com/firege/p/5805753.html20.1 串口通讯协议简介串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师...
  • MySQL 通讯协议

    千次阅读 2019-04-04 15:32:00
    Client/Server 通讯协议用于客户端链接、代理、主备复制等,支持 SSL、压缩,在链接阶段进行认证,在执行命令时可以支持 Prepared Statements 以及 Stored Procedures 。 当打算编写数据库代理、中间件、对 MySQL ...
  • RS485通讯协议

    千次阅读 2018-07-21 19:50:23
    通讯协议主要是实现两个设备之间的数据交换功能,通讯协议分硬件层协议和软件层协议。硬件层协议决定数据如何传输问题,比如要在设备1向设备2发送0x63,0x63的二进制数为0110 0011,这8个二进制数从设备1传输到设备2...
  • RS-485通讯协议

    万次阅读 多人点赞 2017-05-10 11:26:43
    1. 硬件层协议通讯协议主要是实现两个设备之间的数据交换功能,通讯协议分硬件层协议和软件层协议。硬件层协议决定数据如何传输问题,比如要在设备1向设备2发送0x63,0x63的二进制数为0110 0011,这8个二进制数从...
  • 联网常见通信协议与通讯协议梳理【上】- 通讯协议1 “通信”与“通讯”傻傻分得清传统意义上的“通讯”主要指电话、电报、电传。通讯的“讯”指消息(Message),媒体讯息通过通讯网络从一端传递到另外一端。媒体...
  • RS232类通讯协议及应用

    千次阅读 2017-06-15 10:52:46
    通讯协议
  • Dubbo通讯协议

    千次阅读 2019-01-14 18:20:24
    1、Dubbo通讯协议 第一、dubbo(默认) Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。反之,Dubbo 缺省协议不适合传送大...
  • python websocket通讯协议简单实现

    万次阅读 2020-05-02 23:51:04
    通常要实现C/S或者B/S架构的通讯时,会选择websocket通讯协议。websocket允许服务器主动给客户端发送消息,如果是在自动化控制做服务器的时候,可以考虑使用此协议。 服务端代码 首先得先安装 websocket-server库 ...
  • ODrive 通讯协议

    千次阅读 2019-12-03 14:40:24
    ODrive通讯协议 与ODrive进行通讯需要对通讯端点进行一系列操作。理论上,端点上的数据可以是以任何方式序列化的任何类型的数据。数据包采用默认的序列化方式,对于您自定义的数据包,您必须自己去进行反序列化。...
  • 网络通讯协议

    2019-05-24 14:12:56
    网址 网络通讯协议
  • Socket通讯协议

    2017-10-15 18:43:18
    通讯协议的用途在Socket强联网中,我们可以通过定义一些对数据封装的规则来进行数据的传输,让数据可以在服务器和客户端进行相互传输 自定义通讯协议的好处在网络中可以使用把数据转换为Json字符串然后进行服务器和...
  • modbus通讯协议详解

    千次阅读 2020-04-16 14:21:01
     Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和...
  • ModBus通讯协议软件包

    2019-04-11 10:41:50
    ModBus通讯协议简介  Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即...
  • IIC通讯协议解析

    千次阅读 2021-03-15 16:20:56
    IIC通讯协议解析概述接口 概述 IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以...
  • XMPP即时通讯协议

    千次阅读 2019-04-14 10:41:56
    XMPP即时通讯协议 XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messaging,即时消息)协议之一,其他三种分别为:即时信息和空间协议(IMPP)、...
  • 欧姆龙 PLC通讯协议

    千次阅读 2019-07-10 15:43:31
    https://blog.csdn.net/sgmcumt/article/details/87435778 fins 欧姆龙 PLC通讯协议
  • 微信公众号“智物客”和您免费分享物联网、智慧城市相关技术和项目解决方案。本文从物联网体系各层协议入手,重点分析了物联网体系常用的通讯协议,在下半部分,笔者将分享物联网体系的通信协议。
  • PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯 PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯 我们提供 PPI协议的官方文档,协议更新时间为2005年,下面是我们根据文档解析的PPI读取...
  • 浅谈通讯协议

    2018-05-30 03:05:30
    第一次写博客,水平有限,仅仅是根据自己的理解,就自定义通讯协议浅谈一下个人的理解,有偏差或错误的地方,欢迎指正。本人水平有限,勿喷。 摘要 本文档跳出常规理解的协议头,命令字,数据域的概念,将通讯...
  • arinc429通讯协议标准

    热门讨论 2011-05-08 13:52:29
    arinc429通讯协议是美国航空标准的通讯协议,稳定性很高。
  • 贝壳物联平台通讯协议

    万次阅读 2019-04-21 23:28:17
    贝壳物联平台通讯协议 贝壳物联平台通讯协议TCP、UDP、HTTP、Websocket说明,设备登录服务器,收发命令,发送实时数据,上传图片等协议。 首页 帮助文档 API文档 目录 一、概述 二、通讯地址 三、通讯...
  • UART串口通讯协议解析

    千次阅读 2021-02-26 11:44:04
    UART串口通讯协议解析概述接口通信协议 概述 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,704
精华内容 14,681
关键字:

通讯协议