EdgeX Foundry - Modbus 设备服务

文章目录

    • 一、Modbus 设备服务
      • 1.概述
      • 2.协议属性
      • 3.数据类型转换
        • 3.1.读命令
        • 3.2.写命令
        • 3.3.何时转换数据
        • 3.4.支持的转换
    • 二、连接 Modbus 设备
      • 1.docker-comepse
      • 2.设备配置文件
      • 3.Modbus 配置
      • 4.启动 EdgeX Foundry
      • 5.Modbus 测试工具
      • 6.访问 UI
        • 6.1. consul
        • 6.2. EdgeX Console
      • 7.测试
        • 7.1.命令
        • 7.2.事件
        • 7.3.读值

  • EdgeX Foundry
# EdgeX Foundry

https://iothub.org.cn/docs/edgex/
https://iothub.org.cn/docs/edgex/device/service-modbus/

一、Modbus 设备服务

1.概述

Modbus 设备服务的目的是将 Modbus 设备连接到 EdgeX。

2.协议属性

设备 Modbus 为 Modbus-TCP 和 Modbus-RTU 定义了以下协议属性。

  • Modbus TCP 设备
    • 这些属性位于每个设备定义部分的modbus-tcp键下protocols
属性描述
AddressModbus TCP 的 IP 地址或主机名
Port用于通过 Modbus TCP 进行通信的端口
UnitIDModbus 站或从站标识符
Timeout连接或读取Device Modbus Service到device-modbus时的超时
IdleTimeout关闭连接的空闲超时(秒)

在这里插入图片描述

  • Modbus RTU 设备
    • 这些属性位于每个设备定义部分的modbus-rtu键下protocols
属性描述
AddressModbus TCP 的 IP 地址或主机名
UnitIDModbus 站或从站标识符
BaudRate串行设备的波特率,必须与使用相同地址的设备匹配
DataBits数据位数
StopBits停止位数
Parity奇偶校验值:N 表示无校验/E 表示偶校验/O 表示奇校验
Timeout连接或读取Device Modbus Service到device-modbus时的超时
IdleTimeout关闭连接的空闲超时(秒)

在这里插入图片描述

3.数据类型转换

在设备资源使用具有浮点刻度的整数数据类型的用例中,转换后可能会丢失精度。

例如,Modbus 设备将温度和湿度存储在 Int16 数据类型中,浮点数为 0.01。如果温度为26.53,则读取值为2653。但转换后,值为26。

为了避免这种情况,设备资源数据类型必须与值描述符数据类型不同。这是通过使用设备配置文件中的可选 rawType属性来定义从 Modbus 设备读取的二进制数据以及valueType指示用户想要接收的数据类型来实现的。

如果rawType属性存在,设备服务根据定义解析二进制数据,然后根据设备资源的定义rawType转换值。valueType``properties

以下设备配置文件摘录将 定义rawType为 Int16 并将 定义valueType为 Float32:
在这里插入图片描述

3.1.读命令

读取命令执行如下:

  1. 设备服务执行Read命令读取二进制数据
  2. 二进制读取数据被解析为Int16数据类型
  3. 整数值被转换为 Float32 值
    在这里插入图片描述
3.2.写命令

写入命令执行如下:

  1. 设备服务将请求的 Float32 值转换为整数值
  2. 整数值转换为二进制数据
  3. 设备服务执行Write命令

在这里插入图片描述

3.3.何时转换数据

在 16 位整数和浮点值之间缩放读数时,通常需要转换数据。

以下限制适用:

  • rawType仅支持 Int16、Uint16 和 Int32 数据类型
  • 对应的valueType必须是Float32或者Float64

如果为属性定义了不受支持的数据类型rawType,设备服务将引发类似于以下内容的异常:

Read command failed. Cmd:temperature err:the raw type Int64 is not supported
3.4.支持的转换

支持的转换如下:

From rawTypeTo valueType
Int16Float32
Int16Float64
Int32Float64
Uint16Float32
Uint16Float64

二、连接 Modbus 设备

# 官方文档

https://docs.edgexfoundry.org/3.1/microservices/device/services/device-modbus/GettingStarted/

1.docker-comepse

# 1.克隆 edgex-compose
$ git clone git@github.com:edgexfoundry/edgex-compose.git 
$ git clone https://github.com/edgexfoundry/edgex-compose.git
$ cd edgex-compose 
$ git checkout v3.1


# 2.生成 docker-compose.yml 文件(注意这包括 mqtt-broker)
$ cd compose-builder
$ make gen ds-modbus no-secty


# 3.检查生成的文件
$ ls | grep 'docker-compose.yml'
docker-compose.yml
[root@edgex mqtt-device]# git clone https://github.com/edgexfoundry/edgex-compose.git
Cloning into 'edgex-compose'...
remote: Enumerating objects: 4779, done.
remote: Counting objects: 100% (2916/2916), done.
remote: Compressing objects: 100% (173/173), done.
remote: Total 4779 (delta 2831), reused 2804 (delta 2741), pack-reused 1863
Receiving objects: 100% (4779/4779), 1.22 MiB | 450.00 KiB/s, done.
Resolving deltas: 100% (4042/4042), done.


[root@edgex mqtt-device]# ll
total 4
drwxr-xr-x. 6 root root 4096 Feb  1 04:10 edgex-compose


[root@edgex mqtt-device]# cd edgex-compose/
[root@edgex edgex-compose]# git checkout v3.1
Note: checking out 'v3.1'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 488a3fe... Merge pull request #424 from lenny-intel/device-mqtt-secure-mode-napa


[root@edgex edgex-compose]# cd compose-builder/

[root@edgex compose-builder]# make gen ds-modbus no-secty
echo MQTT_VERBOSE=
MQTT_VERBOSE=
docker compose  -p edgex -f docker-compose-base.yml -f add-device-modbus.yml convert > docker-compose.yml
rm -rf ./gen_ext_compose


[root@edgex compose-builder]# ls | grep 'docker-compose.yml'
docker-compose.yml

2.设备配置文件

在本部分中,我们创建文件夹,其中包含部署自定义设备配置以与现有设备服务配合使用所需的文件:

[root@edgex custom-config]# pwd
/edgex/modbus-device-svc/custom-config

[root@edgex custom-config]# tree
.
├── device.config.yaml
└── temperature.profile.yml

1.设备配置

创建设备配置文件,命名为 device.config.yaml,如下所示:

[root@edgex custom-config]# vim device.config.yaml

deviceList:
  name: "Modbus-TCP-Temperature-Sensor"
  profileName: "Ethernet-Temperature-Sensor"Ethernet-Temperature-Sensor
  description: "This device is a product for monitoring the temperature via the ethernet"
  labels: 
    - "temperature"
    - "modbus"
    - "TCP"
  protocols:
    modbus-tcp:
      Address: "192.168.3.4"
      Port: "502"
      UnitID: "1"
      Timeout: "5"
      IdleTimeout: "5"
  autoEvents:
    interval: "30s"
    onChange: false
    sourceName: "Temperature"

2.设备配置文件

DeviceProfile定义了设备的值和操作方法,可以是 Read 或 Write。

创建名为 的设备配置文件 temperature.profile.yml,其中包含以下内容:

[root@edgex custom-config]# vim temperature.profile.yml 

name: "Ethernet-Temperature-Sensor"
manufacturer: "Audon Electronics"
model: "Temperature"
labels:
  - "Web"
  - "Modbus TCP"
  - "SNMP"
description: "The NANO_TEMP is a Ethernet Thermometer measuring from -55°C to 125°C with a web interface and Modbus TCP communications."

deviceResources:
  -
    name: "ThermostatL"
    isHidden: true
    description: "Lower alarm threshold of the temperature"
    attributes:
      { primaryTable: "HOLDING_REGISTERS", startingAddress: 0, rawType: "Int16" }
    properties:
      valueType: "Float32"
      readWrite: "RW"
      scale: 0.1
  -
    name: "ThermostatH"
    isHidden: true
    description: "Upper alarm threshold of the temperature"
    attributes:
      { primaryTable: "HOLDING_REGISTERS", startingAddress: 1, rawType: "Int16" }
    properties:
      valueType: "Float32"
      readWrite: "RW"
      scale: 0.1
  -
    name: "AlarmMode"
    isHidden: true
    description: "1 - OFF (disabled), 2 - Lower, 3 - Higher, 4 - Lower or Higher"
    attributes:
      { primaryTable: "HOLDING_REGISTERS", startingAddress: 2 }
    properties:
      valueType: "Int16"
      readWrite: "RW"
  -
    name: "Temperature"
    isHidden: false
    description: "Temperature x 10 (np. 10,5 st.C to 105)"
    attributes:
      { primaryTable: "HOLDING_REGISTERS", startingAddress: 4, rawType: "Int16" }
    properties:
      valueType: "Float32"
      readWrite: "R"
      scale: 0.1

deviceCommands:
  -
    name: "AlarmThreshold"
    readWrite: "RW"
    isHidden: false
    resourceOperations:
      - { deviceResource: "ThermostatL" }
      - { deviceResource: "ThermostatH" }
  -
    name: "AlarmMode"
    readWrite: "RW"
    isHidden: false
    resourceOperations:
      - { deviceResource: "AlarmMode", mappings: { "1":"OFF","2":"Lower","3":"Higher","4":"Lower or Higher"} }

3.修改docker-compose.yml

 device-modbus:
    ...
    environment:
      ...
      DEVICE_DEVICESDIR: /custom-config
      DEVICE_PROFILESDIR: /custom-config
    volumes:
    ...
    - /path/to/custom-config:/custom-config
 device-modbus:
    ...
    environment:
      ...
      DEVICE_DEVICESDIR: /custom-config
      DEVICE_PROFILESDIR: /custom-config
    volumes:
    ...
    - /edgex/modbus-device-svc/custom-config:/custom-config

3.Modbus 配置

Modbus 寄存器表

您可以在用户手册中找到可用的寄存器。

Modbus TCP – Holding Registers

AddressNameR/WDescription
4000ThermostatLR/WLower alarm threshold
4001ThermostatHR/WUpper alarm threshold
4002Alarm modeR/W1 - OFF (disabled), 2 - Lower, 3 - Higher, 4 - Lower or Higher
4004Temperature x10RTemperature x 10 (np. 10,5 st.C to 105)

device-modbus提供两种类型的协议,Modbus TCP和Modbus RTU,其定义如下

protocolNameProtocolAddressPortUnitIDBaudRateDataBitsStopBitsParityTimeoutIdleTimeout
Modbus TCPGateway addressTCP10.211.55.6502155
Modbus RTUGateway addressRTU/tmp/slave50221920081N55

4.启动 EdgeX Foundry

使用以下命令部署 EdgeX:

$ cd edgex-compose/compose-builder
$ docker compose pull
$ docker compose up -d


# 修改配置文件
替换IP地址 127.0.0.1 为 0.0.0.0
# docker compose pull

# docker compose -f docker-compose.yml -f docker-compose.override.yml up -d

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.Modbus 测试工具

在这里插入图片描述
在这里插入图片描述

6.访问 UI

6.1. consul
# 访问地址
http://192.168.202.233:8500

在这里插入图片描述

6.2. EdgeX Console
# 访问地址
http://192.168.202.233:4000/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.测试

7.1.命令

在这里插入图片描述
在这里插入图片描述

7.2.事件

在这里插入图片描述

{
	"apiVersion": "v3",
	"id": "84e3cb89-5f8c-4777-aa8f-e8574d9b0221",
	"deviceName": "Modbus-TCP-Temperature-Sensor",
	"profileName": "Ethernet-Temperature-Sensor",
	"sourceName": "Temperature",
	"origin": 1708368064375222000,
	"readings": [{
		"id": "9626ea3f-476e-49c3-86d1-12f6245aa39f",
		"origin": 1708368064375173600,
		"deviceName": "Modbus-TCP-Temperature-Sensor",
		"resourceName": "Temperature",
		"profileName": "Ethernet-Temperature-Sensor",
		"valueType": "Float32",
		"value": "0.000000e+00"
	}]
}
7.3.读值

在这里插入图片描述

{
	"id": "d56f2ba4-beb7-44c4-a6e9-3dad9cd87d86",
	"origin": 1708368214506509000,
	"deviceName": "Modbus-TCP-Temperature-Sensor",
	"resourceName": "Temperature",
	"profileName": "Ethernet-Temperature-Sensor",
	"valueType": "Float32",
	"value": "0.000000e+00"
}
  • EdgeX Foundry
# EdgeX Foundry

https://iothub.org.cn/docs/edgex/
https://iothub.org.cn/docs/edgex/device/service-modbus/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/431980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习笔记】计算机视觉——单发多框检测(SSD)

单发多框检测(SSD) sec_ssd 在 sec_bbox— sec_object-detection-dataset中,我们分别介绍了边界框、锚框、多尺度目标检测和用于目标检测的数据集。 现在我们已经准备好使用这样的背景知识来设计一个目标检测模型:单发多框检测&…

CSS小知识

文章目录 1. box-sizing属性描述的是什么,可以设置为哪些值? 1. box-sizing属性描述的是什么,可以设置为哪些值? box-sizing 属性定义如何计算一个元素的总宽度和总高度,主要设置是否需要加上内边距(padding)和边框等…

http代理IP适合什么场景使用?HTTP代理IP的优势在哪里呢?

HTTP代理IP在多种场景下都能发挥重要作用,尤其是在网络请求处理、数据抓取、爬虫应用以及隐私保护等方面。下面,我们将详细探讨HTTP代理IP适用的场景以及其所具备的优势。 一、HTTP代理IP适合什么场景使用? 1. 网络请求处理:在进行…

第六篇:人工智能与机器学习技术VS数据迁移(Data Migration)--- 我为什么要翻译介绍美国人工智能科技巨头IAB公司?

(source: 图片来自麻省理工官网) IAB平台,使命和功能 IAB成立于1996年,总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司,互动广告局(IAB- the Interactive Advertising Bureau)…

opencv dnn模块 示例(24) 目标检测 object_detection 之 yolov8-pose 和 yolov8-obb

前面博文【opencv dnn模块 示例(23) 目标检测 object_detection 之 yolov8】 已经已经详细介绍了yolov8网络和测试。本文继续说明使用yolov8 进行 人体姿态估计 pose 和 旋转目标检测 OBB 。 文章目录 1、Yolov8-pose 简单使用2、Yolov8-OBB2.1、python 命令行测试2.2、opencv…

java算法第十天 | ● 栈和队列理论基础 ● 232.用栈实现队列 ● 225. 用队列实现栈

栈和队列理论基础 栈 :先进后出队列 :先进先出 Java中队列Queue的操作 队列 使用Queue接口创建队列 ,Queue的实现类有LinkedList和ArrayDeque。最常用的实现类是LinkedList。 Queue的六种方法: add()和…

基于SpringBoot+MYSQL的网页时装购物系统

目录 1、 前言介绍 2、主要技术 3、系统流程分析 3.1、系统登录流程图 3.2、添加信息流程图 3.3、删除信息流程图 4、系统体系结构 4.1、时装购物系统的结构图 4.2、登录系统结构图 4.3、时装购物系统结构图 5、数据库设计原则 5.1、管理员信息属性图 5.2、用户管…

CSS文本样式值,web前端开发资料

正文 什么是行内元素? display属性为inline的元素为行内元素,英文:inline element,其中文叫法有多种,如:内联元素、内嵌元素、行内元素、直进式元素等。 特点: 和其他元素都在一行上&#x…

汉字中文验证码点选识别匹配,达到商用级别

汉字中文验证码点选识别匹配深度学习方法实现,达到商用级别 一、简介1.1 需求分析1.2 运行效果1.3 性能指标 二、使用方法2.1 源码运行2.2 打包后运行2.3 测试效果 三、项目下载 一、简介 1.1 需求分析 针对中文验证码进行识别,当出现以下验证码时&…

MySQL性能优化-Mysql索引篇(4)

概览 承接上文,我们说过数据库读取磁盘的最小单位是页不是行,那么对于数据库来说,如果我们想要查找多行记录,查询时间是否会成倍地提升呢?其实数据库会采用缓冲池的方式提升页的查找效率。 为了更好地理解SQL查询效率…

计算机设计大赛 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

【探索AI】程序员如何选择职业赛道?

程序员如何选择职业赛道? 程序员的职业赛道就像是一座迷宫,有前端的美丽花园,后端的黑暗洞穴,还有数据科学的神秘密室。你准备好探索这个充满挑战和机遇的迷宫了吗?快来了解如何选择职业赛道吧! 自我评估…

Git分布式管理-头歌实验日志和版本回退

在Git使用过程中,一种很常见的情况是:发现某个已经提交到仓库里的代码文件有致命的bug,必须将代码回滚到上一个版本,在这种情况下就显示出了Git的强大。Git为每次提交,都保留了日志,根据提交日志&#xff0…

人工智能-飞桨

文章目录 概要安装零基础教程基础知识小结 概要 集核心框架、基础模型库、端到端开发套件、丰富的工具组件于一体的深度学习平台 官方入口 安装 python安装 python官方下载 PaddlePaddle安装 python -m pip install paddlepaddle2.6.0 -i https://mirror.baidu.com/pypi/s…

电脑电源电压不足会出现什么问题?怎么办?

电脑电源的电压是多少? 电脑电源输出一般有12V、5V、3.3V三种不同的电压。 电脑电源负责给电脑配件供电,如CPU、主板、内存条、硬盘、显卡等,是电脑的重要组成部分。 新规格的12V、5V、3.3V等输出的电源分配一般更适合当前电脑配件的电源需求…

【中国电信】光猫 PT632 使用超管权限修改 IP 地址租期时间

背景 由于光猫默认设置的动态 IP 租期是 24 小时,所以每天都会断网一次,严重影响用网体验,所以打算通过修改动态 IP 租期为 一周(最长就一周,没有永久的选项)来改善。 需求 一台电脑(已开启 …

网络信息安全:OpenSSH_7.4p1升级至OpenSSH_9.6p1 | ssh-agent远程代码执行漏洞(CVE-2023-38408)

网络&信息安全:OpenSSH_7.4p1升级至OpenSSH_9.6p1 | ssh-agent远程代码执行漏洞(CVE-2023-38408) 1.1 风险详情1.2 操作环境1.3 漏洞处理:OpenSSH升级1、查看SSH客户端的版本信息2、列出系统中openssl、openssh的软件包3、启动telnet&…

idea:springboot项目搭建

目录 一、创建项目 1、File → New → Project 2、Spring Initializr → Next 3、填写信息 → Next 4、web → Spring Web → Next 5、填写信息 → Finish 6、处理配置不合理内容 7、注意事项 7.1 有依赖包,却显示找不到依赖,刷新一下maven 二…

SmartX 携手 openGauss 社区发布联合方案评测与性能最佳实践 | 附优化方法与测试数据

近日,北京志凌海纳科技有限公司(以下简称 “SmartX”)携手 openGauss 社区完成了 openGauss 数据库基于 SmartX 超融合平台(SMTX OS)和 SmartX 分布式存储平台(SMTX ZBS)的性能测试和调优。 结…

JVM(垃圾回收机制 ---- GC)

啥是垃圾? 不再使用的内存 啥是垃圾回收机制? 自动释放不用的内存 注意: GC 主要是针对 堆 进行的 GC的基本操作单位是 对象, 即GC’回收的是整个对象都不使用的情况 GC 的优缺点 好处: 省心, 写代码简单, 不易出错 缺点: 需要消耗额外资源, 有额外性能开销 , 此外, 易触发 S…