0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英特尔开发者套件爱克斯板与CODESYS实现软PLC配置并与外界程序通信

英特尔物联网 来源:英特尔物联网 2023-06-15 17:37 次阅读

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.2CODESYS 介绍

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 ,我们能够得到一个可以用于工业控制检测领域的一款功能强大的人工智能小型计算机。

2

前期准备

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

a46f2acc-0b5e-11ee-962d-dac502259ad0.png

图1 CODESYS 软件架构示意图

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

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

2.1开发层主机前期准备

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

CODESYS Control for LinuxSL

CODESYS Edge Gateway for Linux

Shared Memory Communication

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

a4c2e3a6-0b5e-11ee-962d-dac502259ad0.png

图2在 CODESYS 中安装软件包

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

a4db0af8-0b5e-11ee-962d-dac502259ad0.png

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

2.2设备硬件层前期准备

为了提高 AIxBoard 的适用性,本文将使用 Ubuntu 系统作为 AIxBoard 的操作系统,系统版本为 Ubuntu 20.04LTS ,这里使用的是 Canonical 为英特尔优化的版本。下载与安装教程如下:

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 与其进行通信。

a506c08a-0b5e-11ee-962d-dac502259ad0.png

图4在 AIxBoard 中预先安装好 Ubuntu 系统与 Epics

3

工程建立

3.1新建标准工程

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

a544d3fc-0b5e-11ee-962d-dac502259ad0.png

图5新建标准工程

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

a5646df2-0b5e-11ee-962d-dac502259ad0.png

图6新建标准工程选项

3.2加载所需函数库

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

SysShm,3.5.8.0 (System)

SysTypes2 Interfaces,3.5.4.0 (System)

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

a5948d16-0b5e-11ee-962d-dac502259ad0.png

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

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

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

a5b37172-0b5e-11ee-962d-dac502259ad0.pnga5d09aea-0b5e-11ee-962d-dac502259ad0.png

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

3.3建立设备通信

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

a5f149f2-0b5e-11ee-962d-dac502259ad0.png

图9与 AIxBoard 通信并将 Runtime 部署在 AIxBoard 上

经过图9的操作之后,AIxBoard 便已经成为了一个能够运行 CODESYS 的实时性系统的 PLC 了。

a6148a84-0b5e-11ee-962d-dac502259ad0.png

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

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

a642022a-0b5e-11ee-962d-dac502259ad0.png

图11 进行设备扫描与连接

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

a657c20e-0b5e-11ee-962d-dac502259ad0.png

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

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

a67b39be-0b5e-11ee-962d-dac502259ad0.png

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

4

代码编写

4.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.2编写共享内存 POU

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

a6b5da60-0b5e-11ee-962d-dac502259ad0.png

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

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

向右滑动查看完整代码

szNameRead: STRING:= 'CODESYS_MEMORY_READ';  //声明共享内存的读取内存名称
szNameWrite: STRING:= 'CODESYS_MEMORY_WRITE'; //声明共享内存的写入内存名称

向右滑动查看完整代码

其中,上面这两行语句部分所指定的名称是之后需要与 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 加入到执行程序中。

a6dfa2aa-0b5e-11ee-962d-dac502259ad0.png

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

4.3编写数据来源 POU

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

a705e3ac-0b5e-11ee-962d-dac502259ad0.png

图16 编写主程序相关函数,用于输入正弦波形

完成后,点击上方编译,编译通过后即可将程序登录下载至 AIxBoard 中。在 AIxBoard 上,编写相关 python 程序接收来自 CODESYS 传递的信号并通过 pyepics 将其发送至 Epics 中,代码如下:

import mmap
import struct
from epics import caput
import epics
import time
name="CODESYS_MEMORY_WRITE"
f= open('/dev/shm/'+name,"r")
while 1:
  f.flush()
  mm=mmap.mmap(f.fileno(),0,prot=mmap.PROT_READ)
  #print(mm.read(8))
  [number,]=struct.unpack('d',mm.read(8))
  print(number)
  #print(epics.ca.find_libca())
  caput('aiHost:xxxExample',number)
time.sleep(0.05)

向右滑动查看完整代码

5

运行结果

以管理员身份运行 Python 程序,可在 AIxBoard 上不断读取到 CODESYS 发送的数据。

a7230a9a-0b5e-11ee-962d-dac502259ad0.png

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

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

a7456c48-0b5e-11ee-962d-dac502259ad0.png

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

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

a76925ca-0b5e-11ee-962d-dac502259ad0.png

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

至此,我们已完成了将 AIxBoard 变为 PLC 并与外界程序通信的全部任务,顺利将 AIxBoard 从一台非实时性的开发板变成了一个能够用于工业控制领域的实时 PLC 控制器。能够与外界程序进行通信,使基于 AIxBoard 与CODESYS 配置而成的软 PLC 相比传统的 PLC 而言,具有了更高的灵活性,通过搭配 OpenVINO 等人工智能模型,能够实现更加智能化的控制效果。

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 英特尔
    +关注

    关注

    60

    文章

    9430

    浏览量

    168998
  • plc
    plc
    +关注

    关注

    4976

    文章

    12267

    浏览量

    455062
  • 人工智能
    +关注

    关注

    1777

    文章

    43920

    浏览量

    230767

原文标题:英特尔开发者套件爱克斯板与CODESYS实现软PLC配置并与外界程序通信 | 开发者实战

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于英特尔哪吒开发者套件平台来快速部署OpenVINO Java实战

    OpenVINO 工具套件基于OneAPI开发,可以加快高性能计算机视觉和深度学习应用开发速度的工具套件,适用于从边缘到云的各种英特尔计算平
    的头像 发表于 03-21 18:24 828次阅读
    基于<b class='flag-5'>英特尔</b>哪吒<b class='flag-5'>开发者</b><b class='flag-5'>套件</b>平台来快速部署OpenVINO Java实战

    英特尔:2025年全球AIPC将超1亿台占比20%

    英特尔行业资讯
    北京中科同志科技股份有限公司
    发布于 :2024年02月29日 09:15:26

    英特尔1nm投产时间曝光!领先于台积电

    英特尔行业芯事
    深圳市浮思特科技有限公司
    发布于 :2024年02月28日 16:28:32

    英特尔登顶2023年全球半导体榜单之首

    英特尔行业芯事
    深圳市浮思特科技有限公司
    发布于 :2024年02月01日 11:55:16

    基于英特尔® QuickAssist的®EP80579集成处理器开发套件

    采用英特尔® QuickAssist 技术的英特尔® EP80579 集成处理器的开发套件使客户能够为嵌入式、存储和通信应用创建新一代解决方案。该处理器采用片上系统 (SOC) 处理器
    发表于 11-14 08:32 0次下载
    基于<b class='flag-5'>英特尔</b>® QuickAssist的®EP80579集成处理器<b class='flag-5'>开发套件</b>

    #高通 #英特尔 #Elite 高通X Elite芯片或终结苹果、英特尔的芯片王朝

    高通英特尔苹果
    深圳市浮思特科技有限公司
    发布于 :2023年10月27日 16:46:07

    基于英特尔开发套件的AI字幕生成器设计

    市面上有很多自然语言处理模型,本文旨在帮助开发者快速将 OpenAI* 的热门 NLP 模型 Whisper 部署至英特尔 开发套件爱克斯开发
    的头像 发表于 09-27 16:59 528次阅读
    基于<b class='flag-5'>英特尔</b><b class='flag-5'>开发套件</b>的AI字幕生成器设计

    基于OpenVINO在英特尔开发套件实现眼部追踪

    本文将以训练一个眼部追踪 AI 小模型为背景,介绍从 Pytorch 自定义网络模型,到使用 OpenVINO NNCF 量化工具优化模型,并部署到英特尔开发套件爱克斯开发板 AIx
    的头像 发表于 09-18 10:11 442次阅读

    安装OpenVINO工具套件英特尔Distribution时出现错误的原因?

    安装OpenVINO™工具套件英特尔 Distribution时,出现错误: Python 3.10.0.ECHO is off. Unsupported Python version.
    发表于 08-15 08:14

    英特尔媒体加速器参考软件Linux版用户指南

    英特尔媒体加速器参考软件是用于数字标志、交互式白板(IWBs)和亭位使用模型的参考媒体播放器应用软件,它利用固定功能硬件加速来提高媒体流速、改进工作量平衡和资源利用,以及定制的图形处理股(GPU)管道解决方案。该用户指南将介绍和解释如何为Linux* 使用英特尔媒体加速器
    发表于 08-04 06:34

    英特尔通过AI参考套件加速AI发展

    优化的AI参考套件 旨在 助力开发者和数据科学家跑出创新“加速度” 最新动态 得益于英特尔与埃森哲的长期合作,英特尔现推出了一套共计34个的开源AI参考
    的头像 发表于 07-28 19:45 587次阅读
    <b class='flag-5'>英特尔</b>通过AI参考<b class='flag-5'>套件</b>加速AI发展

    英特尔AI参考套件,助力企业高效运行AI工作负载

    优化的AI参考套件旨在助力开发者和数据科学家跑出创新“加速度”。 最新动态:得益于英特尔与埃森哲的长期合作,英特尔现推出了一套共计34个的开源AI参考
    的头像 发表于 07-27 13:05 230次阅读
    <b class='flag-5'>英特尔</b>AI参考<b class='flag-5'>套件</b>,助力企业高效运行AI工作负载

    使用英特尔开发者套件搭建RTMP流媒体服务器

    本文将会介绍如何使用英特尔 开发者套件——爱克斯开发板快速搭建 RTMP 流媒体服务器,并利用 FFmpeg*
    的头像 发表于 07-18 15:58 420次阅读
    使用<b class='flag-5'>英特尔</b><b class='flag-5'>开发者</b><b class='flag-5'>套件</b>搭建RTMP流媒体服务器

    英特尔开发者套件爱克斯板与CODESYS实现PLC配置并与外界程序通信

    然而,虽然爱克斯板具有如上的诸多优点。但由于其运行的Windows或者Linux系统都是非实时性的操作系统,难以用于对实时性要求较高的工业环境中。而实时性的PLC环境通常较为封闭,难以使用python,Openvino等外界
    的头像 发表于 06-28 16:49 1136次阅读
    <b class='flag-5'>英特尔</b><b class='flag-5'>开发者</b><b class='flag-5'>套件</b><b class='flag-5'>爱克斯</b>板与<b class='flag-5'>CODESYS</b><b class='flag-5'>实现</b>软<b class='flag-5'>PLC</b><b class='flag-5'>配置</b><b class='flag-5'>并与</b><b class='flag-5'>外界</b><b class='flag-5'>程序</b><b class='flag-5'>通信</b>

    AI爱克斯开发板上使用OpenVINO加速YOLOv8目标检测模型

    《在AI爱克斯开发板上用OpenVINO加速YOLOv8分类模型》介绍了在AI爱克斯开发板上使用OpenVINO 开发套件部署并测评YOLO
    的头像 发表于 05-26 11:03 723次阅读
    AI<b class='flag-5'>爱克斯</b><b class='flag-5'>开发</b>板上使用OpenVINO加速YOLOv8目标检测模型