亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial Internet of Things >> 物联网技术

将 Modbus 工业传感器与开源 IIoT 网关连接

工业物联网 (IIoT) 应用通常需要一个边缘网关以集成 Modbus 外围设备和其他设备,但实施网关可能既昂贵又耗时。本文提供了工业传感器与开源边缘计算框架接口的案例研究,该框架可以显着简化部署。

工业物联网 (IIoT) 技术发展迅速。远程监控和高级分析领域的 IIoT 应用正在彻底改变企业,并为他们提供模范优势。边缘计算通常直接发生在传感器所连接的设备或物理上靠近传感器的网关设备上。

在工业用例中,许多传感器需要与边缘网关连接,解决方案架构师和开发人员需要决定边缘网关的软件设计和开发,以及如何在设计和开发期间处理来自各种传感器的数据并执行数据分析阶段。在这种情况下,如果没有开源框架,新的软件开发、bug修复可能会耗费大量的精力和成本。

这个由两部分组成的系列中的第一篇文章用用例描述了工业传感器,并概述了边缘网关要求,并讨论了如何使用 EdgeX Foundry(一种用作边缘计算的开源边缘计算框架)来满足边缘网关要求。物理传感和驱动“事物”与信息技术 (IT) 系统之间的中间件(图 1)。


图 1. EdgeX Foundry(来源:www.edgexfoundry.org)

本文提供了工业传感器与 EdgeX 接口以实现边缘计算功能的案例研究。

本案例研究的目的是通过连接工业温度和湿度传感器来评估在 Raspberry Pi 网关上运行的称为 EdgeX Foundry 的边缘计算框架之一。这是高级块和数据流图 案例研究的解释:

点击查看全尺寸图片

图 2. 高级框图(来源:www.edgexfoundry.org)

Modbus

Modbus 是一种开放协议,传输是标准的。与许多专有协议不同,它不需要特定的物理层,因此 Modbus 网络建立在廉价且通用的基础设施上,例如 RS-485 链接。

Modbus 实现了一种非常简单的数据表示方式并且易于理解。它的主要目的只是在 Modbus 主设备和从设备之间移动数据。要移动的数据只有两种,寄存器和线圈。寄存器是 16 位无符号整数,用于存储模拟值,例如温度、湿度和压力值。线圈是用于在 Modbus 内存映射中存储数字值的单个位,通常是状态值,例如开关状态(ON 或 OFF)、电机运行状态(UP 或 DOWN)和阀门状态(OPEN 或 CLOSE)。

它只需要很少的代码空间,通常只有 1K。 RAM 随数据空间的大小而变化。几乎不需要任何 RAM 空间即可实现具有少量数据的简单自动化设备。

非程序员可以很容易地理解 Modbus。制造胶水机、仪表、测量设备等的工程师可以轻松理解线圈/寄存器的概念以及读取和写入它们的简单命令。

通常多台仪器连接到同一个 Modbus 网络。没有仪器支持所有仪器网络协议,但几乎所有仪器都支持Modbus。通过选择 Modbus,您很有可能避免兼容性问题和未来的升级问题。

温度监测

物联网温度监控系统允许行业在基于网络/移动的安全平台上跟踪环境参数,并实时提供即时通知。这些温度传感器数据可以从远端访问。

从温度传感器收集的数据可用于创建统计见解。这将有助于行业提高其仓库和冷库的可靠性。

许多工业用例都使用此应用程序:

对于这些用例,温度和湿度监控应用非常相关。此应用程序需要一个网关来监控温度和湿度。网关需要一个边缘计算框架。这里使用的Modbus传感器、网关和边缘计算框架分别是SHT20工业温湿度传感器、Raspberry Pi 4和EdgeX Foundry。

Edgex 是如何使用的?

使用 Modbus 从站模拟器 (ModbusPal) 进行 Modbus 设备服务验证

ModbusPal 是一个 Modbus 从站模拟器,免费和开源,在 GPL 许可下发布。其目的是提供一个易于使用的界面,能够重现复杂和现实的 Modbus 环境。原生支持TCP/IP,如果电脑安装了RxTx库,则支持串口通信。

ModbusPal 最多可以模拟 247 个 Modbus 从站。每个从站都可以有保持寄存器和线圈。每个寄存器或线圈都可以通过与称为“自动化”的动态值生成器相关联来进行动画处理。

使用 ModbusPal 模拟器和从设备作为功率计来验证 modbus 设备服务是通过以下提到的步骤完成的。同理,我们可以通过温度、湿度和压力传感器等从设备模拟任何支持Modbus的环境。

  1. 设置 ModbusPal 环境,
  2. 添加从设备并配置它们的可寻址、值和自动化,
  3. 在 EdgeX 中发布 Modbus 设备配置文件,
  4. 在 EdgeX 中发布 Modbus 设备,
  5. 向从设备发送数据或启动从设备 (PUT),
  6. 从从设备接收数据 (GET)。
  7. 安装任何可以安装 docker 和 docker-compose 的操作系统。在本示例中,我们使用 Ubuntu 20.04.2 LTS 使用 docker 部署 EdgeX。


图 3. 为 ModbusPal 模拟器设置环境

  1. 添加从设备、配置保持寄存器、输入值和名称并将它们绑定到适当的自动化。


图 4. 在 ModbusPal 模拟器中添加和配置从设备(来源:www.edgexfoundry.org)

  1. 使用 POST 命令发布设备配置文件。
curl –X POST http://
:48081/api/v1/deviceprofile/uploadfile -F file=@ 
 


图 5. 在 EdgeX 中发布设备配置文件

  1. 使用 POST 命令发布设备。使用以下命令作为文件上传或使用截图命令作为内容上传。
curl –X POST http://
:48081/api/v1/device/uploadfile -F “file=@ 
 


图 6. 在 EdgeX 中发布设备

  1. 执行PUT命令发送数据。
curl –X PUT http://
:48082/api/v1/device//command/ -H “Content-Type:application /json” –d '{“”:“”,“”:“”}'      
 


图 7. EdgeX 中的 PUT 命令执行

  1. 执行GET命令接收数据。
curl –X GET http://
:48082/api/v1/device/name//command/Configuration | json_pp 
 

点击查看全尺寸图片

图 8. EdgeX 中的 GET 命令执行

设备配置文件

设备配置文件描述了 EdgeX 系统中的一种设备。由设备服务管理的每个设备都与设备配置文件相关联,设备配置文件根据其支持的操作定义该设备类型。设备配置文件定义了设备的值和操作方法,可以是读或写。设备配置文件由以下标签组成:

  1. 身份证明: 配置文件包含各种标识字段。 Name 字段是必需的,并且在 EdgeX 部署中必须是唯一的。其他字段是可选的 - 它们不被设备服务使用,但可能会出于信息目的而填充,
  2. 设备资源: deviceResource 指定设备内的传感器值,可以单独或作为 deviceCommand 的一部分读取或写入该值。它有一个用于识别的名称和一个用于信息目的的描述,
  3. 设备命令: DeviceCommands 定义对多个同时设备资源的读写访问。每个命名的 deviceCommand 应包含多个 get 和/或 set 资源操作,分别描述读取或写入,
  4. 核心命令: CoreCommands 指定通过 core-command 微服务可用的命令,用于读取和写入设备。 deviceResources 和 deviceCommands 都可以用 coreCommands 表示(coreCommand 的名称指的是 deviceCommand 或 deviceResource 的名称)。

Modbus 温湿度传感器的设备配置文件 (滚动查看完整列表)

名称 :“温度湿度传感器”制造商 :“机器人”模型 :“RKI-4879”标签 :- "SHT20"描述 :《工业级温湿度变送器SHT20传感器高精度监控Modbus RS485》deviceResources :- 名称 :"TemperatureDegC" 描述 :“以摄氏度为单位的室温。” 属性 : { 主表 :“输入寄存器”,起始地址:“2”,原始类型:“INT16”} 属性 : : { 类型 :"Float32", readWrite:"R", scale:"0.1", floatEncoding:"eNotation" } 单位 : { 类型 :"String", readWrite:"R", defaultValue:"degrees celsius" } - 名称 :"HumidityPercentRH" 说明 :“以 %RH 为单位的房间湿度。” 属性 : { 主表 :“INPUT_REGISTERS”,起始地址:“3”,原始类型:“INT16”} 属性 : : { 类型 :"Float32", readWrite:"R", scale:"0.1", floatEncoding:"eNotation" } 单位 : { 类型 :"String", readWrite:"R", defaultValue:"%RH" }deviceCommands :- 名称 :"TemperatureDegC" 获取 : - { 索引 :"1", 操作:"get", deviceResource:"TemperatureDegC" } - 名称 :"HumidityPercentRH" 得到 : - { 索引 :"2", 操作:"get", deviceResource:"HumidityPercentRH" }coreCommands :- 名称 :"TemperatureDegC" 获取 : 路径 :“/api/v1/device/{deviceId}/TemperatureDegC” 响应 :- 代码 :"200" 描述 :“以摄氏度为单位获取温度” expectedValues :["TemperatureDegC"] - 代码 :"503" 描述 :“服务不可用”预期值 :[] - 名称 :"HumidityPercentRH" 得到 : 路径 :“/api/v1/device/{deviceId}/HumidityPercentRH” 响应 :- 代码 :"200" 描述 :“以 %RH 为单位获取湿度” expectedValues :["HumidityPercentRH"] - 代码 :"503" 描述 :“服务不可用”预期值 :[]

1.1.1.1 GPIO 设备的设备配置文件 – 1(红色 LED) (滚动查看完整列表)

名称 :"device-gpio12"制造商 :“江星智能”模式 :"SP-01"标签 :- "gpio12"描述 :"通过命令自动导出 gpio12"deviceResources :- 名称 :"值" 描述 :"设置或获取系统 gpio 值" 属性 : : { 类型 :"Int8", readWrite:"RW", 最小值:"0", 最大值:"1", defaultValue:"0" } 单位 : { 类型 :"String", readWrite:"R", defaultValue:"high:1; low:0" }deviceCommands :- 名称 :"value" 获取 : - { 操作 :"get", deviceResource:"value" } 设置 : - { 操作 :"set", deviceResource:"value", 参数:"0" }coreCommands :- 名称 :"value" : 路径 :"/api/v1/device/{deviceId}/value" 参数名称 :["value"] 回复 :- 代码 :"200" 描述 :"" - 代码 :"500" 描述 :“服务不可用”预期值 :[] 得到 : 路径 :"/api/v1/device/{deviceId}/value" 响应 :- 代码 :"200" 描述 :"" 预期值 :["value"] - 代码 :"500" 描述 :“服务不可用”预期值 :[]

GPIO 设备的设备配置文件 – 2(蓝色 LED) (滚动查看完整列表)

名称 :"device-gpio14"制造商 :“江星智能”模式 :"SP-01"标签 :- "gpio14"描述 :"通过命令自动导出 gpio14"deviceResources :- 名称 :"值" 描述 :"设置或获取系统 gpio 值" 属性 : : { 类型 :"Int8", readWrite:"RW", 最小值:"0", 最大值:"1", defaultValue:"0" } 单位 : { 类型 :"String", readWrite:"R", defaultValue:"high:1; low:0" }deviceCommands :- 名称 :"value" 获取 : - { 操作 :"get", deviceResource:"value" } 设置 : - { 操作 :"set", deviceResource:"value", 参数:"0" }coreCommands :- 名称 :"value" : 路径 :"/api/v1/device/{deviceId}/value" 参数名称 :["value"] 回复 :- 代码 :"200" 描述 :"" - 代码 :"500" 描述 :“服务不可用”预期值 :[] 得到 : 路径 :"/api/v1/device/{deviceId}/value" 响应 :- 代码 :"200" 描述 :"" 预期值 :["value"] - 代码 :"500" 描述 :“服务不可用”预期值 :[]

配置

用于定义设备和调度作业的配置文件。微服务(即 device-modbus)在启动时生成一个相关实例。它包含协议类型、网关名称、协议、地址、端口和路径(单元 ID)等详细信息。

温湿度传感器配置文件 (滚动查看完整列表)

[Writable]LogLevel ='DEBUG'[Service]BootTimeout =30000CheckInterval ='10s'Host ='localhost'ServerBindAddr ='' #空值默认为Service .Host valuePort =49991Protocol ='http'StartupMsg ='设备 modbus 启动'Timeout =5000ConnectRetries =10Labels =[]EnableAsyncReadings =trueAsyncBufferSize =16[Registry]Host ='localhost'Port =8500Type ='consul]falseLogingFile' ='./GPIO.LOG'[Clients] [Clients.Data] Protocol ='http' Host ='localhost' Port =48080 [Clients.Metadata] Protocol ='http' Host ='localhost' Port =48081 [Clients. Logging] Protocol ='http' Host ='localhost' Port =48061 [Device] DataTransform =true InitCmd ='' InitCmdArgs ='' MaxCmdOps =128 MaxCmdValueLen =256 RemoveCmd ='' RemoveCmdArgs ='' ProfilesDir' =UpdateLastConnected =false# 预定义设备[[DeviceList]] Name ='TemperatureHumiditySensor' # 设备配置文件名 Profile ='TemperatureH umiditySensor' Description ='工业级温湿度变送器 SHT20 传感器高精度监控 Modbus RS485' 标签 =[ 'TemperatureHumiditySensor','modbusRTU' ] [DeviceList.Protocols] [DeviceList.Protocols.modbus-rtu] 地址 ='/dev/ ttyUSB0' BaudRate ='9600' DataBits ='8' StopBits ='1' Parity ='N' UnitID ='1' [[DeviceList.AutoEvents]] Frequency ='5s' OnChange =false Resource ='TemperatureDegC' [[DeviceList] .AutoEvents]] 频率 ='5s' OnChange =false 资源 ='HumidityPercentRH'

GPIO 设备配置文件(红色 LED 和蓝色 LED) (滚动查看完整列表)

[Writable]LogLevel ='DEBUG'[Service]BootTimeout =30000CheckInterval ='10s'Host ='localhost'ServerBindAddr ='' #空值默认为Service .Host valuePort =49950Protocol ='http'StartupMsg ='设备 gpio 已启动'Timeout =5000ConnectRetries =10Labels =[]EnableAsyncReadings =falseAsyncBufferSize =16[Registry]Host ='localhost'Port =8500Type ='consuleFile' ='./GPIO.LOG'[Clients] [Clients.Data] Protocol ='http' Host ='localhost' Port =48080 [Clients.Metadata] Protocol ='http' Host ='localhost' Port =48081 [Clients. Logging] Protocol ='http' Host ='localhost' Port =48061 [Device] DataTransform =true InitCmd ='' InitCmdArgs ='' MaxCmdOps =128 MaxCmdValueLen =256 RemoveCmd ='' RemoveCmdArgs ='' ProfilesDir' =UpdateLastConnected =false# 预定义设备[[DeviceList]] Name ="gpio12" Profile ="device-gpio12" Description ="use gpio12" Labels =['gpio1 2'] [DeviceList.Protocols] [DeviceList.Protocols.other] Address ="device-gpio12"[[DeviceList]] Name ="gpio14" Profile ="device-gpio14" Description ="use gpio14" Labels =['gpio14 '] [DeviceList.Protocols] [DeviceList.Protocols.other] 地址 ="device-gpio14"

设置和执行结果

  1. 使用跳线和电阻将 SHT20 工业级温湿度变送器通过 RS485 接口连接到 Raspberry Pi(其中安装了 EdgeX Foundry)到 USB 转换器和 LED,如下图所示。

点击查看全尺寸图片

图 9. 硬件连接细节

    1. 使用 POST 将上面的设备配置文件上传到元数据到 http://localhost:48081/api/v1/deviceprofile/uploadfile 并将文件作为密钥“文件”以表单数据格式添加到正文中,然后创建身份证将被退回。以下示例命令使用 curl 发送请求:
      curl –X POST http://
      :48081/api/v1/deviceprofile/uploadfile -F file=@ 
       
    2. 确保所有必需的设备服务都已启动并正在运行。


图 10. 验证活动设备服务

c.将带有 POST 的设备添加到 http://localhost:48081/api/v1/device,主体将如下所示:(滚动查看完整列表)

curl -X POST http://localhost:48081/api/v1/device  -H "Content-Type:application/json" -d '{ "name"  :"TemperatureHumiditySensor", "描述" :"工业级温湿度变送器SHT20传感器高精度监控Modbus RS485", "adminState" :"UNLOCKED", "operatingState" :"启用", "协议" :{ "modbus-rtu" :{“地址” :"/dev/ttyUSB0", "波特率"  :"9600", "数据位"  :"8", "StopBits"  :"1", "奇偶校验"  :"N", "UnitID"  :"1" } }, "标签" :[ "TemperatureHumiditySensor", "modbusRTU" ], "服务" :{"name":"edgex-device-modbus"},“个人资料” :{"name":"TemperatureHumiditySensor"}, "autoEvents" :[ {“频率” :"5s", "onChange" :false,“资源” :"TemperatureDegC" }, { "频率" :"5s", "onChange" :false,“资源” :"HumidityPercentRH" } ]}'

可以使用 POST 命令或作为 configuration.toml 文件的一部分添加设备。

  1. 设备服务将每 5 秒从传感器中提取一次温度和湿度数据。接收到的数据将发送到核心服务并存储在Redis服务器中。
2021/03/02 05:03:33 modbus:发送 01 04 00 01 00 01 60 0a2021/03/02 05:03:33 modbus:收到 01 04 02 01 4d 78 95

表 1. 解码 Modbus 请求和响应

发送 解码 收到 解码 01Slave ID 01Slave ID04Function Code 04Function Code00 01寄存器地址 02Bytes Count00 01寄存器数量 01 4dData (0x014d =333)60 0aCRC 78 95CRC
  1. 核心服务将数据发送到应用服务。下图显示了核心服务中的数据。


图 11. 存储在核心服务中的温度和湿度数据

  1. 应用服务将数据发送到云端。这里我们使用 IBM 云。下图显示了 IBM 云中的数据。

点击查看全尺寸图片

图 12. IBM Cloud 中从应用服务发送的温度和湿度数据

  1. 在从北向南的另一侧,应用服务将数据发送到规则引擎(这里我们使用 Kuiper 规则引擎)。设置了以下规则。

表 2. 规则

规则号 规则 LED 状态 规则 #1TemperatureDegC> 30°CRed1 (ON)Rule #2TemperatureDegC <30°CRed0 (OFF)Rule #3TemperatureDegC> 28°CBlue0 (OFF)Rule #4TemperatureDegC <28°CBlue1 (ON)


图 13. 规则 #1


图 14. 应用规则的脚本

  1. 只要达到阈值温度,规则引擎就会向核心命令发送命令。
  2. 核心命令启动 GPIO 设备服务以根据阈值温度打开或关闭 LED。一旦我们运行规则,规则就会被应用。这里 gpio12 表示红色 LED,gpio14 表示蓝色 LED。

a.每当温度高于 30°C 时,红色 LED 就会发光。

规则引擎日志:

level=info msg="sink result for rule red_led_on:[{\"TemperatureDegC\":32.3}] 文件="sinks/log_sink.go:16"rule=red_led_onlevel=info msg="sink 规则 blue_led_off:[{\"TemperatureDegC\":32.3}] file="sinks/log_sink.go:16"rule=blue_led_off 

GPIO:

root@ubuntu:~# cat /sys/class/gpio/gpio12/value1root@ubuntu:~# cat / sys/class/gpio/gpio14/value0

b.当温度低于 28°C 时,蓝色 LED 会发光。

规则引擎:

level=info msg="sink result for rule red_led_off:[{\"TemperatureDegC\":27.2}] 文件="sinks/log_sink.go:16"rule=red_led_offlevel=info msg="sink 规则 blue_led_on:[{\"TemperatureDegC\":27.2}] file="sinks/log_sink.go:16"rule=blue_led_on 

GPIO:

root@ubuntu:~# cat /sys/class/gpio/gpio12/value0root@ubuntu:~# cat / sys/class/gpio/gpio14/value1
  1. 最后,GPIO 服务将使 LED 开启或关闭。

结论

工业需要连接传感器和执行器并长期监测和控制环境参数。 EdgeX 框架使温度和湿度监测应用程序具有多功能性,使工业、数据中心和实验室中的受控环境成为可能。将任何其他工业传感器与 EdgeX Foundry 接口也将与工业级温度和湿度传感器类似。这将节省大量开发人员的工作量、开发成本和延迟,因为 EdgeX 框架处理数据存储、分析、设备管理和云连接,并且网关非常靠近传感器。

缩写词

缩写 扩展 AOFAppend只有FileAPIApplication程序接口AWSAmazon网络ServicesBACnetBuilding自动化和控制NetworkBLEBluetooth低EnergyCURLClient统一资源LocatorGPIOGeneral通用输入OutputHTTPHypertext转移ProtocolIBMInternational业务MachinesIIoTIndustrial互联网ThingsITInformation TechnologyLEDLight发光DiodeLTSLong期限SupportM2MMan的ThingsIoTInternet来MachineMQTTMessage队列遥测TransportRDBRedis DatabaseRedisREmote字典ServerRESTRepresentational国家TransferRS-485Recommended标准 - 485SCADASupervisory控制和数据采集SQL结构化查询语言TCP/IP传输控制协议/互联网协议

物联网技术

  1. 开放式 DDS 与 RTI DDS 软件
  2. 开源术语介绍
  3. 思科通过新路由器将企业和工业边缘连接在一起
  4. AT&T 与 Tech Mahindra 合作开发新的开源 AI 平台
  5. 随着 4.0 工业革命提高质量标准
  6. 软件风险:保护物联网中的开源
  7. 通过边缘分析升级工业 4.0
  8. 推进边缘计算,IIC 加入 OpenFog
  9. 开源物联网开发工具与供应商支持的工具
  10. 边缘开源的需求(电子书)
  11. 开源推动物联网和边缘计算的采用
  12. 如何开始在边缘进行 AI 推理