开发者实战 | 使用 CODESYS 在英特尔开发套件 AIxBoard 上配置软 PLC 并实现 AI 视频分析辅助控制

点击蓝字

关注我们,让开发变得更有趣

作者:孙翔宇 中国科学院大学

指导教师:庄建 英特尔边缘计算创新大使  中国科学院高能物理研究所 研究员

4f0af83c8a0f664ee84227fb22d97ce8.png

1. 序言

1.1

爱克斯板介绍

英特尔开发套件 AIxBoard™ 爱克斯板是一款功能强大的小型计算机,专为支持入门级边缘人工智能应用程序和设备而设计。无论是在人工智能学习、开发还是实训等应用场景下,它都能完美胜任。

该开发板是类树莓派的 x86 主机,可支持 Linux Ubuntu 及完整版 Windows 操作系统。板载一颗英特尔 4 核处理器,最高运行频率可达 2.9 GHz,且内置核显(iGPU),板载 64GB eMMC 存储及 LPDDR4x 2933MHz(4GB/6GB/8GB),内置蓝牙和 Wi-Fi 模组,支持 USB 3.0、HDMI 视频输出、3.5mm 音频接口,1000Mbps 以太网口。完全可把它作为一台 mini 小电脑来看待,且其可集成一块 Arduino Leonardo 单片机,可外拓各种传感器模块。

此外, 其接口与 Jetson Nano 载板兼容,GPIO 与树莓派兼容,能够最大限度地复用树莓派、Jetson Nano 等生态资源,无论是摄像头物体识别,3D 打印,还是 CNC 实时插补控制都能稳定运行。可作为边缘计算引擎用于人工智能产品验证、开发;也可以作为域控核心用于机器人产品开发。

然而,虽然爱克斯板具有如上的诸多优点。但由于其运行的 Windows 或者 Linux 系统都是非实时性的操作系统,难以用于对实时性要求较高的工业环境中。而实时性的 PLC 环境通常较为封闭,难以使用 python,OpenVINO™ 等外界程序。

1.2

CODESYS 介绍

CODESYS 是一款工业自动化领域的一款开发编程系统( CODESYS 是 Code System 的简写),应用领域涉及工厂自动化、汽车自动化、嵌入式自动化、过程自动化和楼宇自动化等等。CODESYS 软件可以分为两个部分,一部分是运行在各类硬件中的 RTE(Runtime Environment),另一部分是运行在 PC 机上的 IDE 。因此 CODESYS 的用户既包括生产 PLC 、运动控制器的硬件厂商,也包括最终使用 PLC 、运动控制器的用户。

目前全球有近 400 家的控制系统生产制造商是 CODESYS 的用户:如 ABB、施耐德电气 SchneiderElectric 、伊顿电气 EATON 、博世力士乐 Rexroth、倍福 BECKHOFF、科控 KEBA、日立 HITACHI、三菱自动化 MITSUBISHI、欧姆龙 OMRON 、研华科技、凌华科技 ADLINK、新汉电脑、和利时集团、SUPCON 中控集团、步科自动化 KINCO 、深圳雷赛、汇川技术、深圳合信、深圳英威腾、华中数控、固高科技等等。

简单来说,CODESYS 可以说是 PLC 界的安卓,许多 PLC 厂商都以 CODESYS 作为其 PLC 的内核。

此外,CODESYS 可以将任何一款 arm 架构或者 x86 架构的处理器变为实时的 PLC 系统。CODESYS 结合英特尔开发套件 AIxBoard ,我们能够得到一个可以用于工业控制检测领域的一款功能强大的人工智能小型计算机。

1.3

实验仿真介绍

通常而言,如果想要进行 CODESYS 控制实验,需要购买支持 CODESYS 的 PLC 控制器、支持 EtherCAT 通讯协议的步进电机驱动器、步进电机、滚珠丝杠平台、以及对整套系统的供电电源。购置一整套实验设备不仅费时费力费钱,并且占用空间极大,不便于初学者进行学习。

通过使用 CODESYS 对英特尔开发套件 AIxBoard 的软 PLC 配置,并结合着 Factory 软件仿真,能够极大的减少学习成本。

2. 前期准备

CODESYS 软件分三层架构,可用下图来表示:

ae88cdbcc88928ccc82c58639b7d8c62.jpeg

图 1 CODESYS 软件架构示意图

其中开发层(IDE)可使用 CODESYS Development System(具有完善的在线编程和离线编程功能)、编译器及其配件组件、可视化界面编程组件等对 CODESYS 程序进行开发与部署。本文使用的版本为 CODESYS V3.5 SP17,下载与安装教程可见:CODESYS 3.5.17.0 软件安装_codesys 安装教程_小 Co 的博客 - CSDN 博客。

https://blog.csdn.net/goo__gle/article/details/116987188

(复制链接到浏览器打开)

2.1

开发层主机前期准备

在安装完 CODESYS 后,还需要根据需求下载安装部分 CODESYS 软件包,由于本文需要在运行有 Ubuntu 的英特尔开发套件 AIxBoard 上部署 CODESYS Runtime ,并通过共享内存实现与外界程序通信,故需安装的软件包有以下几种:

  1. CODESYS Control for Linux SL

  2. CODESYS Edge Gateway for Linux

  3. Shared Memory Communication

完成安装后,可在包管理器中查看到这三个软件包。

4d00be6485d8d6110039dff8486b7427.png

图2 在 CODESYS 中安装软件包

安装完成三个软件包后,重启 CODESYS ,随后能够在工具中最下面一行找到 Update Linux ,点击后会打开一个能够与安装了 Linux 系统的英特尔开发套件 AIxBoard 进行通信部署的界面。

3936bc144a56bc4828aa956d0446dd11.png

图 3 安装软件包完成后的效果

2.2

设备硬件层前期准备

为了提高英特尔开发套件 AIxBoard 的适用性,本文将使用 Ubuntu 系统作为英特尔开发套件 AIxBoard 的操作系统,系统版本为 Ubuntu 20.04LTS,这里使用的是 Canonical 为英特尔优化的版本。

下载与安装教程如下:

系统安装 - 英特尔开发套件AIxBoard 开发指南(xzsteam.com):

https://www.xzsteam.com/docs/osinstallation.html

(复制链接到浏览器打开)

除此之外,安装完成系统后,还需安装 python 以进行共享内存通信,本文使用的 python 版本为 3.8.10。

为验证 CODESYS 能够与外界程序通信,同时也安装了 Epics 。Epics 全称为 Experimental Physics and Industrial Control System 即“实验物理及工业控制系统”,是上世纪90年代初由美国洛斯阿拉莫斯国家实验室(LANL)和阿贡国家实验室(ANL)等联合开发的大型控制软件系统。安装完成 Epics 后,需使其在后台运行,后续将通过 CODESYS 与其进行通信。

ddcd1479a8af9f8e0c438bf2a3c64a6d.png

图 4 在英特尔开发套件 AIxBoard 中预先安装好 Ubuntu 系统与 Epics

2.3

实验仿真前期准备

进入 factory i/o 的官网,点击 Try for free 能够免费使用 factory i/o 30 天。

https://factoryio.com/features

(复制链接到浏览器打开)

d6d52feb7507a73153bb93581e50d115.png

图 5 在 factory i/o 官网上下载

安装完成后,打开 factory I/O 能够看到下面有着对于 CODESYS 的使用教程:

1d29e94089e97099834bd307a7d29f7b.png

图 6 打开 factory IO 能够看到下面对于 CODESYS 的使用教程

3. 工程建立

3.1

CODESYS 工程建立(位于 PC 端)

3.1.1

新建标准工程

在 CODESYS 中,选择文件-新建工程,命名工程为 AIxBoard ,选择新建标准工程。

3c19cb377ebc74d10a0499d641876ae9.png

图7 新建标准工程

在弹出的标准工程对话框中,选择设备为 CODESYS Control for Linux SL ,选择结构化文本(ST)作为编程语言。

843d5a142cc860194c03e3795843d6c7.png

图 8 新建标准工程选项

3.1.2

加载所需函数库

将我们刚刚安装的软件包中的所需函数库加载到此工程中,需要添加的函数库有:

  • SysShm,3.5.8.0 (System)

  • SysTypes2 Interfaces,3.5.4.0 (System)

打开库管理器(Library Manager),选择“添加库(Add Library)”,点“高级(Advanced...)”;

49040929fd19d1c0ab9bc66d118ae228.png

图 9 在工程中加载刚刚安装好的函数库

在搜索框(String for a fulltext search...)中分别输入 SysShm 和 SysTypes 搜索添加 SysShm, 3.5.8.0 和 SysTypes2 Interfaces , 3.5.4.0 

选中搜索到的库,点 “OK” 确认添加

06cbfb04831c4e2662a05c0ad95ca098.png

c5f5ff1982d9f334cf7696ef5cdb1b89.png

图 10 搜索并添加所需的两个函数库

3.1.3

建立设备通信

点击工具 - Update Linux 打开与 Linux 通信的界面,在左侧输入用户名和密码,搜索到 AIxBoard 的 IP 后,点击 Install 将 CODESYS Runtime 安装至 AIxBoard 中,安装文件可以在 AIxBoard 的 /etc/ 中找到。

c53da9afc62a350de116ce603e558ce7.png

图 11 与英特尔开发套件 AIxBoard 通信并将 Runtime 部署在 AIxBoard 上

经过图 11 的操作之后,英特尔开发套件 AIxBoard 便已经成为了一个能够运行 CODESYS 的实时性系统的 PLC 了。

dfef7749e0c52f70f3e73d6e702d5a85.png

图 12 在 AIxBoard 上安装好的 CODESYS Runtime 程序文件

新建项目后,点击左下角设备进入设备树,双击 Device 后,点击扫描网络进行设备连接,选择 AIxBoard 为控制器的网络路径。

1bbeb2ab9fd16d951945b75fc1cdda21.png

图 13 进行设备扫描与连接

输入账号密码进行登录,如果是第一次登陆,还需要另外设置一次登录密码。

d45d4d2a95d6383d7ceefa12823ea848.png

图 14 在 CODESYS Runtime 上登录并自动下载代码

登陆完成后,将会自动下载程序代码至 AIxBoard 上,并且可以在 device 中看到设备信息。

73915bb15e54a598966a47f1a2c60fe9.png

图 15 连接完成后的设备网络图

3.2

OpenVINO™ 工具包部署

(位于AIxBoard端)

3.2.1

OpenVINO™ 介绍

OpenVINO™ 是英特尔基于自身现有的硬件平台开发的一种可以加快高性能计算机视觉和深度学习视觉应用开发速度工具套件,支持各种英特尔平台的硬件加速器上进行深度学习,并且允许直接异构执行,是一款可轻松实现“一次写入,处处部署”的开源工具套件。

通过使用 OpenVINO™ 能够极大简化对于机器视觉和深度学习等算法模型框架的部署过程,并且最大程度上开发英特尔的硬件平台的潜力。

3.2.2

OpenVINO™ 下载与安装

在英特尔开发套件 AIxBoard 上,仅需通过四行简单的代码即可完成 OpenVINO™ 部署。

首先需要进入英特尔官网中,OpenVINO™ 工具套件的下载界面:

https://www.intel.cn/content/www/cn/zh/developer/tools/openvino-toolkit/download.html

(复制链接到浏览器打开)

进入后,配置好所需使用的版本、环境、操作系统、下载方式以及所需使用的框架即可在下方看到相应的下载方式。

c840dfebacc8f295c033478f3b98a3df.png

图 16

为了便于之后在 python 上同时完成 codesys 内存数据读取写入以及机器视觉识别,使用 pytorch 作为模型训练框架,使用 pip 作为下载方式。

下载代码如下:

第 1 步:创建虚拟环境。

python3 -m venv openvino_env

左滑查看更多

第 2 步:激活虚拟环境。

source openvino_env/bin/activate

左滑查看更多

第 3 步:将 pip 升级到最新版本。

python -m pip install --upgrade pip

左滑查看更多

第 4 步:下载并安装程序包。

pip install openvino-dev[pytorch]==2022.3.1

左滑查看更多

4. 代码编写

4.1

CODESYS 代码编写

4.1.1 

定义数据单元类型与全局变量

右击 Application ,选择添加 DUT(Data Unit Type,数据单元类型), DUT 为自定义的数据类型,本文中新建自定义的数据单元类型目的为通过不同类型的数据单元,将输出至外部程序的变量与从外部程序输入进来的变量分离开。

新建两个数据类型分别为:Str_ParaFromHMI与Str_ParaToHMI,目前结构体内部仅包含一个长整型格式的数据(LREAL),可根据实际需求修改或添加。

TYPE Str_ParaToHMI :
STRUCT
  fOut: LREAL;
END_STRUCT
END_TYPE


TYPE Str_ParaFromHMI :
STRUCT
  fIn: LREAL;
END_STRUCT
END_TYPE

左滑查看更多

右击 Application 添加全局变量列表 GVL(Global Var List) ,并将刚刚新建的两种数据类型实例化,并添加至全局变量中。实例化的名称分别为 GetPara 与 SetPara。其中 GetPara 用于从外部程序中获取数据进入 CODESYS, SetPara 用于将 CODESYS 中的数据输出至外部程序中。

VAR_GLOBAL
  GetPara:Str_ParaFromHMI;
  SetPara:Str_ParaToHMI;
END_VAR

左滑查看更多

4.1.2

编写共享内存 POU

右击 Application 添加 POU(Program organizational unit,程序组织单元),命名为 Sharedmemory 。

ca45a2ee18a8e2269375e2757e48d8a2.png

图 17 新增程序组织单元的相关配置

POU 上方为局部变量声明区域,下方为结构化文本程序区域。

局部变量声明如下:

PROGRAM SharedMemory
VAR
  
  bStart: BOOL:= FALSE;
  ReadHandle: RTS_IEC_HANDLE:= RTS_INVALID_HANDLE;
  WriteHandle: RTS_IEC_HANDLE:= RTS_INVALID_HANDLE;
  szNameRead: STRING:= 'CODESYS_MEMORY_READ';    //声明共享内存的读取内存名称
  szNameWrite: STRING:= 'CODESYS_MEMORY_WRITE';  //声明共享内存的写入内存名称
  ulPhysicalAddressRead: __UXINT:= 0;//读取数据的偏移地址,0为从头读取
  ulPhysicalAddressWrite: __UXINT:= 0;//写入数据的偏移地址,0为从头写入
  ulSizeRead: __UXINT:= 1024;//读取空间大小
  ulSizeWrite: __UXINT:= 1024;//写入空间大小
  ResultRead: ARRAY[0..2] OF RTS_IEC_RESULT;    //返回运行错误码,0中为运行错误码,1中为读取执行错误码,2中为写出执行错误码
  ResultWrite: ARRAY[0..2] OF RTS_IEC_RESULT;     //返回运行错误码,0中为运行错误码,1中为读取执行错误码,2中为写出执行错误码
  
  SMRead: __UXINT;
  SMWrite: __UXINT;
  ulOffsetRead: __UXINT:= 0;
  ulOffsetWrite: __UXINT:= 0;
  
END_VAR

左滑查看更多

其中,下方这一部分语句所指定的名称是之后需要与 python 中读取共享内存中数据一致的文件名称。可任意修改但是应与 python 中程序一致,共享内存的文件将会保存在 /dev/shm/ 中。

下方 ST 程序部分编写代码如下:

//Init Memory
IF NOT bStart THEN
  ReadHandle:= SysSharedMemoryCreate(pszName:= szNameRead, ulPhysicalAddress:= ulPhysicalAddressRead, pulSize:= ADR(ulSizeRead), pResult:= ADR(ResultRead[0]));
  WriteHandle:= SysSharedMemoryCreate(pszName:= szNameWrite, ulPhysicalAddress:= ulPhysicalAddressWrite, pulSize:= ADR(ulSizeWrite), pResult:= ADR(ResultWrite[0]));
  IF RTS_INVALID_HANDLE <> ReadHandle AND RTS_INVALID_HANDLE <> WriteHandle THEN
    bStart:= TRUE;
  END_IF
END_IF


//读入数据
IF RTS_INVALID_HANDLE <> ReadHandle THEN
  SMRead:= SysSharedMemoryRead(
  hShm:= ReadHandle,           //读取内存的设备句柄
  ulOffset:= ulOffsetRead,      //读取数据的偏移地址 
  pbyData:= ADR(GVL.GetPara),     //指向读取数据的缓冲区
  ulSize:= SIZEOF(Str_ParaFromHMI),   //读取数据的字节大小  
  pResult:= ADR(ResultRead[1]));    //返回执行的错误码
END_IF


//写出数据
IF RTS_INVALID_HANDLE <> WriteHandle THEN
  SMWrite:= SysSharedMemoryWrite(
  hShm:= WriteHandle,         //写入内存的设备句柄
  ulOffset:= ulOffsetWrite,       //写入数据的偏移地址
  pbyData:= ADR(GVL.SetPara),     //指向写入数据的缓冲区
  ulSize:= SIZEOF(Str_ParaToHMI),   //写入数据的字节大小
  pResult:= ADR(ResultWrite[2]));    //返回执行的错误码
END_IF

左滑查看更多

在 Maintask 中调用编辑好的 POU,将此 POU 加入到执行程序中。

f67c7b3f7efae4266d0289cb4c27f3ba.png

图 18 在任务配置中调用编写好的程序

4.1.3

编写数据来源 POU

在主程序 PLC_RPG 中添加正弦数据函数,不断向 SetPara 中发送正弦波数据。

5a59474e8fdcded0a713534940bbe7d8.png

图 19 编写主程序相关函数,用于输入正弦波形以检测连接情况

完成后,点击上方编译,编译通过后即可将程序登录下载至英特尔开发套件 AIxBoard 中。

4.2

仿真模型连接

在 factory 上通过右侧菜单栏将所需使用的元器件直接拖入场景中,建立仿真模型。

48b69808c0679e7787a046311a75afac.png

图 20

为使得能够更好的展示英特尔开发套件 AIxBoard 的强大视频处理能力,选用不同的工件作为识别物体。当检测到目标工件时,控制搬运设备将目标工件从流水线上移动至指定位置。

在完成模型搭建后,需将搬运设备与流水线的控制接口与 CODESYS 上的变量相连接。具体连接配置过程可参考以下教程:

http://bbs.inovance.com/t-16948.html

(复制链接到浏览器打开)

4.3

AIxBoard 代码编写

4.3.1

数据传递代码

在英特尔开发套件 AIxBoard 上,编写相关 python 程序,通过读取共享内存中的文件内容,来接收来自 CODESYS 传递的信号,并将其传递至机器视觉算法中,代码如下:

import mmap
import struct
import time
read_Name="CODESYS_MEMORY_WRITE"
write_Name="CODESYS_MEMORY_READ"
file_Read= open('/dev/shm/'+read_Name,"r")
file_Write=open('/dev/shm/'+write_Name,"wr")
for i in range(5):
output=random.randint(1,50)
while 1:
    file_Read.flush()
    mmr=mmap.mmap(file_Read.fileno(),0,prot=mmap.PROT_READ)
    #print(mmr.read(8))
    [input,]=struct.unpack('d',mmr.read(8))
print(input)
file_Write.flush()
output_text=f.write(str(output)+"\n")
#print(output_text)
time.sleep(0.05)

左滑查看更多

input 中放置的是来自 codesys 的输入信息,output 中放置的是准备输出至 codesys 中的信息。通过调用此 python 代码,可以实现向 CODESYS 发送任何所需的指令或者获取任何来自 CODESYS 的信息。

4.3.2

视觉识别代码

视觉识别部分使用 yolov5 模型进行目标模型检测, YOLO 的全称是 you only look once,指只需要浏览一次就可以识别出图中的物体的类别和位置。通过使用 YOLO 模型,能够识别出目标物体的类别、位置、大小等信息。通过识别物体的类别能够判定出是否是我们所需要进行搬运的物件,通过获取位置、大小等信息能够进一步建模出物体的空间位置,并以此来控制搬运装置。

5. CODESYS 与外界程序通信验证

以管理员身份运行 python 程序,可在英特尔开发套件 AIxBoard 上不断读取到 CODESYS 发送的数据。

99427f2d501daa4d057b66a51f983bec.png

图 21 AIxBoard 上最终运行结果,左侧为接收到的数据量

同时在 CODESYS 中可建立信号跟踪器,检测发送出的数据波形。

2c31b0d689c753ffb6dfe25b946a303a.png

图 22 信号跟踪器上显示的 CODESYS 中发出的数据波形

通过新建 CS-Studio 界面,可以从 Epics 中查看数据,验证 CODESYS 中发送出来的数据的正确性。

41319445f5d3f83502e47c9440a2edb4.png

图 23 在 CS-Studio 界面上监视到的 Epics 网络中 PV 量的变化波形

至此,我们已在英特尔开发套件 AIxBoard上配置了软 PLC ,顺利将英特尔开发套件 AIxBoard 从一台非实时性的开发板变成了一个能够用于工业控制领域的实时 PLC 控制器,并且使其能够与外界进行通信。通过以上步骤,能够使基于英特尔开发套件 AIxBoard 与 CODESYS 配置而成的软 PLC 相比传统的 PLC 而言,具有了更高的灵活性,通过搭配 OpenVINO™ 等人工智能模型,能够实现更加智能化的控制效果。

文中所涉及到的所有工程文件与代码均已开源于 github,网址为:

https://github.com/EHU0/Codesys_ShareMemory_On_AIxBoard.git

(复制链接到浏览器打开)

OpenVINO™

--END--

你也许想了解(点击蓝字查看)⬇️➡️ OpenVINO™ 2023.2 发布:让生成式 AI 在实际场景中更易用➡️ 开发者实战 | 介绍OpenVINO™ 2023.1:在边缘端赋能生成式AI➡️ 基于 ChatGLM2 和 OpenVINO™ 打造中文聊天助手➡️ 基于 Llama2 和 OpenVINO™ 打造聊天机器人➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能➡️ 5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能➡️ OpenVINO™2023.0实战 | 在 LabVIEW 中部署 YOLOv8 目标检测模型➡️ 开发者实战系列资源包来啦!➡️ 以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC
➡️ 还不知道如何用OpenVINO™作画?点击了解教程。
扫描下方二维码立即体验 
OpenVINO™ 工具套件 2023.2

点击 阅读原文 立即体验OpenVINO 2023.2

fecff2d4bfd209fe4c4e3a095114c8a3.png

文章这么精彩,你有没有“在看”?

猜你喜欢

转载自blog.csdn.net/OpenVINOCC/article/details/134680483