• modbus协议教程


    1、modbus协议简介

    modbus是工业现场总线通信协议中应用较为成熟稳定的协议。理解起来也比较简单。modbus数据传输采用大端模式

    1.1功能码简要说明

    modbus定义了不同的功能码来操作不同类型的数据。具体如下:

    序号功能码名称读写寄存器数据类型说明
    10x01读线圈寄存器Rbit读输出开关量,每个bit代表一个信号。类比mcu的通用输出口
    20x02读离散输入寄存器Rbit读输入开关量,每个bit代表一个信号。类比mcu的通用输入口
    30x03读保持寄存器Ruint16读数据,每个数据是16位
    40x04读输入寄存器Ruint16读输入数据,每个数据是16位,类比模拟量输入信号
    50x05写单个线圈寄存器Wbit写输出开关量,每个bit代表一个信号。类比mcu的通用输出口
    60x06写单个保持寄存器Wuint16写数据,每个数据是16位
    70x0f写多个线圈寄存器Wbit写输出开关量,每个bit代表一个信号。类比mcu的通用输出口
    80x10写多个保持寄存器Wuint16写数据,每个数据是16位

    1.2线圈寄存器读写操作(读输出口状态,设置输出口状态)

    1.2.1 读单个线圈寄存器(功能码0x01)

    字节12345678
    说明通信地址功能码数据高地址数据低地址数据长度高字节数据长度低字节CRC低字节CRC高字节
    示例0x010x010x000x000x000x010xFD0xCA

    数据地址:开始读取的首地址
    数据长度:读取的长度,注意由于线圈寄存器的最小单位是bit,所以改长度对应的读取的bit数量,上面的例子中读取的是地址第一个线圈寄存器的值

    如果线圈寄存器的值为1,则返回如下数据:

    字节123455
    说明通信地址功能码字节数数据0CRC低字节CRC高字节
    示例0x010x010x010x010x900x48

    1.2.2写单个线圈寄存器(功能码0x05)

    将单个线圈寄存器写1,注意写1要发送0xff 0x00

    字节12345678
    说明通信地址功能码数据高地址数据低地址数据长度高字节数据长度低字节CRC低字节CRC高字节
    寄存器置10x010x050x000x000xFF0x000x8C0x3A

    返回数据为发送的数据:
    01 05 00 00 FF 00 8C 3A

    将单个线圈寄存器写0,注意写0要发送0x00 0x00

    字节12345678
    说明通信地址功能码数据高地址数据低地址数据长度高字节数据长度低字节CRC低字节CRC高字节
    寄存器置00x010x050x000x000x000x000xCD0xCA

    返回的数据为发送的数据:
    01 05 00 00 00 00 CD CA

    1.2.3读多个线圈寄存器(功能码0x01)

    读取两个线圈寄存器,假如线圈寄存器1值为1,线圈寄存器2值为1则,

    01 01 00 00 00 02 BD CB
    数据返回
    01 01 01 03 11 89

    返回的值为3,3的2进制表述为11b

    1.2.4写多个线圈寄存器(功能码0x0F)

    字节12345678910
    说明通信地址功能码数据高地址数据低地址线圈数量高字节线圈数量低字节字节数量数据CRC低字节CRC高字节
    示例0x010x0F0x000x000x000x020x010x030x9E0x96

    上面的例子是将第一和第二个线圈写入1。0x03的二进制为11b。
    返回的数据格式如下:

    字节123456910
    说明通信地址功能码数据高地址数据低地址线圈数量高字节线圈数量低字节CRC低字节CRC高字节
    示例0x010x0F0x000x000x000x020xD40x0A

    注意,当写入的线圈数量不大于8则字节数量为1,数据为1个字节。如果长度超过8,则字节数量为2,字节8对应1-8线圈的值,字节9对应线圈9-16的值,字节10和11为crc

    1.3读输入离散输入寄存器(功能码0x02)

    字节12345678
    说明通信地址功能码数据高地址数据低地址读取数量高字节读取数量低字节CRC低字节CRC高字节
    示例0x010x020x000x000x000x040xFD0xCA

    上面读取了4个离散输入寄存器的值,假如4个寄存器的值为0101b,则返回数据如下:

    字节123478
    说明通信地址功能码字节数量数据CRC低字节CRC高字节
    示例0x010x020x010x050x610x8b

    其中的每个bit代表io口的输入值。

    1.4读取输入寄存器(功能码0x04)

    输入寄存器读取的是类似模拟量的数据,每个数据占16bit。而离散输入寄存器每个bit占1个bit,这是这两者的区别。

    字节12345678
    说明通信地址功能码数据高地址数据低地址读取数量高字节读取数量低字节CRC低字节CRC高字节
    示例0x010x040x000x000x000x010x900x0a

    上面读取了1个输入寄存器值,假如寄存器的值为0x1000,从机的返回如下:

    字节123478
    说明通信地址功能码字节数量寄存器数据高字节寄存器数据低字节CRC低字节CRC高字节
    示例0x010x040x020x100x000xb40xf0

    读取4个输入寄存器如下:
    01 04 00 00 00 04 F1 C9
    返回数据
    01 04 08 10 00 10 01 10 02 10 03 F2 90
    返回的数据长度:8字节
    第一个寄存器值:0x1000
    第二个寄存器值:0x1001
    第三个寄存器值:0x1002
    第四个寄存器值:0x1003

    1.5 保持寄存器读写操作

    1.5.1读保持寄存器(功能码0x03)

    字节12345678
    说明通信地址功能码寄存器高地址寄存器低地址读取数量高字节读取数量低字节CRC低字节CRC高字节
    示例0x010x030x000x000x000x020xc40x0b

    上面读取了两个寄存器的值,假如第一个寄存器值0x147b,第二个寄存器值0x3f8e,则从机的返回数据如下:

    字节12347891011
    说明通信地址功能码字节数量第一个寄存器数据高字节第一个寄存器数据低字节第二个寄存器数据高字节第二个寄存器数据低字节CRC低字节CRC高字节
    示例0x010x030x040x140x7b0x3F0x8E0x1E0x4E

    1.5.2写单个保持寄存器(功能码0x06)

    字节12345678
    说明通信地址功能码寄存器高地址寄存器低地址写入值高字节写入值低字节CRC低字节CRC高字节
    示例0x010x060x000x000x000x020x080x0b

    如果写入成功:则返回发送下去的值
    01 06 00 00 00 02 08 0B
    这样就成功将第一个寄存器的值写为0x0002

    1.5.3写多个保持寄存器(功能码0x10)

    字节12345678910111213
    说明通信地址功能码寄存器高地址寄存器低地址寄存器数量高字节寄存器数量低字节写入字节数第一个寄存器值高字节第一个寄存器值低字节第二个寄存器值高字节第二个寄存器值低字节CRC低字节CRC高字节
    示例0x010x100x000x000x000x020x040x000x010x000x020x230xae

    如果写入正常则从机的返回值如下:

    字节123456910
    说明通信地址功能码数据高地址数据低地址线圈数量高字节线圈数量低字节CRC低字节CRC高字节
    示例0x010x100x000x000x000x020x410xc8

    这样就正常将第一个寄存器写入0x0001,第二个寄存器写入0x0002

    1.6 错误反馈

    如果发送的命令有问题,则会返回错误帧,如果是crc错误,从机是不会返回任何数据。从机返回错误的格式如下:

    字节123910
    说明地址码功能码错误码CRC低字节CRC高字节
    示例0x010x80+功能码0x00

    常见错误码

    错误码名称说明
    0x01非法功能码不支持该功能码操作寄存器
    0x02非法的寄存器地址设备没有该地址
    0x03非法的数据数据格式不对
    0x04从机故障从机工作不正常

    发送:01 06 00 00 01 02 04 00 01 00 02
    返回:01 86 03 02 61
    错误码为3,说明数据格式错误。上面的数据应该是写多个寄存器0x10,但功能码是写单个寄存器0x06,所有导致错误。

    发送:01 16 00 00 01 02 04 00 01 00 02 D3 71
    返回:01 96 01 8E 60
    错误码为1,说明功能码不对,没有0x16功能码

  • 相关阅读:
    C语言之初阶总结篇
    java文件查看大小,压缩,文件下载工具类
    Vue路由介绍及使用
    使用内网端口映射方案,轻松实现U8用友ERP的本地部署异地远程访问——“cpolar内网穿透”
    若依(RuoYi )权限管理设计
    SpringBean的实例化
    Java集合框架-------泛型
    【T+】余额表联查明细账,提示未将对象引用设置到对象的实例;参数格式错误,solutionID不能为空。
    Apifox : 不仅是Api调试工具,更是开发团队的协作神器
    3.深入理解Java并发编程
  • 原文地址:https://blog.csdn.net/sinat_36568888/article/details/126752198