边缘智能系统:基于Greengrass的Modbus数据采集与处理
1. 场景搭建
我们的示例解决方案架构简单,与常见的应用场景相符。核心活动集中在架构的第二层,聚焦于边缘计算和应用。以下是数据流动和组件触发的详细步骤:
1.
请求数据
:Modbus Request组件是一个自定义Python函数,以连续循环方式运行。每隔几分钟触发一次消息,告知Modbus组件查询PLC并获取数据。
2.
查询PLC
:Modbus TCP组件根据Modbus Request组件的请求,通过Modbus TCP协议查询PLC,并等待结果。
3.
PLC响应
:PLC通过Modbus TCP组件返回响应,并将结果作为新消息发布到MQTT代理。
4.
响应处理
:收到代理的响应后,有两个处理选项:
-
发送到IoT Core
:使用现成组件将消息从Greengrass消息总线发送到IoT Core,可配置发送所有消息或特定消息。数据到达云端后,可采用标准IoT方法进行处理和分析。
-
本地处理响应
:可选地构建自定义组件Modbus Response,部署在边缘设备上,监听并处理响应。
这些步骤逻辑上分为数据检索、转换和推送阶段,由自定义或配置的组件处理,并部署到Greengrass本地运行。每个步骤由单独的组件处理,协同工作以实现数据流动。
数据流动步骤总结
| 步骤 | 操作 | 组件 |
|---|---|---|
| 1 | 请求数据 | Modbus Request |
| 2 | 查询PLC | Modbus TCP |
| 3 | PLC响应 | Modbus TCP |
| 4A | 发送到IoT Core | 现成组件 |
| 4B | 本地处理响应 | Modbus Response |
数据流动mermaid流程图
graph LR
A[Modbus Request] -->|请求数据| B[Modbus TCP]
B -->|查询PLC| C[PLC]
C -->|响应| B
B -->|发布消息| D[MQTT代理]
D -->|选项A| E[IoT Core]
D -->|选项B| F[Modbus Response]
2. Modbus数据
Modbus协议是工业控制中历史悠久的数据通信标准。为提供实际示例,我们使用Modbus模拟器(如pyModSlave)代替PLC进行测试和开发。不同的Modbus模拟器或PLC可能在寄存器寻址上有所不同,需要通过试验和错误确定正确的请求地址。Modbus定义了多种寄存器类型,如线圈(Coil)、离散输入寄存器(Discrete Input Registers)、输入寄存器(Input Registers)和保持寄存器(Holding Registers),其地址由协议定义,但可能因设备而异。
Modbus寄存器类型
| 寄存器类型 | 读写属性 | 描述 |
|---|---|---|
| 线圈(Coil) | 读写 | 二进制字段,存储开关值,1位地址 |
| 离散输入寄存器 | 只读 | 类似线圈,但为只读地址 |
| 输入寄存器 | 只读 | 用于存储较大数据值 |
| 保持寄存器 | 读写 | 用于存储较大数据值,可读写 |
3. Greengrass权限
当Greengrass需要在AWS账户中执行操作(如将日志写入CloudWatch或在Secrets Manager中查找值)时,需要相应的权限。AWS采用先拒绝的安全策略,可通过Greengrass服务角色添加策略,允许核心设备访问AWS账户服务。例如,从边缘设备向IoT Core发布消息时,可通过AWS IoT的设置确定服务账户。
4. 组件通信与部署
4.1 组件部署步骤
为从Modbus模拟器拉取数据并发送到云端的IoT Core,我们将构建和部署以下组件:
1.
Modbus Request组件
:构建并部署该组件,向Modbus从设备请求数据。
2.
Modbus TCP组件
:部署该功能,查询模拟器并检索数据。
3.
Modbus Response组件
:考虑两种选项来检索模拟器数据并开始处理。
4.2 Modbus Request组件
代码实现
Modbus Request组件由Python代码(
modbusrequest.py
)和部署描述文件(
Modbusrequest.json
)组成。以下是
modbusrequest.py
的代码示例:
import sys
import datetime
import time
import logging
import awsiot.greengrasscoreipc
from awsiot.greengrasscoreipc.model import (
PublishToTopicRequest,
PublishMessage,
BinaryMessage
)
# Setup logging to stdout
logger = logging.getLogger(__name__)
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
FUTURE_WAIT_TIME = 10
SLEEP_TIME = 60
ipc_client = awsiot.greengrasscoreipc.connect()
topic = "modbus/request/conveyer"
message = '{ "id": "TestRequest", "function": "ReadCoils", "address": 00001, "quantity": 10 }'
logger.debug("topic: " + topic)
logger.debug("message: " + message)
request = PublishToTopicRequest()
request.topic = topic
publish_message = PublishMessage()
publish_message.binary_message = BinaryMessage()
publish_message.binary_message.message = bytes(message, "utf-8")
request.publish_message = publish_message
while True:
operation = ipc_client.new_publish_to_topic()
operation.activate(request)
future = operation.get_response()
future.result(FUTURE_WAIT_TIME)
logger.info(message)
print("going to sleep")
time.sleep(SLEEP_TIME)
代码解释
-
导入必要模块
:导入
awsiot.greengrasscoreipc和相关模型,用于通过IPC发送消息。 - 设置日志和等待时间 :设置日志记录和消息发送的等待时间。
-
定义消息内容
:定义要发送的消息,这里是一个
ReadCoils请求。 -
创建请求对象
:创建
PublishToTopicRequest对象,并设置主题和消息内容。 - 循环发送消息 :使用无限循环,每隔60秒发送一次消息,并等待响应。
部署描述文件(Modbusrequest.json)
{
"RecipeFormatVersion": "2020-01-25",
"ComponentName": "com.environmentsense.modbus.modbusrequest",
"ComponentVersion": "1.0.0",
"ComponentDescription": "modbus TCP Request component.",
"ComponentPublisher": "EnvironmentSense",
"ComponentConfiguration": {
"DefaultConfiguration": {
"Message": "request",
"accessControl": {
"aws.greengrass.ipc.pubsub": {
"com.environmentsense.modbus.ModbusRequest:pubsub:1": {
"policyDescription": "Allows access to publish to topic.",
"operations": [
"aws.greengrass#PublishToTopic"
],
"resources": [
"modbus/request/conveyer"
]
}
}
}
}
},
"Manifests": [
{
"Platform": {
"os": "linux"
},
"Lifecycle": {
"Install": {
"script": "python3 -m pip install --user awsiotsdk"
},
"Run": {
"script": "python3 -u {artifacts:path}/modbusrequest.py '{configuration:/message}'"
}
}
}
]
}
描述文件解释
- 基本信息 :定义组件的格式版本、名称、版本、描述和发布者。
-
组件配置
:设置默认配置和访问控制策略,允许组件向
modbus/request/conveyer主题发布消息。 - 清单 :指定平台为Linux,定义安装和运行脚本。
4.3 组件部署
组件部署可通过AWS控制台或命令行进行。对于初始开发和测试,建议使用命令行在Greengrass机器上本地工作。可参考AWS IoT Greengrass开发者指南(https://docs.aws.amazon.com/greengrass/v2/developerguide)获取详细信息。使用Visual Studio Code(VS Code)可方便地进行代码编辑、终端命令执行和端口转发,以访问本地Greengrass调试控制台。
部署命令示例
$ sudo /greengrass/v2/bin/greengrass-cli deployment create --recipeDir /home/greengrass/components/recipes --artifactDir /home/greengrass/components/artifacts --merge "com.environmentsense.modbus.modbusrequest=1.0.0"
查看日志命令
$ cd /greengrass/v2/logs/
$ tail -f com.environmentsense.modbus.ModbusRequest.log
4.4 Modbus TCP组件
Modbus TCP组件是开源社区组件,可从https://github.com/awslabs/aws-greengrass-labs-modbus-tcp-protocol-adapter获取。该组件允许使用Modbus TCP协议读取或写入设备数据,但需要Modbus Request组件通过IPC请求告知查询的数据。
组件配置
需要将预编译的
.jar
文件复制到S3文件夹,用于部署到边缘设备。同时,需要根据实际情况定制YAML格式的配方文件,配置Modbus端点的IP地址、端口和设备名称。
配方文件示例
{
"Modbus": {
"Endpoints": [
{
"Host": "192.168.178.34",
"Port": "502",
"Devices": [
{
"Name": "conveyer",
"UnitId": 0
}
]
}
]
},
"accessControl": {
"aws.greengrass.ipc.pubsub": {
"aws.greengrass.labs.ModbusTCP:pubsub:1": {
"policyDescription": "Allows publish to all topics.",
"operations": [
"aws.greengrass#PublishToTopic"
],
"resources": [
"*"
]
},
"aws.greengrass.labs.ModbusTCP:pubsub:2": {
"policyDescription": "Allows subscribe to all topics.",
"operations": [
"aws.greengrass#SubscribeToTopic"
],
"resources": [
"*"
]
}
}
}
}
配置解释
- Modbus端点 :指定Modbus设备的IP地址、端口和设备名称。
- 访问控制 :设置组件的访问权限,允许发布和订阅所有主题。在生产环境中,应根据实际需求锁定权限。
4.5 本地调试控制台
Greengrass部署组件时,会将状态更新到云端,方便查看部署情况。同时,可部署本地调试控制台,通过VS Code的SSH端口转发功能,在本地浏览器中访问(https://localhost:1441/),以查看和编辑部署的组件。
组件部署与调试步骤总结
| 步骤 | 操作 | 命令/方法 |
|---|---|---|
| 1 | 编写组件代码和配方文件 |
编写
modbusrequest.py
和
Modbusrequest.json
|
| 2 | 配置VS Code | 配置SSH连接和端口转发 |
| 3 | 部署组件 |
sudo /greengrass/v2/bin/greengrass-cli deployment create ...
|
| 4 | 查看日志 |
cd /greengrass/v2/logs/; tail -f ...
|
| 5 | 访问调试控制台 | 浏览器打开https://localhost:1441/ |
5. 组件协同工作原理
5.1 数据交互流程
Modbus Request、Modbus TCP和Modbus Response组件协同工作,实现从Modbus模拟器获取数据并发送到IoT Core的功能。其具体的数据交互流程如下:
1. Modbus Request组件定时向
modbus/request/conveyer
主题发布请求消息,请求Modbus TCP组件查询Modbus模拟器的数据。
2. Modbus TCP组件监听
modbus/request/conveyer
主题,接收到请求消息后,根据消息中的指令,通过Modbus TCP协议查询Modbus模拟器。
3. Modbus模拟器响应查询请求,将数据返回给Modbus TCP组件。
4. Modbus TCP组件将接收到的数据发布到MQTT代理。
5. 对于MQTT代理接收到的数据,有两种处理方式:
- 可以使用现成组件将数据发送到IoT Core,以便在云端进行处理和分析。
- 也可以部署自定义的Modbus Response组件,在边缘设备本地处理数据。
数据交互mermaid流程图
graph LR
A[Modbus Request] -->|发布请求消息| B[Modbus TCP]
B -->|查询数据| C[Modbus模拟器]
C -->|返回数据| B
B -->|发布数据| D[MQTT代理]
D -->|选项1| E[IoT Core]
D -->|选项2| F[Modbus Response]
5.2 组件权限与通信
各组件之间的通信主要通过Inter - Process Communication (IPC)实现,使用MQTT协议进行消息的发布和订阅。同时,每个组件都需要相应的权限才能正常工作,例如:
- Modbus Request组件需要有向
modbus/request/conveyer
主题发布消息的权限,在其配方文件的
accessControl
部分进行了配置。
- Modbus TCP组件需要有发布和订阅消息的权限,在其配方文件中也进行了相应的权限设置。
6. 实际应用中的注意事项
6.1 日志管理
在实际应用中,日志管理非常重要。虽然设置日志可以帮助我们跟踪组件的运行状态,但过多的日志数据可能会导致成本增加,尤其是在有多个核心设备的情况下。Greengrass的日志管理规则与开发者常见的规则有所不同,因此需要谨慎处理。建议在AWS账户中添加日志使用的警报,避免因日志数据过多而产生高额费用。
6.2 权限设置
在开发和测试阶段,可以设置较为宽松的权限,以便快速验证功能。但在生产环境中,必须严格锁定组件的权限,只授予组件完成其功能所需的最小权限。例如,Modbus TCP组件在开发阶段可以允许发布和订阅所有主题,但在生产环境中,应根据实际需求限制其可访问的主题。
6.3 设备兼容性
不同的Modbus设备(如PLC、模拟器)可能在寄存器寻址上存在差异。在实际应用中,需要IT和OT人员共同协作,通过试验和错误的方式,确定正确的寄存器地址,并明确该地址对应的数据在现实世界中的含义(元数据)。
7. 总结与展望
7.1 总结
通过本文的介绍,我们了解了如何使用Greengrass组件实现从Modbus模拟器获取数据并发送到IoT Core的功能。具体步骤包括:
1. 搭建场景,明确数据流动的步骤和组件的功能。
2. 了解Modbus协议和相关寄存器类型,使用Modbus模拟器进行测试和开发。
3. 配置Greengrass权限,确保组件能够访问AWS账户的相关服务。
4. 构建和部署Modbus Request、Modbus TCP和Modbus Response组件,实现组件之间的通信和数据交互。
5. 进行组件的部署和调试,使用VS Code和本地调试控制台提高开发效率。
步骤总结表格
| 阶段 | 操作内容 |
|---|---|
| 场景搭建 | 定义数据流动步骤和组件功能 |
| 协议了解 | 掌握Modbus协议和寄存器类型 |
| 权限配置 | 设置Greengrass组件访问AWS服务的权限 |
| 组件开发 | 编写组件代码和配方文件 |
| 部署调试 | 使用命令行和VS Code进行组件部署和调试 |
7.2 展望
随着边缘计算和物联网技术的不断发展,Greengrass在工业控制、智能家居等领域的应用将越来越广泛。未来,可以进一步优化组件的性能,提高数据处理的效率和准确性。同时,可以探索更多的Modbus功能和应用场景,如远程设备控制、实时数据分析等,为用户提供更强大的解决方案。
超级会员免费看
1273

被折叠的 条评论
为什么被折叠?



