曂沅仴駦 发表于 2024-8-17 07:21:02

Modbus Tcp协议

一:modbus起源

    1.起源

    Modbus由Modicon公司于1979年开发,是一种工业现场总线协议标准。
    Modbus通信协议具有多个变种,此中有支持串口,以太网多个版本,此中最著名的是Modbus RTU、Modbus ASCII和Modbus TCP三种
    此中Modbus TCP是在施耐德收购Modicon后1997年发布的。
   
[*]分类:
    1)Modbus RTU
    https://i-blog.csdnimg.cn/direct/e334b2074ce448588b796d8003d1d3a0.png
    运行在串口上的协议,采用二进制表现情势以及紧凑的数据结构,通信效率较高,应用比较广泛
    2)Modbus ASCII
    https://i-blog.csdnimg.cn/direct/4c3e84450811415b8fa35157753250ad.png
    运行在串口上的协议,采用ASCII码举行传输,而且每个字节的开始和竣事都有特殊字符作为标记,传输效率远远低于Modbus RTU,一样平常只有通讯量比较少时才会思量它。
    注:在ASCII模式下,每个8位的字节被拆分成两个ASCII字符举行发送,好比十六进制0xAF(1010 1111),会被分解成ASCII字符“A”(0100 0001)和”F”(0100 0110)举行发送,其发送量显然比RTU增加一倍。
    3)Modbus TCP
    https://i-blog.csdnimg.cn/direct/06d05ed22c3843d78ec32b5832aaa97a.png
    运行在以太网上的协议
   
[*]优势:
    免费、简单、容易使用
   
[*]应用场景:
    Modbus协议是现在国内工业范畴应用最多的协议,不但PLC装备,各种终端装备,好比水控机、水表、电表、工业秤、各种采集装备。
   
[*]ModbusTCP特点(掌握):
    1)采用主从问答式通信
    2)Modbus TCP是应用层协议,基于传输层的TCP举行通信的
    注:更好的明白网络模子的分层特点:
    各层之间独立,每一层不需要知道下一层如何实现
    当任何一层发生变革时,只要层间接口关系保持稳定,则这层以上或以下层不受影响。
    https://i-blog.csdnimg.cn/direct/2afa38b8cd494481a2cdce44bb7e7cd8.png
    3)Modbus TCP端口号默认502
   
   

[*]ModbusTCP的协议格式
    ModbusTcp协议包罗三部分:报文头、功能码、数据
    https://i-blog.csdnimg.cn/direct/5587fd1cea0c4a8193934d46d27bfcf5.png
    MBAP:Modbus Application Protocol (modbus报文头)
    PDU:Protocol Data Unit(协议数据单元)
    Modbus TCP/IP协议最大数据帧长度为260字节
   
    1.报文头

    包罗7个字节
    https://i-blog.csdnimg.cn/direct/25f2b8d74b48490da4032a4630996e80.png
   
    二:寄存器

    一共有四种范例的寄存器,分别是:线圈、离散量输入、输入寄存器、保持寄存器。
   
    离散量和线圈其实就是位寄存器(每个寄存器数据占1字节),工业上重要用于控制IO装备。输入和保持寄存器是字寄存器(每个寄存器数据占2个字节),工业上重要用于存储工业装备的值。
   
[*]离散量和线圈其实就是位寄存器(每个寄存器数据占1字节),工业上重要用于控制IO装备。
    线圈寄存器,类比为开关量,每一个bit都对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。好比控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。
    读可以用一个功能码表现读多个大概读单个
    对应3个功能码
    离散输入寄存器,离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表现一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。好比我读取外部按键的按下照旧松开。
    对应功能码1个
    2. 输入和保持寄存器是字寄存器(每个寄存器数据占2个字节),工业上重要用于存储工业装备的值。
    保持寄存器,这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,而且是可读写的。好比空调检测到的室温,这是不可以修改的,因为室温是根据实际的物理情况决定的。
    功能码有对应的三个
    输入寄存器,这个和保持寄存器类似,但是也是只支持读而不能写。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的温度传感器的值
    对应的功能码也就一个
   
         总结:
   读都是可以一个功能码读多个或单个的。而写是分为写单个和写多个需要两个功能码。
   所以对于只读的寄存器都只有一个功能码,而可读可写的寄存器都有三个功能码
      
   
[*]
[*]功能码

    功能码占一个字节
    https://i-blog.csdnimg.cn/direct/c67ee6140bc3420a9dbe46f00261dc9a.png
    写多个线圈0X0F
    写多个保持寄存器0X10
   
    具体协议分析可参考:
    实例分享 | ModbusTCP报文详解
    https://i-blog.csdnimg.cn/direct/bae5062605784be7a5f2b40d36135f8c.png
    https://i-blog.csdnimg.cn/direct/eacc5684c8434bc4be2b03d62153e2e6.png
   
         读数据:
   主机--》从机
   报文头----功能码---起始地点---数目
   从机---》主机
   报文头----功能码---字节计数---数据
      
   
    写单个线圈
    https://i-blog.csdnimg.cn/direct/925ab4f4974e4fa8bc9b5138385a6327.png
   
         写单个
   主机--》从机
   报文头---功能码---地点--- 通/断标记 /数据
   从机--》主机
   原文返回
      
   
    写多个线圈寄存器
    https://i-blog.csdnimg.cn/direct/785c1ae590944ccdabdf980dafc5628e.png
    https://i-blog.csdnimg.cn/direct/c6225109020c4aa482425983f3718906.png
    写多个
    主机--》从机
    报文头---功能码--起始地点--数目--字节计数--数据
    从机--》主机
    报文头---功能码--起始地点--数目
   
    主机询问数据流
    00 00 00 00 00 06 01 03 00 63 00 02
    03:功能码
    0x0063:起始地点 6*16+3=99 ,40100
    0002:个数 40100 40101
    从机应答数据流
    00 00 00 00 00 07 01 03 04 02 13 30 08
    03:功能码
    04:字节计数
    0213 :40100数据
    3008: 40101数据
   
    练习:
   
[*]读传感器数据,读1个寄存器数据,写出主从数据收发协议。
    00 00 00 00 00 06 11 01 00 01 00 01
   
    00 00 00 00 00 04 11 01 01 00
   
   
[*]写出控制IO装备开关的协议数据,操作1个线圈,置1。
    00 00 00 00 00 06 11 05 00 63 ff 00
   
    00 00 00 00 00 06 11 05 00 63 ff 00

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Modbus Tcp协议