泓泰

物联网数据接入篇-应用层 Modbus(5)

admin
物联网数据接入篇-应用层 Modbus(5)-第1张-游戏相关-泓泰

前四【sì】篇文【wén】章讲述的是TCP/IP 模型中的网【wǎng】络接口层、网络【luò】层、传输层、应【yīng】用层一,这里到了第四层应用【yòng】层二【èr】。由于协议【yì】比较【jiào】多,就分开篇来介绍【shào】。这篇讲Modbus 协议,后面再讲 MQTT协议、CoAP 协议、OPC 框【kuàng】架【jià】。都是【shì】物联网常用的应用层协【xié】议。

第四层:应用层协议之二-物联网Modbus 协议

Modbus协议是一【yī】种请【qǐng】求/应答方【fāng】式的交互过程,主机【jī】主动【dòng】发起通【tōng】讯【xùn】请求,从机响应主机的【de】请【qǐng】求,从机【jī】在没有收到主机的请求时,不【bú】会主动【dòng】发送数据,从机之间不会进行通讯。

其中 Mod 是【shì】莫迪【dí】康公司,现在被【bèi】施耐德电器收购。bus 是总【zǒng】线的意思,就是有一根主线,有主站和【hé】从【cóng】站(主人和奴【nú】隶)。

Modbus 的分类

Modbus 属于应用【yòng】层【céng】协议,他依赖于物理【lǐ】层、数据【jù】链路【lù】层和传输层【céng】来传【chuán】输他的电流电【diàn】压【yā】、数据帧、数据包。所以,按Modbus 所依赖【lài】的网络【luò】接口【kǒu】层协议【yì】的【de】不同,可以分为以太网通【tōng】信的 Modbus、串口通信的 Modbus、无线【xiàn】通信的 Modbus。串口通信的 Modbus包括依赖 RS232、RS485、RS422 等。

Modbus 按【àn】照他的传输模式,可以分为Modbus ASCII、Modbus RTU、Modbus TCP/IP。

Modbus 总线上所有的设备传【chuán】输模式【shì】必须相同【tóng】。Modbus RTU是一种紧凑的,采用二进制表示数【shù】据的方式。Modbus ASCII是一【yī】种人类可【kě】读【dú】的,冗长的表示方【fāng】式。Modbus TCP/IP,基于【yú】 TCP/IP 的协【xié】议,用【yòng】于通过以太【tài】网和互联网进行通信。你看看,Modbus RTU是直接通过物理层和数据链路【lù】层传【chuán】递【dì】帧【zhēn】的,不依赖传【chuán】输【shū】层和网【wǎng】络层。

Modbus 通信适用的设备

Modbus协议广泛【fàn】应用在工业控制器、传感器、PLC、HMI、控制【zhì】面板、驱动程【chéng】序、动【dòng】作控【kòng】制、输入/输出设备等等。在基【jī】于串行链【liàn】路和以【yǐ】太 TCP/IP 网络【luò】的 MODBUS 上【shàng】可以进行相同通信。

一些网关【guān】允许在几种使用 MODBUS 协议的总线【xiàn】或网络之【zhī】间【jiān】进【jìn】行通信。

Modbus 网络体系结构示例图:

Modbus 的通用帧格式

包括地址域、功能码、数据、差错校验。

主要包括:

地址域【yù】:1字节,即从机【jī】设备地址,通常1-247为【wéi】有效地址,0为广【guǎng】播地址。功能码:1字【zì】节【jiē】,表明主【zhǔ】机请求数据的类型。数据:N字【zì】节,包【bāo】含寄存器【qì】地址【zhǐ】和寄存器【qì】数【shù】据等。差错校验:对数据【jù】进行冗【rǒng】余【yú】校验的结【jié】果【guǒ】,CRC或LRC

Modbus RTU

RTU 格式是 Modbus 协议中【zhōng】最常用【yòng】的串行通讯【xùn】格式之一【yī】,数据以二进制方式进行传输,采用【yòng】固定【dìng】的数据帧长度,传输效率高【gāo】,适【shì】用于【yú】高速通讯和较远距离【lí】的数【shù】据传输。

拓扑图:

Modbus RTU 通常基于 RS-485 串行通信【xìn】链路,RS-485 总【zǒng】线布线【xiàn】规范规定其必须是总线式拓扑结构。在实【shí】际布线中【zhōng】,通常采用手【shǒu】牵【qiān】手【shǒu】菊花【huā】链布线方式。1 和 2,2 和 3,3 和 4 这样连【lián】接。RS 232 只有一个主站一【yī】个从站【zhàn】。

帧格式:

01 03 00 00 00 02 C4 0B

01:地址

03:功能码

00 00:数据(寄存器地址)

00 02:数据(寄存器数量)

C4 0B:CRC 校验

起【qǐ】始标【biāo】志(Start):通过【guò】传输中【zhōng】的【de】 3.5 个字符间隔实现。

地址(Address):1 字节。

功能码(Function Code):1 字节。

数据(Data):可变长度(最多 252 字节)。

错误校验(CRC):2 字节(循环冗余校验)。

结束标志(End):通过传输中的 3.5 个字符间隔实现。

Modbus RTU 特点:

协议简洁:使用二进制格式传输数据,提高了通信效率。

可靠性高:通过循环冗余校验(CRC)来确保数据的完整性。

主从架构【gòu】:一个主【zhǔ】机可以控制多个从机。从【cóng】机仅在接【jiē】收到主机的【de】请求后才会发送数据【jù】,避免了通信冲突【tū】。

易于调试和监控:提供了【le】多种调试和监控工具【jù】,便于工程【chéng】师进行【háng】现场维护和【hé】故障排除【chú】。

Modbus ASCII 数据帧

ASCII 格【gé】式【shì】是【shì】 Modbus 协议中另一种【zhǒng】常用【yòng】的串【chuàn】行通讯格式【shì】,数据以 ASCII 码的十六进制【zhì】表【biǎo】示进行传输,数据帧长度较长,传输效率相对较【jiào】低,适用于低速通讯和【hé】较短距离【lí】的数据传输。

Modbus ASCII 也是基于串口通信的。拓【tuò】扑图见【jiàn】上面【miàn】的 RTU。

:010300000002FArn

“:”起始标志

0000:数据(寄存器地址)

0002:数据(寄存器数量)

FA:LRC 校验

rn:结束标志

Modbus ASCII:

起始标志(Start):一个冒号 :

地址(Address):2 个【gè】 ASCII 字【zì】符(表示 1 字节【jiē】的十六【liù】进制值)

功能码(Function Code):2 个 ASCII 字符【fú】(表示 1 字节的十【shí】六进【jìn】制值)

数据(Data):每字节由 2 个 ASCII 字【zì】符【fú】表示【shì】(十六进制)

错误【wù】校【xiào】验(LRC):2 个 ASCII 字符(表示 1 字节的十【shí】六【liù】进制值)

结束标志(End):CR LF(回车和换行)

Modbus TCP/IP

Modbus TCP 基于以【yǐ】太网【wǎng】通信【xìn】,因此其网络拓扑【pū】结【jié】构更为灵活。从串行链路上一【yī】主多从的构造,演变为多客户端/多【duō】服务【wù】器端的构造模型。注意【yì】这里不是主站从站概念,而【ér】是【shì】客【kè】户端【duān】/服务器的【de】概念。

客户端【duān】(Client):发起通信请求,控制【zhì】和监视【shì】网络中的其他设备。

例【lì】子:HMI、PLC(作为控【kòng】制器)、SCADA系统、工业计算机。

服务【wù】端(Server):响应客【kè】户端的请求,提供数据或【huò】执行【háng】指令。

例子:传感器、执行器、PLC(作为被控设备)、智能仪表。

拓扑图:

以太网通讯方【fāng】式主要【yào】包【bāo】括 Modbus TCP/IP 和 Modbus UDP/IP 两种【zhǒng】。Modbus TCP/IP 是基于以【yǐ】太网【wǎng】的一【yī】种通讯方式【shì】,它将 Modbus 协议封装在【zài】 TCP/IP 协议栈中,通过以太网【wǎng】传输数据,采用基于连【lián】接的通讯方式,具有【yǒu】高速、稳定的特点【diǎn】。

Modbus UDP/IP 是【shì】基于 UDP/IP 协议的【de】一种通讯方式,采用无连接的通【tōng】讯方式,不保证数据的【de】可【kě】靠性和顺序,适用【yòng】于对实时【shí】性要【yào】求较高、对通【tōng】讯【xùn】效率要求【qiú】较【jiào】高的【de】应用场景。帧格式:

起始标志(Start):无(由 TCP/IP 协议处理)

地址(Address):1 字节

功能码(Function Code):1 字节

数据(Data):可变长度

错误校【xiào】验(CRC):在 Modbus TCP 头中由 TCP/IP 协【xié】议【yì】处理

结束标志(End):无(由 TCP/IP 协议处理)

Modbus 协议的功能码

Modbus 协议【yì】中,功能码用于指定请求的【de】操【cāo】作【zuò】类型【xíng】,例如读取或【huò】写入【rù】数据。每【měi】个功能【néng】码都有特定的含义和操作。以下是常见的 Modbus 功能码及其用【yòng】途:

这里的线圈啊,寄存器都是个什么东西:

线圈 = 一个布尔量。寄存器 = word 操作。

现代 Modbus 设【shè】备,它们通常只映射到一块【kuài】内存区【qū】域。在【zài】这个内存区域中,线圈表示位操作(bit),每个线【xiàn】圈对【duì】应一个布尔变量【liàng】(0 或 1、开或关)。而【ér】寄存器则表示字操作(word),每个寄存器对应一个【gè】整型【xíng】变量【liàng】。当然,也可【kě】以通过多个【gè】寄存器的组合来表示浮【fú】点数以【yǐ】及其【qí】他【tā】复合【hé】数据结【jié】构。在 Modbus 协议中,一个字【zì】(word)的长度是 16 位,即 2 个【gè】字【zì】节,16 个比特。

Modbus 广播方式:单薄和广播

单播:

在单播模式下,从站地址必须【xū】唯一,地址范围为 1 到 247。主站通过【guò】特定地址访【fǎng】问指【zhǐ】定的从站,发【fā】出一个请【qǐng】求【qiú】数据帧【zhēn】。请求数据帧【zhēn】的功能可【kě】以是读取或写入数据。从站接收到请求【qiú】后【hòu】,进行相应的【de】处【chù】理,并在完【wán】成后【hòu】发送一个应【yīng】答数据【jù】帧,表示读取或写入操【cāo】作成功(又要【yào】注意 RS232 只能有一个【gè】从站)。获取数据需要轮询一下所有的从站。单【dān】播模式图:

广播:

在广播模【mó】式下【xià】,主站向所有从站发出请求数据帧【zhēn】,所有从站都会处理这条【tiáo】命【mìng】令。对于广播请【qǐng】求,所有从站无【wú】需【xū】做出应答操【cāo】作。通常,地址 0 表示广播地址【zhǐ】。有例【lì】外情况【kuàng】哈。

Modbus 广播通常用于同【tóng】时对多个【gè】从【cóng】设【shè】备进行相同【tóng】的操作,例【lì】如同时启【qǐ】动或停止多个从设备。

RS-232、RS-485、RS-422 对比表格:

Modbus RTU、Modbus ASCII、Modbus TCP/IP 对比【bǐ】表格:

应用

Modbus 是一个开源的库,可以用来在嵌入【rù】式系【xì】统【tǒng】上实现 Modbus 协议。它通【tōng】常【cháng】用于以【yǐ】下场【chǎng】景:

嵌入式系统【tǒng】:如 Arduino、ESP8266、Raspberry Pi 等微控【kòng】制器和单板计算机【jī】。

工业自动化设备:如 PLC(可【kě】编程【chéng】逻【luó】辑【jí】控制器)、传感器、执行器【qì】等。

家庭自动化系统:如智能家居设备和控制系统。

能源管理:电力系统中的数据采集和监控。

楼宇自控:用于空调、照明等系统的集成控制。

水处理:对水处理设备的运行状态进行监控和管理。

后记

这个系列,物联网协议进行到了【le】尾声【shēng】,这【zhè】篇【piān】写 Mudbus,下【xià】面会写【xiě】 MQTT、CoAP、OPC,都是重头戏。

参考文献

本文由 @跃曰 原创发【fā】布于人人【rén】都【dōu】是【shì】产品经【jīng】理。未经作者许【xǔ】可,禁止转载。

题图来自Unsplash,基于CC0协议。

该文观点仅代表作者本人,人人【rén】都是【shì】产品经理平台仅提供【gòng】信息【xī】存储空间【jiān】服【fú】务。

标签: #求生之路2mod冲突代码