22、边缘智能系统:基于Greengrass的Modbus数据采集与处理

边缘智能系统:基于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功能和应用场景,如远程设备控制、实时数据分析等,为用户提供更强大的解决方案。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值