• modbus学习笔记——帧


     几个需要先搞懂的概念

    1.modbus的数据类型

    modbus定义了四种数据类型,这四种数据类型分别叫“离散量输入”“线圈”“输入寄存器”“保存寄存器”,这四种数据类型的功能见上表,其实他这名字很容易让人搞混了,我们只要记住这四个仅仅是四种数据类型的名字就行了,不要与现实中其他同名的东西搞混就行(例如“线圈”在这了就是一个数据类型,这种数据类型是可读可写的,不要与物理上的线圈混为一谈)

    数据类型功能解析:

    离散量输入——只读,获取某个IO状态(1bit)。

    线圈——读写,主要用于设置某个值。

    输入寄存器——只读,获取某个16bit数据的值。

    保持寄存器——读写,设置某个16bit数据的值。

    2.modbus的功能码

    下图是一个modbus的帧格式,其中PDU由两部分组成,功能码和数据。

    功能码是一个8位的数据,的作用是说明该帧是干什么的。比如,0x01代表读取线圈,0x02代表读取输入离散量,详细功能见下图

    下面正式开始说明modbus的帧。

    上图中,左边是请求,右边是响应。

    请求帧的PDU数据是:02  00  C4  00  16

    02  是功能码,根据功能码的定义(上表)02的意思是读取离散数据量。

    00  C4  这两个是起始地址,00是高8位,C4是低8位。离散数据量可以有很多,都被放置在一个数组中(比如A[100])。

    00  16  是要读取的数据的数量,00 是高8位,16是低8位。意思就是读取0x16个数据(注意这里是16进制,转换成10进制就是22)连同上一行数据(00C4)合起来的意思就是从0x00C4开始,读取0x0016个数据。

    右边是响应。

    响应的PDU是:02  03  AC  DB  35

    02  功能码。

    03  说明返回了0x03个字节的数据。

    AC  DB  35  这三个字节的数据就是请求中需要读取的从ox00C4开始的0x0016个数据,由于0x16(十进制是22)个数据(就是22个bit,因为离散数据量是单个bit的)在

    两个字节(两个字节只有16个bit)里放不下,所有这里需要3个字节(并未全部占全,剩下的两个用0补齐)。

    那么数据如何对应地址呢?

    请求中需要得到的数据是0x00C5——0x00DA(共0x16个)。

    于是,0xC5——0xCC、0xCD——0xD4、0xD5——0xDA。

    对应的就是上面图中响应帧的204-197,212-205,218-213.注意,高位在前。

  • 相关阅读:
    jq实现多级手风琴效果
    css弹性盒布局
    css兼容处理
    bootstrap--双日历插件
    char*,string,char a[], const char *,之间的转换
    8.Maximum Depth of Binary Tree
    7. Minimum Depth of Binary Tree-LeetCode
    6. Reverse Linked List 逆转单链表
    5.Maximum Product Subarray-Leetcode
    卷积神经网络(Convolutional Neural Networks)CNN
  • 原文地址:https://www.cnblogs.com/feipeng8848/p/7216215.html
Copyright © 2020-2023  润新知