【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 的 RS485 进阶用法之使用 Modbus 协议实作( 上 )

前言

世平集团针对 RS485 相关技术整理了一系列博文,下图为详细的博文索引架构;笔者希望能够透过这些博文协助大家更了解如何在 i.MX8 相关平台上使用 RS485,未来笔者也会持续更新此系列的相关博文还恳请支持!而本篇博文会针对 RS485 相关技术索引架构中的【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 的 RS485 进阶用法之使用 Modbus 协议实作( 上 ) 这篇文章做介绍。文章中会针对 RS485 的 Modbus 协议与 i.MX8 相关平台的关系做粗略叙述,看完本篇博文后相信各位读者们会“对 Modbus 的协议更加认识”,再来让我们继续看下去吧!

架构1

二. Modbus 概述

Modbus 是由 Modicon 这间公司发表的通讯协定 ( Modicon 已被 Schneider Electric 收购 ) 目前是 Modbus Organization 在维护此协定 ( Modbus Organization 的 Member 众多 Schneider Electric 也是其中一员 )。Modbus 通讯协定的使用在业界已经行之有年,大多应用在工业控制领域上,比方说 PLC ( Programmable Logic Controller ) 系统装置就会使用 Modbus 协定做资料传输。

补充:PLC 是一种电子控制系统可以做到逻辑、时序、计数等控制。( 例如控制马达、闸门开关等 )

本系列博文是使用世平集团自制的 OP-Doflamingo ( i.MX8MQ ) 开发板上的 RS485 界面来与 PC 端做资料传输。以下图 OSI Model 概况图为例,RS485 位于第一层实体层 ( Physical ) 的位置,而 Modbus 运作在第七层应用层 ( Application ) 的位置。接着下一篇博文【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 的 RS485 进阶用法之使用 Modbus 协议实作( 下 ) 将会演示“如何在 i.MX8MQ 平台上使用 Modbus 协议与 PC 端互传资料”。再请各位读者继续看下去吧!

图片参考自 http://jamod.sourceforge.net/kbase/protocol.html

OSI

a. Master 与 Salve 架构概述

Modbus 走的是 Master ( Client ) / Slave ( Server ) 架构 ( 关于 Client / Server 的定义稍后会再做解释 ),在 Modbus协定中 Slave 无法主动发起通讯,Slave 一定要收到 Master 的讯息才有机会送出资料 ( 请参阅下图 ) 。因为这个缘故 Master ( Client ) 设备通常只会有一个,其他都是 Slave ( Server ) 设备。 

补充:Master / Client 角色可能是一台 PC 或是一台资料采集机器之类的。

图片参考自 http://jamod.sourceforge.net/kbase/protocol.html

request

有了 Master 通常只有一个其他都是 Slave 这个观念之后,再用 Client 与 Server 的角度去想;由于 Modbus 多数设备就像 Server 一样处于被动的状态,当 Client 要求资料时 Server 才会有所回应。所以 Master 同等于 Client 而 Slave 同等于 Server。

以下图片刻划了 Master ( Client ) 与 Slave ( Server ) 的架构关系,此图来自 http://www.xuan.idv.tw/wordpress/?p=2427 这篇文章。笔者觉得这篇文章叙述的相当清楚在此借镜其内容的一部分描述给各位读者知道。

图片来自 http://www.xuan.idv.tw/wordpress/?p=2427
架构2

b. 传输模式概述

Modbus 的实体传输界面可以是乙太网路或 Serial Port ( 本篇博文使用 RS485 ),传输模式则分为 TCP ( Transmission Control Protocol )、ASCII ( American Standard Code for Information Interchange )、RTU ( Remote Terminal Unit ) 这 3 种模式;其中 ASCII 与 RTU 模式都是使用 Serial Port 来做资料传输,ASCII 与 RTU 的差异是校验方式的不同;ASCII 是采用 LRC ( Longitudinal Redundancy Check ) 校验方式,而 RTU 是采用 CRC ( Cyclic Redundancy Check ) 校验方式 ( 笔者整理了下表帮助厘清 ) 。值得一提的是在同一个 Modbus 网路上的设备都必须选择一样的传输界面 ( 比如说整个网路都是用 Serial Port 来做传输 )。

补充:假设选择在 Serial 网路下做资料传输,请记得 Baud Rate 与 Parity 等设定都要设置成一致。

Mode

补充:RTU 是 Remote Terminal Unit 的简写,可以用来监控 Remote 现场的资料并且将资料传送回 Master。

本篇博文主要是用 Modbus RTU 传输模式来与 Slave ( Server ) 做资料传送,接着让我们来看一下 Modbus RTU 资料传输的 Format 吧!在 Modbus 协议中一笔资料是一个 Frame,一个 Frame 中包含了 Start、Address、Function Code、Data、CRC ( Error Check ) 与 End 等资讯。

在这稍微提及一下 ADU ( Application Data Unit ) 与 PDU ( Protocol Data Unit ) 这两个名词 ( 可参考下图 ),它们的定义如下:

ADU = Address + PDU + CRC

PDU = Function code + Data

ADU

这里先针对 Address 与 Function Code 做简单叙述:

1. Address 指的是 Slave Address 或 Slave ID ( 每个 Slave 都应该要有属于自己的 Address 或 ID )。
如果 Address 是 0 代表广播模式,值得一提的是 Slave ( Server ) 通常都会针对收到广播有所动作,但是为了避免 Bus 资源互抢问题发生 Slave 端不会加以回应!

2. Function Code 指的是要向 Server 表明做哪种动作。
较常用的 Function Code 有 0x03、0x06、0x16 等,以下图片是网路上找到的 Function Code 定义。每个 Function Code 都有自己定义的功能,以 0x03 来说它的定义是可以读取多个暂存器 ( 本篇博文范例也是使用 0x03 Function Code 实作 )。

图片来自 https://en.wikipedia.org/wiki/Modbus#Frame_formats

Func_code

以下会介绍 Modbus RTU 模式中,“Master 读取资料”与 “Slave 回复资料”的方式,笔者将透过以下例子带各位读者解析封包 Format ( 本范例使用的 Function Code 是 0x03;稍早有提到 0x03 Function Code 定义的功能为读取多个暂存器 ) 。

1. Master ( Client ) 读取资料 Format:
设备 ID ( Slave Address ) + 0x03 + 读取资料的起始位置 ( 1 Word ) + 读取的资料数量 ( 1 Word ) + CRC16 ( 16 Bit )

2. Slave ( Server ) 回复资料 Format:
设备 ID ( Slave Address ) + 0x03 + 回复的资料数量 ( 1 Byte ) + 第 1 笔资料 ( 1 Word ) + 第 2 笔资料 ( 1 Word ) + 第 N 笔资料 ( 1 Word ) + CRC16 ( 16 Bit )

了解 Format 后接着让我们看看实际范例吧!

Master ( Client ) 送出 01 03 00 00 00 0A C5 CD ( 这里出现的数字都是 16 进制唷! )

Slave ( Server ) 回应 01 03 14 00 00 00 00 00 02 00 00 00 64 00 00 00 00 00 00 00 22 00 7B 2A 7E ( 这里出现的数字也是 16 进制唷! )

Master ( Client ) 读取资料的粗略说明如下:
Master ( Client ) 对 Slave Address 是 0x01 的设备发出读取多个暂存器的请求 ( 0x03 ),资料从 0x00 位置开始读取,要读取的资料数量为 10 ( 0x0A ) 笔资料。

Client

Slave ( Server ) 回复资料的粗略说明如下:
Slave ( Server ) 对 Master ( Client ) 做出回应,Slave Address 是 0x01、Function Code 是 0x03、回复的资料数量是 20 ( 0x14 ) 个 Byte ( 就是 10 个 Word ) 分别是:
0x00 0x00 ( 第 1 笔资料 )

0x00 0x00 ( 第 2 笔资料 )
0x00 0x02 ( 第 3 笔资料 )
0x00 0x00 ( 第 4 笔资料 )
0x00 0x64 ( 第 5 笔资料 )
0x00 0x00 ( 第 6 笔资料 )
0x00 0x00 ( 第 7 笔资料 )
0x00 0x00 ( 第 8 笔资料 )
0x00 0x22 ( 第 9 笔资料 )
0x00 0x7B ( 第 10 笔资料 )

Master

看到这里不知道各位读者们是否对 Modbus 的传输格式更加认识了呢?本篇博文将使用世平集团自制的 OP-Doflamingo ( i.MX8MQ ) 开发板与 PC 端做 Modbus 协议的资料传输 ( 传输以上叙述的资料 ),接着再让我们继续看下去吧!


三. 让 i.MX8MQ 平台与 PC 透过 Modbus 协议传递资料架构介绍

a. i.MX8MQ 平台 与 PC 间的 RS485 架构叙述

稍早有介绍到 Modbus 的实体层可以使用 Serial Port 或是 TCP 来做资料传输,而本篇博文选择使用 Serial ( RS485 ) 界面做为实体传输资料的接口。以下为本篇博文 RS485 实际硬体接线架构;透过此图我们可以了解板端 OP-Doflamingo ( i.MX8MQ ) 是如何透过 RS485 与 PC 端连接的。

ARH1

b. i.MX8MQ 平台 与 PC 的 Master / Slave 关系叙述

稍早有介绍到 Master ( Client ) 端通常只会有一个,而 Salve ( Server ) 则可以有多个。当 Master ( Client ) 发出 Request 后,Slave ( Server ) 才会做出 Response。本篇博文将会在 OP-Doflamingo ( i.MX8MQ ) 板端与 PC 端各自安装程式来 Demo Modbus 的资料传输 ( 板端的程式需要编译、PC 端的程式需要安装,后续章节会再介绍 ) 。如下图所示,OP-Doflamingo ( i.MX8MQ ) 扮演的角色是 Master ( Client ),而 PC 的角色是 Slave ( Server );此范例利用 OP-Doflamingo ( i.MX8MQ ) 板端的程式会去跟 PC 端要资料回来并显示在 OP-Doflamingo ( i.MX8MQ ) 开发板的 Console 画面上。

arh2

好啰! 本篇博文主要是针对 Modbus 的资料格式与 OP-Doflamingo ( i.MX8MQ ) 和 PC 的角色 ( Master or Slave )做粗略叙述,实际的 Modbus 协议资料传输实作还请各位读者参考下一篇博文【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 的 RS485 进阶用法之使用 Modbus 协议实作( 下 ) 做了解!

四. 结语

世平集团针对 RS485 相关技术整理了一系列博文,而本篇文章是以世平集团自行制作的 OP-Doflamingo ( i.MX8MQ ) 开发板为例子“示范如何与 PC 端透过 RS485 并使用 Modbus 协议做资料的传输”,希望本篇文章的内容可以让各位读者对 Modbus 协议有更深入的体会,若未来读者们有 RS485 或 Modbus 的相关问题欢迎随时与世平集团做讨论,之后笔者将会继续撰写“Modbus 协议实作”相关博文,请各位读者拭目以待。

五. 参考文章
[1] https://zh.wikipedia.org/wiki/OSI%E6%A8%A1%E5%9E%8B
[2] https://zh.wikipedia.org/wiki/Modbus
[3] https://zh.wikipedia.org/wiki/%E5%8F%AF%E7%BC%96%E7%A8%8B%E9%80%BB%E8%BE%91%E6%8E%A7%E5%88%B6%E5%99%A8
[4] https://modbus.org/about_us.php
[5] https://dotblogs.com.tw/Leo_CodeSpace/2018/12/26/185411
[6] https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE
[7] https://zh.wikipedia.org/wiki/ASCII
[8] https://makerpro.cc/2019/08/modbus-protocol/
[9] http://www.xuan.idv.tw/wordpress/?p=2427
[10] https://www.easyatm.com.tw/wiki/modicon
[11] https://www.deltaww.com/zh-tw/products/PLC-Programmable-Logic-Controllers/ALL/
[12] https://www.digikey.tw/zh/blog/what-is-a-plc
[13] https://twgreatdaily.com/MA1JrG4BMH2_cNUgIH_w.html
[14] https://zh.wikipedia.org/wiki/%E8%BF%9C%E7%A8%8B%E7%BB%88%E7%AB%AF%E8%A3%85%E7%BD%AE
[15] https://www.796t.com/content/1543472822.html
[16] https://zh.wikipedia.org/wiki/%E5%86%97%E4%BD%99%E6%A0%A1%E9%AA%8C
[17] https://www.accus.com.tw/msg/msg25.html
[18] https://www.anybus.com/zh/products/gateway-index/anybus-communicator/serial-modbus-rtu
[19] http://jamod.sourceforge.net/kbase/protocol.html
[20] https://www.researchgate.net/figure/MODBUS-Protocol-PDU-and-ADU_fig2_281692567
[21] https://www.gridconnect.com/blogs/news/modbus-in-a-nutshell
[22] https://en.wikipedia.org/wiki/Modbus#Frame_formats
[23] https://blog.softwaretoolbox.com/opc-modbus-function-codes
[24] https://www.ni.com/zh-tw/innovations/white-papers/14/the-modbus-protocol-in-depth.html

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论