• 【Modbus通信实验四】实现Modbus RTU协议


    一、Modbus协议简介

    Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。
    传统Modbus 是一个请求/应答协议,由于485为单工,1个服务器为主,多个客户机为从,从设备只能应答。

    Modbus消息桢包括RTU、ASCII、TCP。RTU、ASCII消息桢用于异步串行传输通信。TCP消息桢应用于网络传输通信(本文暂不考虑)。
    在这里插入图片描述

    ASCII模式:消息以冒号字符(:对应ASCII码3aH)开始,以回车换行符(CR,LF对应ASCII码0dH,0aH)结束。其它域可以使用的传输字符是十六进制的0…9,a…f。(H表示16进制hex)
    RTU模式:以RTU模式在Modbus总线上进行通讯时,信息中的每8位字节分成2个4位16进制的字符,每个信息必须连续传输。

    例:写出设备地址0x02、功能代码0x01、数据0x13的ASCII模式和RTU模式通用消息帧:
    RTU:0x02 0x01 0x13 0x_crc___(CRC结尾)
    ASCII:0x3a 0x30 0x32 0x30 0x31 0x31 0x33 0x_lrc_ 0x0d 0x0a(回车换行符结尾)

    注:Modbus RTU由于没有起始和结束字符,故需要再传输时填充大于3.5个字符的数据以此来隔开报文。
    这里是引用

    ASCII和RTU没有优劣,只是应用场景不同:在这里插入图片描述

    二、Modbus RTU命令

    开关量:开关量只有两种状态,0、1,包括开入量和开出量,反映的是状态。(某个电灯的开关,对应MODBUS线圈中一位)
    模拟量:模拟量是连续的量,数字量是不连续的。反映的是电量测量数值(如电流、电压)(电灯当前电流测量值,对应MODBUS中的寄存器)

    1.读写线圈(开关量控制及状态返回)

    • 功能码01

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    下图为一个典型的Modbus主从控制电路,PC为Master,MCU为Slave。 MCU通过线圈继电器来控制外部电路中的开关,同时通过光耦原件监测灯泡附近的电势,并实现与外部电路的相互隔离。
    在这里插入图片描述
    PC发送01命令时MCU根据线圈的状态对主机回复。
    PC发送05命令时MCU通过控制线圈中的电流大小,从而控制外部电路中的开关开闭。
    PC发送02命令时MCU通过读取光耦原件返回的电信号,从而对主机进行输入状态的回复。

    2.读写寄存器(数值给定设置及测量结果返回):对电灯设定电灯功率,接收当前电灯实际功率。

    • 功能码03/04(03是读保持寄存器,04是读输入寄存器)

    在这里插入图片描述

    • 功能码10

    10用于写多个寄存器。
    在这里插入图片描述

    Modbus功能码表完全版如下:
    在这里插入图片描述

  • 相关阅读:
    windows添加定时任务命令
    ipad触控笔是哪几款?性价比触控笔排行榜
    抖音seo源码开发部署搭建分享--SaaS
    SpringBoot 使用Prometheus采集自定义指标数据
    事务管理 vs. 锁控制:你真的分得清吗?何时使用何种并发控制策略?
    运维:Centos7安装解压版mysql5.7
    coreldraw2024版本有哪些新增功能?
    【web前端期末大作业】html网上在线书城大学生静态网页 大学生html当当书城仿站 网上书城购物网页作业HTML
    Java集合(一)
    腾讯云服务器“可用区”相关问题解答(新手选择指导)
  • 原文地址:https://blog.csdn.net/fuckthebugs/article/details/132526447