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

本文主要是介绍英特尔开发者套件与CODESYS实现软PLC配置并与外界程序通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

完成人:中国科学院大学 孙翔宇

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

目录

1. 序言

1.1 英特尔开发者套件介绍

1.2 CODESYS介绍

2. 前期准备

2.1  开发层主机前期准备

2.2 设备硬件层前期准备

3. 工程建立

3.1 新建标准工程

3.2 加载所需函数库

3.3  建立设备通信

4. 代码编写

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

4.2  编写共享内存POU

4.3 编写数据来源POU

5. 运行结果


1. 序言

1.1 英特尔开发者套件介绍

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

该开发板是类树莓派的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结合英特尔开发者套件,我们能够得到一个可以用于工业控制检测领域的一款功能强大的人工智能小型计算机。

2. 前期准备

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

图1  CODESYS软件架构示意图

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

2.1  开发层主机前期准备

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

  1. CODESYS Control for Linux SL
  2. CODESYS Edge Gateway for Linux
  3. Shared Memory Communication

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

图2 在CODESYS中安装软件包

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

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

2.2 设备硬件层前期准备

为了提高英特尔开发者套件的适用性,本文将使用Ubuntu系统作为英特尔开发者套件的操作系统,系统版本为Ubuntu 20.04LTS,这里使用的是Canonical为Intel优化的版本。下载与安装教程如下:系统安装 - 英特尔开发套件系统安装 - 系统安装 - 英特尔开发套件开发指南 (xzsteam.com)系统安装 - 英特尔开发套件开发指南 (xzsteam.com)。

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

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

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

3. 工程建立

3.1 新建标准工程

在CODESYS中,选择文件-新建工程,命名工程为英特尔开发者套件,选择新建标准工程。

图5 新建标准工程

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

图6 新建标准工程选项

3.2 加载所需函数库

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

· SysShm,3.5.8.0 (System)

· SysTypes2 Interfaces,3.5.4.0 (System)

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

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

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

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

    

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

3.3  建立设备通信

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

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

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

图10 在英特尔开发者套件上安装好的CODESYS Runtime程序文件

新建项目后,点击左下角设备进入设备树,双击Device后,点击扫描网络进行设备连接,选择英特尔开发者套件为控制器的网络路径。

图11 进行设备扫描与连接

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

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

登陆完成后,将会自动下载程序代码至英特尔开发者套件上,并且可以在device中看到设备信息。

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

4. 代码编写

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

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

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

TYPE Str_ParaToHMI :STRUCTfOut: LREAL;END_STRUCTEND_TYPETYPE Str_ParaFromHMI :STRUCTfIn: LREAL;END_STRUCTEND_TYPE

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

VAR_GLOBALGetPara:Str_ParaFromHMI;SetPara:Str_ParaToHMI;END_VAR

4.2  编写共享内存POU

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

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

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

局部变量声明如下:

PROGRAM SharedMemoryVARbStart: 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 MemoryIF NOT bStart THENReadHandle:= 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 THENbStart:= TRUE;END_IFEND_IF//读入数据IF RTS_INVALID_HANDLE <> ReadHandle THENSMRead:= SysSharedMemoryRead(hShm:= ReadHandle,                                                 //读取内存的设备句柄ulOffset:= ulOffsetRead,                                //读取数据的偏移地址pbyData:= ADR(GVL.GetPara),                    //指向读取数据的缓冲区ulSize:= SIZEOF(Str_ParaFromHMI),          //读取数据的字节大小         pResult:= ADR(ResultRead[1]));                   //返回执行的错误码END_IF//写出数据IF RTS_INVALID_HANDLE <> WriteHandle THENSMWrite:= SysSharedMemoryWrite(hShm:= WriteHandle,                                                 //写入内存的设备句柄ulOffset:= ulOffsetWrite,                                //写入数据的偏移地址pbyData:= ADR(GVL.SetPara),                     //指向写入数据的缓冲区ulSize:= SIZEOF(Str_ParaToHMI),   //写入数据的字节大小pResult:= ADR(ResultWrite[2]));                  //返回执行的错误码END_IF

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

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

4.3 编写数据来源POU

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

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

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

在英特尔开发者套件上,编写相关python程序接收来自CODESYS传递的信号并通过pyepics将其发送至Epics中,代码如下:

import mmapimport structfrom epics import caputimport epicsimport timename="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程序,可在英特尔开发者套件上不断读取到CODESYS发送的数据。

图18 英特尔开发者套件上最终运行结果,左侧为接收到的数据量

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

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

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

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

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

文中所涉及到的所有工程文件与代码均已开源于github,网址为:https://github.com/EHU0/Codesys_ShareMemory_On_AIxBoard.git

这篇关于英特尔开发者套件与CODESYS实现软PLC配置并与外界程序通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/371354

相关文章

IDEA中配置Tomcat全过程

《IDEA中配置Tomcat全过程》文章介绍了在IDEA中配置Tomcat的六步流程,包括添加服务器、配置部署选项、设置应用服务器及启动,并提及Maven依赖可能因约定大于配置导致问题,需检查依赖版本... 目录第一步第二步第三步第四步第五步第六步总结第一步选择这个方框第二步选择+号,找到Tomca

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Win10安装Maven与环境变量配置过程

《Win10安装Maven与环境变量配置过程》本文介绍Maven的安装与配置方法,涵盖下载、环境变量设置、本地仓库及镜像配置,指导如何在IDEA中正确配置Maven,适用于Java及其他语言项目的构建... 目录Maven 是什么?一、下载二、安装三、配置环境四、验证测试五、配置本地仓库六、配置国内镜像地址

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R