分类 边缘计算网关 下的文章

目录

曾经,很多人天真的认为 PLC 会被更加现代化的高科技产品替代,从工业 4.0 概念提出来的十几年间,PLC 还是占据了工业应用场景中的“顶梁柱”作用。
作为物联网时代,IoT 的兴起,对工业数据采集有着强烈的需求,如何高效地采集工业数据,令很多从业人员头疼。
本文将介绍单机支持 >10000数据点秒级采集 相关的演进方案。

需求出发点

  • 首先,就是对数据采集的频率和效率有很大要求,我们接触到的大部分客户,现在都是拿传统的 HMI 或 winCC 等软件的效率,让供应商提供几乎实时的采集效率;
  • 其次,各种工业数据,有机器设备、有物流信息、有人员信息、有仓库信息,等,这些信息的充分融合,迫在眉睫;
  • 再次,大数据的崛起,作为甲方爸爸而言,当然也是并不陌生,那么是不是所有的场景都需要将海量数据上传到云端(公有云或私有云)?
  • 最后,有没有一种解决方案,能够一并解决上面的问题呢?

典型应用分析

应用一:高频工业数据采集

简单的说,就是纯粹的数据采集、归并、入库。看似很简单的需求,罗列出技术要素,大部分供应商都望而却步。
2023-04-09T14:24:34.png

客户需求:

  • 50台 PLC 管理300个机器,4000个测点,1秒级采集并写入 SQL 数据库;
  • 入库时,按照具体的机器设备单独一个数据表,每个机器的测点数(数据库字段都不一样);
  • 根据业务需求,可以随时更改被机器采集配置信息,不能影响其他采集过程;

常见问题

  • 实时采集 PLC 数据,绝大部分数采网关都达不到这样的高效率;
  • 不能无限制的增加采集网关,成本管理要求和技术部署实施都不可靠;
  • 数采完成,入库成了网关的难题,市面上的网关基本都是 MQTT 外发或丢进消息队列;

应用二:局部工业数据分析

相对于纯粹的 PLC 数采,局部工业数据分析会涉及到更多的被采集类型,除了各式各样的 PLC,还有 OPC-UA/DA,这是非常典型的场景。
2023-04-09T14:25:11.png

客户需求

  • 200台 PLC 管理500个机器,600个测点数,同样也是1秒需要入库;
  • 数据分布在 PLC 和 OPC-UA 系统中,品类虽不多,但是异构切复杂;
  • 部分数据来自第三方,需要完成数据对接;
  • 数据全部收集完成存入时许数据库,为后面的数据分析做准备;
  • 针对不同的应用车间、工序,完成对数据商业价值分析:趋势、分类、异常、故障报警、辅助决策;

常见问题

  • 采集数据需要能够支持各种各样的数据源,且不能因为品类居多而产生效率问题;
  • 品类再多,数据也需要归并和过滤,完成统一平台处理;
  • 数据时间轴对应,不能因为多种数据源的原因导致数据不在同1秒内处理完成;
  • 同样的,也不能采用很多网关来处理这些数据;
  • 需要一套完整的、一体化的技术解决方案。

应用三:海量、高频、多样化数据采集

集合了应用一和应用二的需求和技术特点,最大的不同点就是,数据源从几百个增长到几千个,测点数也出奇的达到20万。这样如此庞大的工业应用场景还是比较罕见,每台机器设备至少有上百个甚至几百个测点,行业的特殊性,这些数据来自很多类型的数据源,还必须归并到一个虚拟资产(机器设备),作为一个整体来实现。

综合上面的要点,可以采用 YiFUSION 系列网关来实现:

YiEDGE 边缘计算软件

请输入图片描述

YiFUSION 工业边缘智能融合一体机

YiFUSION 是基于 YiEDGE 边缘计算软件的框架之上,作为软硬件一体机的形态。

  • 物理形态
    2023-04-09T14:37:53.png

  • 功能模块
    2023-04-09T14:38:44.png

关于 亿琪软件

上海亿琪软件有限公司成立于2016年,专注于 5G 通信、AI 人工智能、边缘计算和大数据网络安全多项技术领域,致力于物联网领域前沿技术的创新,为用户提供全方位、智能化和安全的物联网解决方案。

2023年,公司发布“YiFUSION|工业边缘智能融合一体机”产品,为工业客户提供一整套的边缘计算+AI能力:高性能数据采集、多类型数据融合、AI算法集成、云端业务对接。在边缘网关的基础上,集成了 IoT 平台的边缘协同能力、本地Web SCADA 和 HMI 功能、本地数据存储、边缘 AI 视频分析、行业应用集成等。

2022年公司推出 “YiCLOUD|亿琪云”一站式物联网应用解决方案。公司的业务涵盖了智慧城市、智慧农业、智能工厂和智慧园区等多个领域,公司软硬件产品和解决方案获得华为技术认证,得到中国移动OCP认证,公司还是边缘计算产业联盟ECC成员。

感知物联,畅快无限。

联系我们
网站:http://yiqisoft.cn
邮件:support@yiqisoft.cn
电话:021-68863086
手机:186-1666-9123

目录

众所周知,我们软件读取 PLC 数据时按照 Bool/Byte/Word/Real 等类型进行通讯,有时候,需要频繁读取 PLC 多个数据字段偏移量时,就会造成传输效率低下的问题。

需求/故障现场

  • PLC 上有 100 个 word 需要读取,偏移量顺序排列,比如:从 0 - 200;
  • 需要 1 秒读取 1 次数据;
  • 转换后,数据转发到第三方系统:MQTT,SQL等;
  • 逐个读取每个 word,两个字节,需要在一个 TCP 会话中执行 100 次请求;
  • 每次请求,三个 TCP 数据传输,每次需要 15ms(423行-421行:3.614448-3.598902=0.015546s);
    2023-03-30T07:43:07.png
  • 这样的话,100次请求需要1.5546s,算上网络延迟和处理性能问题,整个过程需要2秒以上;
  • 结果就是:完全达不到 1秒1次 采集的需求。

分析过程

winCC 数据采集抓包

分析过程1:采集20个 real 数据字段

  • winCC 将数据包分解成 3个 item
    2023-03-30T07:52:38.png

分析过程2:采集10个 word 数据字段

  • 同样原理,winCC 将数据包按照每个 item 32 个字节
    2023-03-30T07:54:16.png

自有软件数据采集抓包

每次只是读取了1个 word 数据字段

2023-03-30T07:55:07.png

解决方案构思

  • 每次按照要求,获取所有需要的数据偏移量;
  • 取回来后,按照测点要求,自己根据数据类型分解出来;
  • 循环读取下一次数据;

验证

读取1000个字节

  • 可以看到分了5次数据,222+222+222+222+112=1000
    2023-03-30T08:20:45.png

下一步是继续验证分多个 item 进行数据采集

winCC 数据格式

  • 效率高,每次只需要 <2ms,分析原因:每次读取都是连续的地址空间,不需要PLC进行分段读取;
    2023-03-30T09:05:48.png

自己代码

  • 效率低,每次需要20-50ms,分析原因:每个 item 里面只有一个测点(word类型),需要分段读取;
    2023-03-30T09:08:15.png

开发过程

大概过程描述

  • 由于每次请求的数据量(按测点)叠加在一起,通过 S7DataItem 来组合,最多20个 item,打包一起发送到 PLC;
  • 收到每次的返回数据,再解析成对象插入二维表,等待处理;
  • 全部处理完成,统一根据请求数量,返回相应的结果集;

总结

  • PLC 针对于每个测点的处理时间在 1-3秒,数量越多,时间越长,是累加的;
  • 100个测点,算上 TCP 包头和包尾,大概来回数据时间是 220ms左右,200个测点是 400ms左右;
  • 通过这种方式,一个 PLC 建议采集点不超过 500个,虽然对 PLC 性能影响不大,但是处理时间较长,不适用1秒一次采集需求;
  • 每个型号 PLC 的处理性能不一样,支持的 TCP 连接数也不一定一样,所以,要根据具体需求来决定。

效果展示

  • 存入 SQL 数据库,完全控制在1秒一次采集
    2023-03-31T08:01:49.png

  • 4 个 TCP 连接非常稳定
    2023-03-31T08:02:56.png

  • 网关性能稳定
    2023-03-31T08:03:38.png

  • 与 PLC 交互的网卡网络流量很少
    2023-03-31T08:04:52.png

改进?

  • 类似 winCC 的模式,一次性读取一段偏移量,节省 TCP 开销,也节省 PLC 处理每个测点;
  • 针对一次读取来的一段偏移量内容进行解析,需要对字节码流处理非常熟悉;
  • 对于新建项目,比较适合用改进的方法,毕竟 PLC 可以根据需求改动测点偏移量;

关于 亿琪软件

上海亿琪软件有限公司成立于2016年,专注于 5G 通信、AI 人工智能、边缘计算和大数据网络安全多项技术领域,致力于物联网领域前沿技术的创新,为用户提供全方位、智能化和安全的物联网解决方案。

2023年,公司发布“YiFUSION|工业边缘智能融合一体机”产品,为工业客户提供一整套的边缘计算+AI能力:高性能数据采集、多类型数据融合、AI算法集成、云端业务对接。在边缘网关的基础上,集成了 IoT 平台的边缘协同能力、本地Web SCADA 和 HMI 功能、本地数据存储、边缘 AI 视频分析、行业应用集成等。

2022年公司推出 “YiCLOUD|亿琪云”一站式物联网应用解决方案。公司的业务涵盖了智慧城市、智慧农业、智能工厂和智慧园区等多个领域,公司软硬件产品和解决方案获得华为技术认证,得到中国移动OCP认证,公司还是边缘计算产业联盟ECC成员。

感知物联,畅快无限。

联系我们
网站:http://yiqisoft.cn
邮件:support@yiqisoft.cn
电话:021-68863086
手机:186-1666-9123

目录

Golang 作为高性能编程语言,在边缘计算领域越来越流行,编译完超小的二进制,打包成 docker image 作为微服务框架在边缘计算领域是最佳选择。
Gos7 作为 Golang 原生的 S7 PLC 对接实现是非常不错的选择,本文将简单介绍 Gos7 在边缘计算框架 YiEDGE 中的使用。

上一篇文章“PLC|Golang 连接 Siemens S7/TCP 协议读取数据”介绍了如何独立使用 Gos7 与 PLC通讯,作为基础,你应该有所熟悉了。

理解 Gos7 API 结构

Client API

API AG(Automatisationsgerät)

AG 相关的 API 主要是负责 PLC 读取/写入数据,对应的 PLC 内部,最常用的应该是:DB 段。

  • Read/Write IPU (AB)
  • Read/Write IPI (EB)
  • Read/Write Merkers(MB)
  • Read/Write Data Block (DB)
  • Read/Write Timer (TM)
  • Read/Write Counter (CT)
  • Multiple Read/Write Area
  • Get Block Info
    /***************start API AG (Automatisationsgerät)***************/
    //Read data blocks from PLC
    AGReadDB(dbNumber int, start int, size int, buffer []byte) (err error)
    //write data blocks into PLC
    AGWriteDB(dbNumber int, start int, size int, buffer []byte) (err error)
    //Read Merkers area from PLC
    AGReadMB(start int, size int, buffer []byte) (err error)
    //Write Merkers from into PLC
    AGWriteMB(start int, size int, buffer []byte) (err error)
    //Read IPI from PLC
    AGReadEB(start int, size int, buffer []byte) (err error)
    //Write IPI into PLC
    AGWriteEB(start int, size int, buffer []byte) (err error)
    //Read IPU from PLC
    AGReadAB(start int, size int, buffer []byte) (err error)
    //Write IPU into PLC
    AGWriteAB(start int, size int, buffer []byte) (err error)
    //Read timer from PLC
    AGReadTM(start int, size int, buffer []byte) (err error)
    //Write timer into PLC
    AGWriteTM(start int, size int, buffer []byte) (err error)
    //Read counter from PLC
    AGReadCT(start int, size int, buffer []byte) (err error)
    //Write counter into PLC
    AGWriteCT(start int, size int, buffer []byte) (err error)
    //multi read area
    AGReadMulti(dataItems []S7DataItem, itemsCount int) (err error)
    //multi write area
    AGWriteMulti(dataItems []S7DataItem, itemsCount int) (err error)
    /*block*/
    DBFill(dbnumber int, fillchar int) error
    DBGet(dbnumber int, usrdata []byte, size int) error
    //general read function with S7 sytax
    Read(variable string, buffer []byte) (value interface{}, err error)
    //Get block  infor in AG area, refer an S7BlockInfor pointer
    GetAgBlockInfo(blocktype int, blocknum int) (info S7BlockInfo, err error)
    /***************end API AG***************/

API PG(Programmiergerät)

PG 相关的 API 主要是针对 PLC 本体的一些启停、设备信息读取、时钟读写等。

    /***************start API PG (Programmiergerät)***************/
    /*control*/
    //Hotstart PLC, Puts the CPU in RUN mode performing an HOT START.
    PLCHotStart() error
    //Cold start PLC, change CPU into runmode performing and COLD START
    PLCColdStart() error
    //change CPU to stop mode
    PLCStop() error
    //return CPU status: running/stopped
    PLCGetStatus() (status int, err error)
    /*directory*/
    //list all blocks in PLC, return a Blockslist which contains list of OB, DB, ...
    PGListBlocks() (list S7BlocksList, err error)
    /*security*/
    //set the session password for PLC to meet its security level
    SetSessionPassword(password string) error
    //clear the password set for current session
    ClearSessionPassword() error
    //return the CPU protection level info, refer to: §33.19 of "System Software for S7-300/400 System and Standard Functions"
    //return S7Protection and its properties.
    GetProtection() (protection S7Protection, err error)
    /*system information*/
    //get CPU order code, return S7OrderCode
    GetOrderCode() (info S7OrderCode, err error)
    //get CPU info, return S7CpuInfo and its properties
    GetCPUInfo() (info S7CpuInfo, err error)
    //get CP info, return S7CpInfo and its properties
    GetCPInfo() (info S7CpInfo, err error)
    /*datetime*/
    //read clock on PLC, return a time
    PGClockRead(datetime time.Time) error
    //write clock to PLC with datetime input
    PGClockWrite() (dt time.Time, err error)
    /***************end API AG***************/

Helper API

Helper API 主要负责从 buffer 中读取/写入指定的数据类型到变量中。

  • Read/Write a boolean
  • Read/Write a value(int)
  • Read/Write a float (Real)
  • Read/Write chars
  • ...

等,各种数据格式。

PLC 数据交互步骤

  1. 创建 PLC TCP 连接
  2. 根据测点 command 读取/写入偏移量
  3. 返回结果数据

关于 亿琪软件

上海亿琪软件有限公司成立于2016年,专注于 5G 通信、AI 人工智能、边缘计算和大数据网络安全多项技术领域,致力于物联网领域前沿技术的创新,为用户提供全方位、智能化和安全的物联网解决方案。

2023年,公司发布“YiFUSION|工业边缘智能融合一体机”产品,为工业客户提供一整套的边缘计算+AI能力:高性能数据采集、多类型数据融合、AI算法集成、云端业务对接。在边缘网关的基础上,集成了 IoT 平台的边缘协同能力、本地Web SCADA 和 HMI 功能、本地数据存储、边缘 AI 视频分析、行业应用集成等。

2022年公司推出 “YiCLOUD|亿琪云”一站式物联网应用解决方案。公司的业务涵盖了智慧城市、智慧农业、智能工厂和智慧园区等多个领域,公司软硬件产品和解决方案获得华为技术认证,得到中国移动OCP认证,公司还是边缘计算产业联盟ECC成员。

感知物联,畅快无限。

联系我们
网站:http://yiqisoft.cn
邮件:support@yiqisoft.cn
电话:021-68863086
手机:186-1666-9123

工业项目中,工业现场很多情况是 Siemens S7 系列 PLC,通过应用程序读取信息已经是非常迫切的一些需求,尤其是在需要边缘计算网关的环境下,与外部系统对接的时候,这些都是基础性功能。

Siemens S7 PLC

笔者使用 SIMATIC S7-1200,CPU 是 1211C,6ES7 211-1AE40-0XB0,没有使用扩展模块,只是为了测试连通性。

  • 使用 Step 7 V14 PORTAL 配置好运行环境;
  • 配置少许几个测点,能通过 Modbus TCP 获取数据;
  • 打开 S7 get/put 功能接口;
  • 确认 TCP:102 端口能够正常连接;
  • 少量了解 PLC 工作机制,S7 协议数据格式;

S7 protocol in Golang

  • 笔者使用 Gos7 库,参考地址如下:https://github.com/robinson/gos7
  • 熟读库中的源码,熟悉 test 目录下例子 API 的使用;
  • 使用 /test 目录下测试例子跑通于 PLC 的基础连接;

运行 test 效果如下:

Running tool: /opt/homebrew/bin/go test -timeout 30s -run ^TestTCPClient$ plcProj

tcp: 2023/03/22 13:52:37 s7: sending 03 00 00 16 11 e0 00 00 00 01 00 c0 01 0a c1 02 01 00 c2 02 01 01
tcp: 2023/03/22 13:52:37 s7: received 03 00 00 16 11 d0 00 01 00 01 00 c0 01 0a c1 02 01 00 c2 02 01 01
tcp: 2023/03/22 13:52:37 s7: sending 03 00 00 19 02 f0 80 32 01 00 00 04 00 00 08 00 00 f0 00 00 01 00 01 01 e0
tcp: 2023/03/22 13:52:37 s7: received 03 00 00 1b 02 f0 80 32 03 00 00 04 00 00 08 00 00 00 00 f0 00 00 01 00 01 00 f0
tcp: 2023/03/22 13:52:37 s7: sending 03 00 00 2d 02 f0 80 32 01 00 00 05 00 00 0e 00 0e 05 01 12 0a 10 02 00 0a 00 02 84 00 00 00 00 04 00 50 00 64 00 00 00 00 00 00 00 00
tcp: 2023/03/22 13:52:37 s7: received 03 00 00 16 02 f0 80 32 03 00 00 05 00 00 02 00 01 00 00 05 01 ff
tcp: 2023/03/22 13:52:37 s7: sending 03 00 00 1f 02 f0 80 32 01 00 00 05 00 00 0e 00 00 04 01 12 0a 10 02 00 0a 00 02 84 00 00 00
tcp: 2023/03/22 13:52:37 s7: received 03 00 00 23 02 f0 80 32 03 00 00 05 00 00 02 00 0e 00 00 04 01 ff 04 00 50 3a 98 00 00 00 00 42 c8 00 00

编写自己的代码

自己的测试源码,获取 偏移量 160 的 WORD 数据(此处是用 clock 时钟模拟)

package main

import (
    "fmt"
    "time"

    "github.com/robinson/gos7"
)

type PlcData struct {
    intValue     uint16
}

func main() {
    const (
        ipAddr = "192.168.123.199" //PLC IP
        rack   = 0                 // PLC机架号
        slot   = 1                 // PLC插槽号
    )
    //PLC tcp连接客户端
    handler := gos7.NewTCPClientHandler(ipAddr, rack, slot)
    //连接及读取超时
    handler.Timeout = 200 * time.Second
    //关闭连接超时
    handler.IdleTimeout = 200 * time.Second
    //打开连接
    handler.Connect()
    //函数退出时关闭连接
    defer handler.Close()

    //获取PLC对象
    client := gos7.NewClient(handler)

    //DB号
    address := 1
    //起始地址
    start := 160
    //读取字节数
    size := 2
    //读写字节缓存区
    buffer := make([]byte, size)

    //读取字节
    client.AGReadDB(address, start, size, buffer)

    //gos7解析数据类
    var helper gos7.Helper

    //gos7内置方法解析数据
    var data PlcData
    helper.GetValueAt(buffer[0:2], 0, &data.intValue)

    //输出数据
    fmt.Println(data)
    fmt.Println(buffer)
}

编译,运行:

jiekechoo@jiekechoo GoS7Demo % go build && ./plcProj
{26}
[0 26]

jiekechoo@jiekechoo GoS7Demo % go build && ./plcProj
{27}
[0 27]

EdgeXFoundry平台的分层和服务为边缘设备/节点和云/企业应用之间提供了一个双向转换引擎。EdgeX 作为边缘计算平台是非常不错的选择。

2023-03-01T01:13:20.png

主要服务介绍

Device Services 设备服务

设备服务是与传感器/设备或物联网对象(“物”) 交互的边缘连接器,其中包括机器、机器人、无人机、HVAC 设备、相机等。通过利用可用的连接器,可以控制设备并/或传输数据至 EdgeX或从其传输数据。您还可以使用设备服务 SDK来创建您自己的 EdgeX设备服务。

可用的设备服务包括:

  • MQTT
  • Modbus TCP
  • Modbus RTU
  • BACnet IP & MSTP
  • REST
  • ONVIF IP Camera
  • OPC-UA
  • SNMP
  • BEL GATT

Core Services 核心服务

通过这些服务可大体了解给定部署中连接了哪些设备,正在传输哪些数据以及EdgeX的配置方式。

可用的核心服务包括:

  • Core Data 核心数据
  • Core Command 核心命令/控制
  • Core Metadata 核心元数据
  • Registry & Config 注册和配置

Supporting Services 支持服务

包括诸如边缘分析 (也称为“本地分析”等微服务,以及典型的软件应用功能.例如记录、计划和数据清理等。

可用的支持服务包括:

  • Alerts & Notification 报警和通知
  • Rule Engine 规则引擎
  • Scheduling 计划服务

Application Services 应用服务

应用服务是指将感应到的数据从 EdgeX提取、处理/转换和发送到所选端点或应用的方式。这些服务可以是分析数据包、企业或本地应用,也可以是 YiCLOUD、 AzureloTHub、AWS loT或 Google loT Core 等云系统。

可用的应用服务包括:

  • Configurable Application Services 配置化运应用服务
  • Application Services 应用服务

通用配置

本地配置文件

以 device-sdk-go 为例,所谓本地配置文件,就是在边缘计算设备本地磁盘上的固定配置文件,一般情况下,在 cmd/res/ 目录下。

  • configuration.toml
    这个文件是 SDK 的主要配置文件,规定了数据输入/处理/输出,队列定义,profile 和 device 配置文件的所在位置;

  • profiles 目录
    这个目录存在 yaml 配置文件,定义了设备类型(profile)的资源和命令;

  • devices 目录
    这个目录存在 yaml 配置文件,定义了初始设备资源;

实时注入配置

除了可以在初始化服务时的本地配置,也可以通过 API 的方式对配置进行设置,这样的情况是灵活且方便。

注册

consul 作为注册中心;各种服务,都是自己模块的信息注册到 consul 中集中管理;这是一个隐藏服务,使用者不需要特别关心,此服务以微服务运行。