• 【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功能码表完全版如下:
    在这里插入图片描述

  • 相关阅读:
    智能语音热水器:置入NRK3301离线语音识别ic 迈向智能家居新时代
    Web自动化测试(4)-关键字驱动
    异形双柱体阵列纳米粒:针状/花状纳米粒子/纳米金星/金笼/金壳/三角形纳米金
    元素可视区操作之client系列offset系列以及scroll系列
    STM32物联网项目-高级定时器功能介绍
    Google Earth Engine(GEE)——Landsat 8 C02影像NDVI平滑窗口计算(NDVI波段为例)
    The Missing Semester
    固体物理期末3套试题
    GO 中的时间操作(time & dateparse)【GO 基础】
    为了让线上代码可追溯, 我开发了这个vite插件
  • 原文地址:https://blog.csdn.net/fuckthebugs/article/details/132526447