使用 OpenVINO Model Zoo 下载和转换模型 前提条件 1. 安装 pip 及 OpenVINO 开发包 2. 安装 Protocol Buffers 3. 验证安装 4. 检查 Model Zoo 5. 下载并转换 AlexNet 模型 结论 使用 OpenVINO Model Zoo 下载和转换模型 OpenVINO 是由英特尔开发的一个开源工具包，用于优化和部署深度学习模型。它特别适合在英特尔硬件上运行推理，但也支持其他平台。OpenVINO 的一个关键功能是 Model Zoo，这是一个包含预训练深度学习模型的集合，涵盖了对象检测、分类、图像分割等多种任务。 笔者将详细介绍在 Linux 系统上使用 OpenVINO Model Zoo 的步骤。我们将涵盖安装必要工具、探索可用模型、下载并转换 AlexNet 模型的完整过程。这些步骤基于 OpenVINO 2023.3 版本，并使用命令行工具完成。 前提条件 在开始之前，请确保您的 Linux 系统满足以下要求： Python 3 和 pip：需要 Python 3 以及 pip 来管理 Python 包。 OpenVINO 开发工具：这些工具是与 Model Zoo 交互的必需品。 互联网连接：用于下载工具和模型。 以下是我们将使用的关键命令： 命令 描述 apt install python3-pip 安装 Python 3 的 pip 包管理器 pip install openvino-dev==2023.3 安装 OpenVINO 开发工具（2023.3 版本） pip install protobuf==3.20.1 安装与 OpenVINO 兼容的 Protocol Buffers pip list 列出已安装的 Python 包以验证安装 omz_downloader -h 显示 omz_downloader 工具的帮助信息 omz_downloader --print_all 列出 Model Zoo 中的所有可用模型 omz_downloader --name alexnet 下载 AlexNet 模型 omz_converter --name alexnet 将 AlexNet 模型转换为 OpenVINO IR 格式 1. 安装 pip 及 OpenVINO 开发包 如果您的系统尚未安装 Python 3 的 pip，可以通过以下命令安装： apt install python3-pip 此命令确保可以安装和管理 Python 包。OpenVINO 开发包包含与 Model Zoo 交互所需的工具，例如 omz_downloader 和 omz_converter。安装 2023.3 版本的开发包： pip install openvino-dev==2023.3 确保版本号与您使用的 OpenVINO 版本匹配，以避免兼容性问题。 2. 安装 Protocol Buffers 某些模型可能需要 Protocol Buffers（protobuf）来处理模型文件，例如转换格式等。安装与 OpenVINO 2023.3 兼容的版本： pip install protobuf==3.20.1 此步骤确保您可以处理需要 protobuf 的模型。 3. 验证安装 为了确认所有工具都已正确安装，运行以下命令列出已安装的 Python 包： pip list 在输出中查找以下包，如果这些包出现在列表中，说明安装成功： 包名 版本 openvino-dev 2023.3 protobuf 3.20.1 4. 检查 Model Zoo OpenVINO Model Zoo 包含超过 200 个预训练模型，涵盖了对象检测、分类、图像分割、手写识别、文本到语音、姿势估计等多种任务。这些模型分为两类： 英特尔模型：已转换为 OpenVINO 格式。 公共模型：需要使用 OpenVINO 模型转换 API 进行转换。 要了解 omz_downloader 工具的用法，运行： omz_downloader -h usage: omz_downloader [-h] [--name PAT[,PAT...]] [--list FILE.LST] [--all] [--print_all] [--precisions PREC[,PREC...]] [-o DIR] [--cache_dir DIR] [--num_attempts N] [--progress_format {text,json}] [-j N] options: -h, --help show this help message and exit --name PAT[,PAT...] download only models whose names match at least one of the specified patterns --list FILE.LST download only models whose names match at least one of the patterns in the specified file --all download all available models --print_all print all available models --precisions PREC[,PREC...] download only models with the specified precisions (actual for DLDT networks); specify one or more of: FP16-INT8,FP32-INT1,FP32-INT8,FP16,FP32,FP16-INT1 ... -j N, --jobs N how many downloads to perform concurrently 此命令将显示工具的选项和用法，例如指定模型名称、下载目录等。要查看 Model Zoo 中所有可用模型的列表，运行： omz_downloader --print_all 此命令将输出一个详细的模型列表，您可以根据任务需求选择合适的模型： Sphereface aclnet aclnet-int8 action-recognition-0001 ... yolo-v2-ava-sparse-35-0001 yolo-v2-ava-sparse-70-0001 yolof yolox-tiny 5. 下载并转换 AlexNet 模型 在本例中，我们将下载 AlexNet 模型，这是一个用于图像分类的经典卷积神经网络。运行以下命令： omz_downloader --name alexnet 此命令会将 AlexNet 模型下载到默认目录（通常是用户主目录下的 open_model_zoo_models）。您可以通过 --download_dir 选项指定自定义下载路径。下载的模型需要转换为 OpenVINO 的中间表示（IR）格式，以便在 OpenVINO 应用程序中进行高效推理。使用 omz_converter 工具完成此操作： omz_converter --name alexnet 此命令会将 AlexNet 模型转换为 IR 格式，生成两个文件：一个 .xml 文件（描述模型结构）和一个 .bin 文件（包含模型权重）。转换后的模型可以直接用于 OpenVINO 支持的推理任务。 结论 通过以上步骤，笔者成功在 Linux 系统上安装了 OpenVINO 工具，探索了 Model Zoo，下载并转换了 AlexNet 模型。这些步骤为使用 OpenVINO Model Zoo 中的其他模型奠定了基础，使读者能够轻松集成预训练模型到深度学习应用中。
分享｜工业企业数字化转型之数据采集-西门子S7系列
目录 使用者 S7 ISO-on-TCP S7 协议配置 采集策略配置 注意事项 我司产品 产品白皮书 Modbus TCP 配置 PLC 支持 Modbus TCP 协议 配置网关 注意事项 开发者 关于 亿琪软件 西门子 S7 系列 PLC 是客户使用比较广泛且市场占有率非常高的工业现场智能自动化控制的设备，常见的型号有：S7-200 Smart, S7-300, S7-400, S7-1200, S7-1500 等。在这个系列的 PLC 中，使用比较多的数采协议有 S7 ISO-on-TCP 和 Modbus TCP，本文主要针对这两个协议进行讲解。 使用者 S7 ISO-on-TCP S7 ISO-on-TCP 以下简称 S7 协议，具体参考请到西门子官方网站查询，协议详解，并不是本文的重点内容。 S7 协议配置 首先，需要在 SIMATIC Portal 软件中将 S7 协议激活，当然，还需要配置一下具体可以支持的最大连接数，可以参考其他网站的配置手册。 其次，需要配置 PLC 设备本身的 IP 地址和端口号，默认端口号是 TCP:102； 使用相关的网关设备采集数据，需要默认配置4个参数，分别是： IP 地址：192.168.1.1 端口号：102 RACK：0 SLOT：1 以上配置完成后，如果顺利的话，应该可以直接根据 Portal 里面的点位表获取你所需要的点位数据值。 采集策略配置 首先，你需要了解 PLC 的工作原理，知道点位的缩写形式： DB1.DBX0.0：其代表的含义是 DB1 槽位，DBX0.0 是布尔型 0 寄存器的 0 位； DB3.DBD12：其代表了 DB3 槽位，DBD12 是 DWORD 12 寄存器； 其他不再举例，如果你看不懂的话，可能需要请教专业人士； 其次，需要将 PLC 获取来的数据与网关所在的系统进行数据类型的转化： bool 对应 布尔型； real 对应 Float32； 以此类推，不再举例； 然后，就是对应的采集策略和频率，具体要看业务的需要，设置合适的参数来。 注意事项 本采集 PLC 有连接数限制，一般不超过 8 个 TCP 连接； 每个连接所能承载的每个数据包的大小，有可能会出现 PDU 错误，这个需要询问采集设备厂家的工程师； 了解每个点位的采集反馈时间，据我们测算，1-3ms 是比较正常的，如果连续读取多个，要看是不是在你业务所要求的延迟范围内； 要观察 Portal 里面 PLC 设备的 CPU 和内存使用率，不要因为数据采集导致其本身业务发生问题； 其他问题，大部分是网络、配置点位 错误导致。 我司产品 亿琪软件公司针对大数据量、高性能采集方面，做了软件优化，我们的一体化网关可以最多 1秒内采集超过20000个数据点位。 工业边缘智能融合一体机产品 产品白皮书 Modbus TCP 配置 PLC 支持 Modbus TCP 协议 网上有很多配置手册可以参考，主要是将需要的 DB 段映射到 Modbus 服务上即可。 配置网关 大部分数据采集网关都能很好的支持 Modbus 协议，也不是非常复杂，建议自己多尝试。 注意事项 首先，Modbus TCP 的效率不如 S7 本身协议； Modbus 协议比较通用，业务不复杂的情况下，首选推荐； Modbus 协议对 PLC 的 CPU 和内存消耗较大，高性能的情况下慎选； PLC 支持的 Modbus 只有一个客户端可以连接，切记。 开发者 如果你在针对 S7 协议进行一些高性能开发的话，遇到问题可以通过这个文章进行排查和自我实践：PLC | 西门子 Siemens S7 ISO-on-TCP 通讯协议探究——提高数据采集效率故障分析（使用边缘计算网关） 关于 亿琪软件 上海亿琪软件有限公司成立于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
产品｜YiFUSION 工业边缘智能融合一体机和典型应用
分享｜如何高效地获取工业 PLC 数据测点/码点，为 MES 系统提供有力的数据支撑？
目录 需求出发点 典型应用分析 应用一：高频工业数据采集 客户需求： 常见问题 应用二：局部工业数据分析 客户需求 常见问题 应用三：海量、高频、多样化数据采集 YiEDGE 边缘计算软件 YiFUSION 工业边缘智能融合一体机 关于 亿琪软件 曾经，很多人天真的认为 PLC 会被更加现代化的高科技产品替代，从工业 4.0 概念提出来的十几年间，PLC 还是占据了工业应用场景中的“顶梁柱”作用。 作为物联网时代，IoT 的兴起，对工业数据采集有着强烈的需求，如何高效地采集工业数据，令很多从业人员头疼。 本文将介绍单机支持 >10000数据点秒级采集 相关的演进方案。 需求出发点 首先，就是对数据采集的频率和效率有很大要求，我们接触到的大部分客户，现在都是拿传统的 HMI 或 winCC 等软件的效率，让供应商提供几乎实时的采集效率； 其次，各种工业数据，有机器设备、有物流信息、有人员信息、有仓库信息，等，这些信息的充分融合，迫在眉睫； 再次，大数据的崛起，作为甲方爸爸而言，当然也是并不陌生，那么是不是所有的场景都需要将海量数据上传到云端（公有云或私有云）？ 最后，有没有一种解决方案，能够一并解决上面的问题呢？ 典型应用分析 应用一：高频工业数据采集 简单的说，就是纯粹的数据采集、归并、入库。看似很简单的需求，罗列出技术要素，大部分供应商都望而却步。 客户需求： 50台 PLC 管理300个机器，4000个测点，1秒级采集并写入 SQL 数据库； 入库时，按照具体的机器设备单独一个数据表，每个机器的测点数（数据库字段都不一样）； 根据业务需求，可以随时更改被机器采集配置信息，不能影响其他采集过程； 常见问题 实时采集 PLC 数据，绝大部分数采网关都达不到这样的高效率； 不能无限制的增加采集网关，成本管理要求和技术部署实施都不可靠； 数采完成，入库成了网关的难题，市面上的网关基本都是 MQTT 外发或丢进消息队列； 应用二：局部工业数据分析 相对于纯粹的 PLC 数采，局部工业数据分析会涉及到更多的被采集类型，除了各式各样的 PLC，还有 OPC-UA/DA，这是非常典型的场景。 客户需求 200台 PLC 管理500个机器，600个测点数，同样也是1秒需要入库； 数据分布在 PLC 和 OPC-UA 系统中，品类虽不多，但是异构切复杂； 部分数据来自第三方，需要完成数据对接； 数据全部收集完成存入时许数据库，为后面的数据分析做准备； 针对不同的应用车间、工序，完成对数据商业价值分析：趋势、分类、异常、故障报警、辅助决策； 常见问题 采集数据需要能够支持各种各样的数据源，且不能因为品类居多而产生效率问题； 品类再多，数据也需要归并和过滤，完成统一平台处理； 数据时间轴对应，不能因为多种数据源的原因导致数据不在同1秒内处理完成； 同样的，也不能采用很多网关来处理这些数据； 需要一套完整的、一体化的技术解决方案。 应用三：海量、高频、多样化数据采集 集合了应用一和应用二的需求和技术特点，最大的不同点就是，数据源从几百个增长到几千个，测点数也出奇的达到20万。这样如此庞大的工业应用场景还是比较罕见，每台机器设备至少有上百个甚至几百个测点，行业的特殊性，这些数据来自很多类型的数据源，还必须归并到一个虚拟资产（机器设备），作为一个整体来实现。 综合上面的要点，可以采用 YiFUSION 系列网关来实现： YiEDGE 边缘计算软件 YiFUSION 工业边缘智能融合一体机 YiFUSION 是基于 YiEDGE 边缘计算软件的框架之上，作为软硬件一体机的形态。 物理形态 功能模块 关于 亿琪软件 上海亿琪软件有限公司成立于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 | YiEDGE边缘计算（网关）框架使用 Gos7 与 西门子 PLC 通讯
目录 理解 Gos7 API 结构 Client API API AG(Automatisationsgerät) API PG(Programmiergerät) Helper API PLC 数据交互步骤 基于 EdgeX Foundry 的 S7 device service 驱动已开源 关于 亿琪软件 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 数据交互步骤 创建 PLC TCP 连接 根据测点 command 读取/写入偏移量 返回结果数据 基于 EdgeX Foundry 的 S7 device service 驱动已开源 https://www.yiqisoft.cn/blogs/edgex/517.html 关于 亿琪软件 上海亿琪软件有限公司成立于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 S7 protocol in Golang 编写自己的代码 基于 EdgeX Foundry 的 S7 device service 驱动已开源 关于 亿琪软件 欢迎关注 EdgeX Foundry 中文社区公众号(边缘计算社区)，及时获取最新资料和分享。 工业项目中，工业现场很多情况是 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] 基于 EdgeX Foundry 的 S7 device service 驱动已开源 https://www.yiqisoft.cn/blogs/edgex/517.html 关于 亿琪软件 上海亿琪软件有限公司成立于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
EdgeXFoundry平台的分层和服务为边缘设备/节点和云/企业应用之间提供了一个双向转换引擎。EdgeX 作为边缘计算平台是非常不错的选择。 主要服务介绍 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 中集中管理；这是一个隐藏服务，使用者不需要特别关心，此服务以微服务运行。
目录 ONVIF 协议 YiEDGE 边缘计算框架 管理 ONVIF 摄像头 同步到 Message Bus YiEVAS 系统 eKuiper 作为 pipeline 引擎 ONVIF 通告获取 stream rule-onvif-camera 拉流，抓帧，推理 拉流 抓帧 推理 结果输出 创建被管理摄像头 在边缘计算视频分析方面，ONVIF 协议实现了摄像头管理，YiEDGE 实现了拉流和图片输出，YiEVAS 模块 Pyairknn 实现推理。 ONVIF 协议 开放型网络视频接口论坛（英语：Open Network Video Interface Forum，简称ONVIF），是一个国际开放型网络视频产品标准网络接口开发论坛. IPC 摄像头必须支持 ONVIF 协议； 实现自动多摄像头并行处理性能要求； ONVIF Device Manager，用这个软件连接摄像头查看。 YiEDGE 边缘计算框架 YiEDGE 框架基于 EdgeX 框架做了深层次定制，实现了更加自动化的功能，增加了南向设备接口协议，增加了北向云平台接口协议。 管理 ONVIF 摄像头 采用 device onvif camera 设备层协议，对接各种支持 ONVIF 的摄像头设备； 定期探测网络中的 IPC； 轮训摄像头状态，获取 streamuri 地址；创建被管理摄像头 这里以 HK 摄像头为例，10s 轮训一次。 { "apiVersion": "v2", "statusCode": 200, "device": { "created": 1676646639846, "modified": 1676646710817, "id": "9a9a3276-cf19-4e01-908c-801a520ba5be", "name": "IPC-HK", "adminState": "UNLOCKED", "operatingState": "UP", "labels": [ "" ], "serviceName": "device-onvif-camera", "profileName": "onvif-camera", "autoEvents": [ { "interval": "10s", "onChange": false, "sourceName": "StreamUri" } ], "protocols": { "Onvif": { "Address": "192.168.123.183", "DeviceStatus": "UpWithAuth", "FirmwareVersion": "V5.7.3 build 220315", "FriendlyName": "HIKVISION DS-IPC-T12HV3-IA", "HardwareId": "88", "LastSeen": "Fri Feb 17 15:11:50 UTC 2023", "MACAddress": "c0:6d:ed:eb:cb:59", "Manufacturer": "HIKVISION", "Model": "DS-IPC-T12HV3-IA", "Port": "80", "SerialNumber": "DS-IPC-T12HV3-IA20220913AACHK56293791" } } } } streamUri 信息内容 [ { "id": "c88007b8-4316-451c-87b4-2dec7f1f540d", "origin": 1676646870752047000, "deviceName": "IPC-HK", "resourceName": "StreamUri", "profileName": "onvif-camera", "valueType": "Object", "value": "", "objectValue": { "MediaUri": { "InvalidAfterConnect": false, "InvalidAfterReboot": false, "Timeout": "PT60S", "Uri": "rtsp://192.168.123.183:554/Streaming/Channels/0?transportmode=unicast&profile=Profile_1" } } } ] 同步到 Message Bus 以上信息都会同步到数据总线； 可以自定义轮训时间； 筛选需要通告总线的 IPC； YiEVAS 系统 eKuiper 作为 pipeline 引擎 大概模式如下： |source输入->|rule规则引擎->|sink输出->| |:----|:----|:----| |onvif 通告获取|拉流，抓帧，推理|结果输出| ONVIF 通告获取 stream 这里，直接用 EdgeX 数据总线即可。 { "Name" : "EdgeXStream", "Options" : { "format" : "json", "type" : "edgex" }, "Statement" : null, "StreamFields" : null, "StreamType" : 0 } rule-onvif-camera 从 stream 获取信息，并解析 StreamUri 通告给拉流处理。 SELECT "true" as isRetImg, (json_path_query(StreamUri, "$")->MediaUri)->Uri AS rtspUrl, meta(deviceName) as deviceName FROM EdgeXStream where meta(profileName) = "onvif-camera" StreamUri 解析结果 { "deviceName": "IPC-HK", "isRetImg": "true", "rtspUrl": "rtsp://192.168.123.183:554/Streaming/Channels/0?transportmode=unicast&profile=Profile_1" } 拉流，抓帧，推理 拉流 通过 eKuiper video plugin：目前这个方式只能固定将 URI 写入配置文件，测试可以用，实际没有使用价值。 通过 YiEVAS application 实现：此处为商业代码和功能，有需要的可以咨询我们的热线： 18616669123 抓帧 可以通过图片帧，输出到 总线或 mqtt broker，进行按图片推理，也方便其他应用进行二次处理； 还可以直接拉流时对图片帧进行推理，效率很高，不经过总线的方式进行转发，前提是其他应用不需要视频流和图片； def get_frame(self): cap = cv2.VideoCapture(rtspUri) ret, frame = cap.read() if ret: image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) outputs = rknn_lite.inference(inputs=[image]) return outputs else: return None 推理 可以单独对图片进行推理，通过总线获取图片帧； 也可以在拉流过程中直接推理，具体看业务需要。 结果输出 此处结果与前面的系列文章结果类似，都是以输出到云平台为主。
目录 烧录固件 配置 SSH 登录环境 安装 Docker 运行环境 安装 EdgeX 环境 烧录固件 启动为 recovery 模式； 使用 RKDevTool 烧写所需要的固件； 配置 SSH 登录环境 进入 ADB adb shell 修改 sshd_config，增加 root 登录 PermitRootLogin yes 修改 root 密码（可选） passwd 重启 SSHD systemctl restart sshd 登录 SSH 服务器 安装 Docker 运行环境 安装 curl apt install curl 使用脚本安装 Docker curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh 安装完成大概需要 400M 存储空间。 检查 Docker 安装情况 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 安装 EdgeX 环境 下载 edgex compose git clone https://github.com/edgexfoundry/edgex-compose.git 切换 v2.3.0 版本 git checkout v2.3.0 启动 portainer 容器管理器 修改 portainer 配置文件，127.0.0.1 -> 删除 make portainer 检查 portainer 运行 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fa14745d381a portainer/portainer-ce "/portainer -H unix:…" 2 minutes ago Up 2 minutes 8000/tcp, 9443/tcp, 0.0.0.0:9000->9000/tcp portainer 登录 web 跑起 EdgeXFoundry 修改镜像，从私有库下载 cd compose-builder make run # 选择需要的容器镜像 查看 Docker 容器运行情况 docker ps 此处，应该显示所有的 已选择 容器。
技术｜RV1126 本地运行 rnkk-toolkit-lite，用 eKuiper 实现 python 视频 AI 推理
接着上一篇文章：技术｜RV1126 本地安装 rnkk-toolkit-lite，实现 python 实施 AI 推理，本文讲述如何在 RV1126 上实现视频流推理； 同时，有两种方法来实现视频分析，1:通过视频采集分析；2:通过定时图片采集分析。这里主要讲述通过 eKuiper 1.8.0 来实现图片定时抓取分析。 前提条件 准备好 RV1126 运行环境 你需要有一个可以运行 rknn 推理框架的硬件设备。 可参照上一篇文章：技术｜RV1126 本地安装 rnkk-toolkit-lite，实现 python 实施 AI 推理 搭建运行环境； 通过开放源码自己编译运行环境：https://github.com/yiqisoft/rv1126-rknn_toolkit_lite-1.7.1； 通过 Docker Hub 仓库运行环境； 如果实在无法运行，可以寻求我司的技术支持：18616669123 基础知识准备 熟悉 RKNN 相关的配置和运行环境，可参考官方文档：https://github.com/rockchip-linux/rknn-toolkit； 高性能 PC，基于 Windows 用于预编译 RKNN 模型，或基于 macOS 用于开发； Docker 开发构建 docker 镜像和运行容器的技能； Linux开发搭建HOST运行环境的技巧； Python脚本调试Python开发技巧； AI/ML 开发深度学习调试技能； GO语言编程技巧； 也就是说，你最好是一位全栈开发者。 配置过程 过程稍有些复杂和繁琐，需要的基础知识很多，请多参考各框架的官方文档。 搭建 eKuiper 运行环境 基础运行环境 官方文档在此：LF Edge eKuiper - 超轻量物联网边缘流处理软件; 主要是 使用 Python 函数插件运行 AI 算法 章节和 视频源 章节; 使用 eKuiper 官方环境，成功运行 pyai 例程在 tflite 环境下跑通推理； 创建视频分析 stream 和 rule 创建视频源 source 创建规则 rule action 可以根据自己的需求，选择合适自己的 Sink 观察结果（mqtt broker） 确保视频源采集成功，且将图片二进制发送出去； 部署 rknn 推理插件 通过开放源码仓库：https://github.com/yiqisoft/rv1126-rknn_toolkit_lite-1.7.1，下载 pyairknn 代码，修改成你需要的功能或不改； 打包压缩成 zip 文件； 上传到 eKuiper Extension 下； 确保 eKuiper 后台程序没有出错，且 RKNN 环境测试后模型正常。 创建 rknn 推理 rule 创建 rule 启动 rule，查看日志，推理成功 验证外部 mqtt broker 接收到推理结果 总结 必须很熟悉 eKuiper 运行环境，熟读官方文档，这个很重要； Docker 环境要玩的好，否则日志都不一定找得到； 插件不能有一点错误，否则看不到任何结果，代码质量要求很高； 基础运行环境的依赖库很头疼，尤其是在 RV1126 的架构是 armv7l 情况下； eKuiper 的 rule 规则用 SQL 来写，还是很有挑战性的工作，各种参数传递，没点能力理解不了； eKuiper 和 eKuiper manager 版本要一致，1.8.0； 算法精度需要自己多琢磨，可能需要训练自己的模型才能达到毕竟好的推理结果； 最后看一下 tflite 在 CPU 上推理 和 rknn 在 NPU 上推理结果对比，快了 100倍；