本文为Modbus、MQTT的学习笔记。摘抄自网络,用于自己学习。
Windows虚拟串口 Null-modem emulator
虚拟串口软件可以模拟硬件串口设备,方便进行调试。
Null-modem emulator是一款开源的Windows系统内核模式虚拟串行端口驱动程序,允许创建无限数量的虚拟COM端口对以及使用任意端口对连接两个基于COM端口的应用程序。每个COM端口对提供两个COM端口,从一个端口向另一个端口的输出对那个端口来说是输入,反之亦然。
其下载地址如下:
https://sourceforge.net/projects/com0com/
下载完成后解压运行Setup_com0com_v3.0.0.0_W7_x64_signed.exe(或Setup_com0com_v3.0.0.0_W7_x86_signed.exe),按照默认配置安装即可。驱动安装完成后打开设备管理器可以看到已安装的com0com虚拟设备信息。
使用方法:
1.有图形界面,直接连线操作。
2.命令行方式:
安装后开始菜单下会有com0com/setup command prompt
可以启动一个命令行:
输入help
获得帮助信息
比如说要连接COM5和COM6
可以输入命令:install PortName=COM5 PortName=COM6
这样串口5发送的数据就会被串口6接收。反过来也是一样的。
不能重复安装相同的端口,需要重新安装时可以先发送uninstall
命令卸载所有端口。
Modbus
Modbus 使用一种简单的 Master and Slave 主从协议进行通信。客户机作为主站,向服务器发送请求;服务器(从站)接到请求后,对请求进行分析并作出应答。一般使用上,监控系统 (HMI) 都为 Master,而 PLC、电表、仪表等都为 Slave。
在Modbus网络上通信,每个控制器必须要知道他们的设备地址,同时master也只有通过相应的地址传达指令。Modbus协议在一根通信线上使用应答式连接(半双工),协议只允许在主计算机和终端设备之间,而不允许独立的设备之间的数据交换。
RTU传输协议
注意:信息帧长度最大允许长度为256个字节。
传输方式:以RTU模式在Modbus总线上进行通讯时,信息中的每8位字节分成2个4位16进制的字符,每个信息必须连续传输与Modebus 协议– RTU方式相兼容的传输方式
代码系统:8位二进制、十六进制数0…9,A…F;消息中的每个8位域都是一个两个十六进制字符组成
单个字节:1个起始位;8个数据位,最小的有效位先发送;1个奇偶效验位(或者无);1个停止位(有校验位),2个Bit(无校验位)
错误检测域:CRC(循环冗长检测)
Modbus主站和从站的区别
- Modbus主站的特点和功能
1.通信请求发起: 主站主动向从站发送读取或写入数据的请求,并等待从站响应。
2.控制通信流程: 管理通信流程和数据传输顺序。
3.管理从站: 监控所有连接的从站,配置和控制从站。
4.多从站支持: 可以同时与多个从站通信,实现多站点数据交换。
5.数据处理功能: 对从站返回的数据进行解析,以满足应用需求。 - Modbus从站的特点和功能
1.响应主站请求: 被动接收主站请求并提供数据。
2.数据访问接口: 提供数据访问接口,允许主站读取或写入数据。
3.数据存储管理: 管理自身数据存储和寄存器,包括读取、写入和更新操作。
4.多数据类型支持: 可处理不同类型的数据,如线圈、寄存器等。
5.状态监测: 实时监测状态,报告任何异常情况。 - 主站和从站的区别
1.通信发起方: 主站主动发起通信请求,从站响应请求。
2.控制权: 主站控制通信流程和数据传输顺序,从站被动等待主站请求。
3.设备类型: 主站是控制器或上位机,负责系统控制; 从站为传感器、执行器等实际设备。
4.数量限制: Modbus网络可有多个从站,但只一个主站。
5.功能差异: 主站功能更多,如数据处理、远程配置; 从站主要提供数据访问和响应。模拟器
模拟器 Modbus Poll 就是 Master,Modbus Slave 就是 Slave。
官网下载软件安装包
https://www.modbustools.com/download.html
一个 ModbusPollSetup64Bit,和 ModbusSlaveSetup64Bit 双击一路下一步即可。
Modbus 主机仿真器,用于测试和调试 Modbus 从设备。该软件支持 ModbusRTU、ASCII、TCP/IP。用来帮助开发人员测试 Modbus 从设备,或者其它 Modbus 协议的测试和仿真。它支持多文档接口,即,可以同时监视多个从设备 / 数据域。每个窗口简单地设定从设备 ID,功能,地址,大小和轮询间隔。你可以从任意一个窗口读写寄存器和线圈。如果你想改变一个单独的寄存器,简单地双击这个值即可。或者你可以改变多个寄存器 / 线圈值。提供数据的多种格式方式,比如浮点、双精度、长整型(可以字节序列交换)。
Modbus 从设备仿真器,可以仿真 32 个从设备 / 地址域。每个接口都提供了对 EXCEL 报表的 OLE 自动化支持。主要用来模拟 Modbus 从站设备, 接收主站的命令包, 回送数据包。帮助 Modbus 通讯设备开发人员进行 Modbus 通讯协议的模拟和测试,用于模拟、测试、调试 Modbus 通讯设备。可以 32 个窗口中模拟多达 32 个 Modbus 子设备。与 Modbus Poll 的用户界面相同,支持功能 01, 02, 03, 04, 05, 06, 15, 16, 22 和 23,监视串口数据。
Modbus的四个寄存器种类:线圈寄存器、离散输入寄存器、保持寄存器、输入寄存器,从寄存器角度理解了对应功能码。下面列出常用功能码,具体如下
代码 | 中文名称 | 寄存器 PLC 地址 | 位操作/字操作 | 操作数量 |
---|---|---|---|---|
01 | 读线圈状态 | 00001-09999 | 位操作 | 单个或多个 |
02 | 读离散输入状态 | 10001-19999 | 位操作 | 单个或多个 |
03 | 读保持寄存器 | 40001-49999 | 字操作 | 单个或多个 |
04 | 读输入寄存器 | 30001-39999 | 字操作 | 单个或多个 |
05 | 写单个线圈 | 00001-09999 | 位操作 | 单个 |
06 | 写单个保持寄存器 | 40001-49999 | 字操作 | 单个 |
15 | 写多个线圈 | 00001-09999 | 位操作 | 多个 |
16 | 写多个保持寄存器 | 40001-49999 | 字操作 | 多个 |
Python实现Modus通信
使用pymodbus用于Modbus通信,参考https://pymodbus.readthedocs.io/en/dev/source/examples.html 。
pymodbus是基于BSD开源协议的一个的Modbus协议Python库。 它的功能十分强大,实现了Modbus协议中约定的所有功能,并且对通讯主机以同步及异步(asyncio、tornado、twisted)的方式进行了实现, 在拥有不错的性能的同时,也为Python开发者在构建Modbus协议应用时,对应用功能进行额外拓展提供了更多可能。
使用modbus_tk,参考Python_ModbusRTU通讯Demo - wangxiaobei2019 - 博客园。
MQTT
MQTT是基于二进制消息的发布/订阅编程模式的消息协议,最早由IBM提出的,如今已经成为OASIS规范。由于规范很简单,非常适合需要低功耗和网络带宽有限的IoT场景。
MQTT 协议原理
基于发布/订阅模式的 MQTT 协议中有三种角色:发布者(Publisher)、代理(Broker)、订阅者(Subscriber)。发布者向代理发布消息,代理向订阅者转发这些消息。通常情况下,客户端的角色是发布者和订阅者,服务器的角色是代理,但实际上,服务器也可能主动发布消息或者订阅主题,客串一下客户端的角色。
为了方便理解,MQTT 传输的消息可以简化为:主题(Topic)和载荷(Payload)两部分:
Topic,消息主题,订阅者向代理订阅主题后,一旦代理收到相应主题的消息,就会向订阅者转发该消息。
Payload,消息载荷,订阅者在消息中真正关心的部分,通常是业务相关的。
MQTT 协议根据主题来转发消息。主题通过/
来区分层级,类似于 URL 路径。
主题支持以下两种通配符:+ 和 #
。
- 注意:通配符主题只能用于订阅,不能用于发布。
MQTT 协议基础概念
参考MQTT 协议入门:基础知识和快速教程 | EMQ
- 客户端 (Client)
使用 MQTT 协议的程序或设备。它可以
打开连接到服务端的网络连接
发布应用消息给其它相关的客户端
订阅以请求接受相关的应用消息
取消订阅以移除接受应用消息的请求
关闭连接到服务端的网络连接 - 服务器(Server)
在发送消息的客户端与已订阅的客户端之间充当中介角色的程序或设备,它可以
接受来自客户端的网络连接
接受客户端发布的应用消息
处理客户端的订阅和取消订阅请求
转发应用消息给符合条件的已订阅客户端
关闭来自客户端的网络连接 - 使用MQTT
EMQX 是一款开源的大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计。
Mosquitto是用C语言实现MQTT协议的Broker。是一款实现了消息推送协议 MQTT v5.0, 3.1.1, 3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单。
- Node
参考Nodejs+MQTT+espjs+vue改版实现对开发板的通信 - 掘金
MQTT.js 是一个开源的 MQTT 协议的客户端库,使用 JavaScript 编写,主要用于 Node.js 和 浏览器环境中。是目前 JavaScript 生态中使用最为广泛的 MQTT 客户端库。
使用aedes建立MQTT服务。 - Python
hbmqtt 是一个开源的基于 Python 语言的 MQTT Broker 软件。
paho-mqtt 实现客户端与 MQTT 服务器的连接、订阅、取消订阅、收发消息等功能。paho-mqtt
是目前 Python 中使用较多的 MQTT 客户端库,它在 Python 2.7 或 3.x 上为客户端类提供了对 MQTT v3.1 和 v3.1.1 的支持。它还提供了一些帮助程序功能,使将消息发布到 MQTT 服务器变得非常简单。