序言
愛(ài)克斯板介紹
AIxBoard愛(ài)克斯板開(kāi)發(fā)者套件是一款功能強(qiáng)大的小型計(jì)算機(jī),專(zhuān)為支持入門(mén)級(jí)邊緣人工智能應(yīng)用程序和設(shè)備而設(shè)計(jì)。無(wú)論是在人工智能學(xué)習(xí)、開(kāi)發(fā)還是實(shí)訓(xùn)等應(yīng)用場(chǎng)景下,它都能完美勝任。
該開(kāi)發(fā)板是類(lèi)樹(shù)莓派的x86主機(jī),可支持Linux Ubuntu及 完整版Windows操作系統(tǒng)。板載一顆英特爾4核處理器,最高運(yùn)行頻率可達(dá)2.9 GHz,且內(nèi)置核顯(iGPU),板載 64GB eMMC存儲(chǔ)及LPDDR4x 2933MHz(4GB/6GB/8GB),內(nèi)置藍(lán)牙和Wi-Fi模組,支持USB 3.0、HDMI視頻輸出、3.5mm音頻接口,1000Mbps以太網(wǎng)口。完全可把它作為一臺(tái)mini小電腦來(lái)看待,且其可集成一塊Arduino Leonardo單片機(jī),可外拓各種傳感器模塊。
此外, 其接口與Jetson Nano載板兼容,GPIO與樹(shù)莓派兼容,能夠最大限度地復(fù)用樹(shù)莓派、Jetson Nano等生態(tài)資源,無(wú)論是攝像頭物體識(shí)別,3D打印,還是CNC實(shí)時(shí)插補(bǔ)控制都能穩(wěn)定運(yùn)行。可作為邊緣計(jì)算引擎用于人工智能產(chǎn)品驗(yàn)證、開(kāi)發(fā);也可以作為域控核心用于機(jī)器人產(chǎn)品開(kāi)發(fā)。
然而,雖然愛(ài)克斯板具有如上的諸多優(yōu)點(diǎn)。但由于其運(yùn)行的Windows或者Linux系統(tǒng)都是非實(shí)時(shí)性的操作系統(tǒng),難以用于對(duì)實(shí)時(shí)性要求較高的工業(yè)環(huán)境中。而實(shí)時(shí)性的PLC環(huán)境通常較為封閉,難以使用python,Openvino等外界程序。
CODESYS介紹
CODESYS是一款工業(yè)自動(dòng)化領(lǐng)域的一款開(kāi)發(fā)編程系統(tǒng)(CODESYS是Code System的簡(jiǎn)寫(xiě)),應(yīng)用領(lǐng)域涉及工廠(chǎng)自動(dòng)化、汽車(chē)自動(dòng)化、嵌入式自動(dòng)化、過(guò)程自動(dòng)化和樓宇自動(dòng)化等等。CODESYS軟件可以分為兩個(gè)部分,一部分是運(yùn)行在各類(lèi)硬件中的RTE(Runtime Environment),另一部分是運(yùn)行在PC機(jī)上的IDE。因此CODESYS的用戶(hù)既包括生產(chǎn)PLC、運(yùn)動(dòng)控制器的硬件廠(chǎng)商,也包括最終使用PLC、運(yùn)動(dòng)控制器的用戶(hù)。
目前全球有近400家的控制系統(tǒng)生產(chǎn)制造商是CODESYS的用戶(hù):如ABB、施耐德電氣SchneiderElectric、伊頓電氣EATON、博世力士樂(lè)Rexroth、倍福BECKHOFF、科控KEBA、日立HITACHI、三菱自動(dòng)化MITSUBISHI、歐姆龍OMRON、研華科技、凌華科技ADLINK、新漢電腦、和利時(shí)集團(tuán)、SUPCON 中控集團(tuán)、步科自動(dòng)化KINCO、深圳雷賽、匯川技術(shù)、深圳合信、深圳英威騰、華中數(shù)控、固高科技等等。
簡(jiǎn)單來(lái)說(shuō),CODESYS可以說(shuō)是PLC界的安卓,許多PLC廠(chǎng)商都以CODESYS作為其PLC的內(nèi)核。
此外,CODESYS可以將任何一款arm架構(gòu)或者x86架構(gòu)的處理器變?yōu)閷?shí)時(shí)的PLC系統(tǒng)。CODESYS結(jié)合AIxBoard,我們能夠得到一個(gè)可以用于工業(yè)控制檢測(cè)領(lǐng)域的一款功能強(qiáng)大的人工智能小型計(jì)算機(jī)。
前期準(zhǔn)備
CODESYS軟件分三層架構(gòu),可用下圖來(lái)表示:

| CODESYS軟件架構(gòu)示意圖
其中開(kāi)發(fā)層(IDE)可使用CODESYS Development System(具有完善的在線(xiàn)編程和離線(xiàn)編程功能)、編譯器及其配件組件、可視化界面編程組件等對(duì)CODESYS程序進(jìn)行開(kāi)發(fā)與部署。本文使用的版本為CODESYS V3.5 SP17,下載與安裝教程可見(jiàn):CODESYS 3.5.17.0 軟件安裝_codesys安裝教程_小 Co的博客-CSDN博客。
開(kāi)發(fā)層主機(jī)前期準(zhǔn)備
在安裝完CODESYS后,還需要根據(jù)需求下載安裝部分CODESYS軟件包,由于本文需要在運(yùn)行有Ubuntu的AIxBoard上部署CODESYS Runtime,并通過(guò)共享內(nèi)存實(shí)現(xiàn)與外界程序通信,故需安裝的軟件包有以下幾種:
1. CODESYS Control for Linux SL
2. CODESYS Edge Gateway for Linux
3. Shared Memory Communication
完成安裝后,可在包管理器中查看到這三個(gè)軟件包。

| 在CODESYS中安裝軟件包
安裝完成三個(gè)軟件包后,重啟CODESYS,隨后能夠在工具中最下面一行找到Update Linux,點(diǎn)擊后會(huì)打開(kāi)一個(gè)能夠與安裝了Linux系統(tǒng)的AIxBoard進(jìn)行通信部署的界面。

| 安裝軟件包完成后的效果
設(shè)備硬件層前期準(zhǔn)備
為了提高AIxBoard的適用性,本文將使用Ubuntu系統(tǒng)作為AIxBoard的操作系統(tǒng),系統(tǒng)版本為Ubuntu 20.04LTS,這里使用的是Canonical為Intel優(yōu)化的版本。下載與安裝教程如下:系統(tǒng)安裝 - AIxBoard開(kāi)發(fā)指南 (xzsteam.com)。
除此之外,安裝完成系統(tǒng)后,還需安裝python以進(jìn)行共享內(nèi)存通信,本文使用的python版本為3.8.10。
為驗(yàn)證CODESYS能夠與外界程序通信,同時(shí)也安裝了Epics。Epics全稱(chēng)為Experimental Physics and Industrial Control System即“實(shí)驗(yàn)物理及工業(yè)控制系統(tǒng)”,是上世紀(jì)90年代初由美國(guó)洛斯阿拉莫斯國(guó)家實(shí)驗(yàn)室(LANL)和阿貢國(guó)家實(shí)驗(yàn)室(ANL)等聯(lián)合開(kāi)發(fā)的大型控制軟件系統(tǒng)。安裝完成Epics后,需使其在后臺(tái)運(yùn)行,后續(xù)將通過(guò)CODESYS與其進(jìn)行通信。

| 在AIxBoard中預(yù)先安裝好Ubuntu系統(tǒng)與Epics
工程建立
新建標(biāo)準(zhǔn)工程
在CODESYS中,選擇文件-新建工程,命名工程為AIxBoard,選擇新建標(biāo)準(zhǔn)工程。

| 新建標(biāo)準(zhǔn)工程
在彈出的標(biāo)準(zhǔn)工程對(duì)話(huà)框中,選擇設(shè)備為CODESYS Control for Linux SL,選擇結(jié)構(gòu)化文本(ST)作為編程語(yǔ)言。

| 新建標(biāo)準(zhǔn)工程選項(xiàng)
加載所需函數(shù)庫(kù)
將我們剛剛安裝的軟件包中的所需函數(shù)庫(kù)加載到此工程中,需要添加的函數(shù)庫(kù)有:
· SysShm,3.5.8.0 (System)
· SysTypes2 Interfaces,3.5.4.0 (System)
打開(kāi)庫(kù)管理器(Library Manager),選擇“添加庫(kù)(Add Library)”,點(diǎn)“高級(jí)(Advanced.。.)”;

| 在工程中加載剛剛安裝好的函數(shù)庫(kù)
在搜索框(String for a fulltext search.。.)中分別輸入SysShm和SysTypes搜索添加SysShm,3.5.8.0 和SysTypes2 Interfaces,3.5.4.0 ,
選中搜索到的庫(kù),點(diǎn)“OK”確認(rèn)添加,


| 搜索并添加所需的兩個(gè)函數(shù)庫(kù)
建立設(shè)備通信
點(diǎn)擊工具-Update Linux打開(kāi)與Linux通信的界面,在左側(cè)輸入用戶(hù)名和密碼,搜索到AIxBoard的IP后,點(diǎn)擊Install將CODESYS Runtime安裝至AIxBoard中,安裝文件可以在AIxBoard的/etc/中找到。

| 與AIxBoard通信并將Runtime部署在AIxBoard上
經(jīng)過(guò)圖9的操作之后,AIxBoard便已經(jīng)成為了一個(gè)能夠運(yùn)行CODESYS的實(shí)時(shí)性系統(tǒng)的PLC了。

| 在AIxBoard上安裝好的CODESYS Runtime程序文件
新建項(xiàng)目后,點(diǎn)擊左下角設(shè)備進(jìn)入設(shè)備樹(shù),雙擊Device后,點(diǎn)擊掃描網(wǎng)絡(luò)進(jìn)行設(shè)備連接,選擇AIxBoard為控制器的網(wǎng)絡(luò)路徑。

| 進(jìn)行設(shè)備掃描與連接
輸入賬號(hào)密碼進(jìn)行登錄,如果是第一次登陸,還需要另外設(shè)置一次登錄密碼。

| 在CODESYS Runtime上登錄并自動(dòng)下載代碼
登陸完成后,將會(huì)自動(dòng)下載程序代碼至AIxBoard上,并且可以在device中看到設(shè)備信息。

| 連接完成后的設(shè)備網(wǎng)絡(luò)圖
代碼編寫(xiě)
定義數(shù)據(jù)單元類(lèi)型與全局變量
右擊Application,選擇添加DUT(Data Unit Type,數(shù)據(jù)單元類(lèi)型),DUT為自定義的數(shù)據(jù)類(lèi)型,本文中新建自定義的數(shù)據(jù)單元類(lèi)型目的為通過(guò)不同類(lèi)型的數(shù)據(jù)單元,將輸出至外部程序的變量與從外部程序輸入進(jìn)來(lái)的變量分離開(kāi)。
新建兩個(gè)數(shù)據(jù)類(lèi)型分別為:Str_ParaFromHMI與Str_ParaToHMI,目前結(jié)構(gòu)體內(nèi)部?jī)H包含一個(gè)長(zhǎng)整型格式的數(shù)據(jù)(LREAL),可根據(jù)實(shí)際需求修改或添加。
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),并將剛剛新建的兩種數(shù)據(jù)類(lèi)型實(shí)例化,并添加至全局變量中。實(shí)例化的名稱(chēng)分別為GetPara與SetPara。其中GetPara用于從外部程序中獲取數(shù)據(jù)進(jìn)入CODESYS,SetPara用于將CODESYS中的數(shù)據(jù)輸出至外部程序中。
VAR_GLOBAL GetPara:Str_ParaFromHMI; SetPara:Str_ParaToHMI; END_VAR
編寫(xiě)共享內(nèi)存POU
右擊Application添加POU(Program organizational unit,程序組織單元),命名為Sharedmemory。

| 新增程序組織單元的相關(guān)配置
POU上方為局部變量聲明區(qū)域,下方為結(jié)構(gòu)化文本程序區(qū)域。
局部變量聲明如下:
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’; //聲明共享內(nèi)存的讀取內(nèi)存名稱(chēng) szNameWrite: STRING:= ‘CODESYS_MEMORY_WRITE’; //聲明共享內(nèi)存的寫(xiě)入內(nèi)存名稱(chēng) ulPhysicalAddressRead: __UXINT:= 0;//讀取數(shù)據(jù)的偏移地址,0為從頭讀取 ulPhysicalAddressWrite: __UXINT:= 0;//寫(xiě)入數(shù)據(jù)的偏移地址,0為從頭寫(xiě)入 ulSizeRead: __UXINT:= 1024;//讀取空間大小 ulSizeWrite: __UXINT:= 1024;//寫(xiě)入空間大小 ResultRead: ARRAY[0..2] OF RTS_IEC_RESULT; //返回運(yùn)行錯(cuò)誤碼,0中為運(yùn)行錯(cuò)誤碼,1中為讀取執(zhí)行錯(cuò)誤碼,2中為寫(xiě)出執(zhí)行錯(cuò)誤碼 ResultWrite: ARRAY[0..2] OF RTS_IEC_RESULT; //返回運(yùn)行錯(cuò)誤碼,0中為運(yùn)行錯(cuò)誤碼,1中為讀取執(zhí)行錯(cuò)誤碼,2中為寫(xiě)出執(zhí)行錯(cuò)誤碼 SMRead: __UXINT; SMWrite: __UXINT; ulOffsetRead: __UXINT:= 0; ulOffsetWrite: __UXINT:= 0; END_VAR 其中,高亮部分語(yǔ)句所指定的名稱(chēng)是之后需要與python中讀取共享內(nèi)存中數(shù)據(jù)一致的文件名稱(chēng)??扇我庑薷牡菓?yīng)與python中程序一致,共享內(nèi)存的文件將會(huì)保存在/dev/shm/中。 下方ST程序部分編寫(xiě)代碼如下:
//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 //讀入數(shù)據(jù) IF RTS_INVALID_HANDLE 《》 ReadHandle THEN SMRead:= SysSharedMemoryRead( hShm:= ReadHandle, //讀取內(nèi)存的設(shè)備句柄 ulOffset:= ulOffsetRead, //讀取數(shù)據(jù)的偏移地址 pbyData:= ADR(GVL.GetPara), //指向讀取數(shù)據(jù)的緩沖區(qū) ulSize:= SIZEOF(Str_ParaFromHMI), //讀取數(shù)據(jù)的字節(jié)大小 pResult:= ADR(ResultRead[1])); //返回執(zhí)行的錯(cuò)誤碼 END_IF //寫(xiě)出數(shù)據(jù) IF RTS_INVALID_HANDLE 《》 WriteHandle THEN SMWrite:= SysSharedMemoryWrite( hShm:= WriteHandle, //寫(xiě)入內(nèi)存的設(shè)備句柄 ulOffset:= ulOffsetWrite, //寫(xiě)入數(shù)據(jù)的偏移地址 pbyData:= ADR(GVL.SetPara), //指向?qū)懭霐?shù)據(jù)的緩沖區(qū) ulSize:= SIZEOF(Str_ParaToHMI), //寫(xiě)入數(shù)據(jù)的字節(jié)大小 pResult:= ADR(ResultWrite[2])); //返回執(zhí)行的錯(cuò)誤碼 END_IF 在Maintask中調(diào)用編輯好的POU,將此POU加入到執(zhí)行程序中。

| 在任務(wù)配置中調(diào)用編寫(xiě)好的程序
編寫(xiě)數(shù)據(jù)來(lái)源POU
在主程序PLC_RPG中添加正弦數(shù)據(jù)函數(shù),不斷向SetPara中發(fā)送正弦波數(shù)據(jù)。

| 編寫(xiě)主程序相關(guān)函數(shù),用于輸入正弦波形 完成后,點(diǎn)擊上方編譯,編譯通過(guò)后即可將程序登錄下載至AIxBoard中。 在AIxBoard上,編寫(xiě)相關(guān)python程序接收來(lái)自CODESYS傳遞的信號(hào)并通過(guò)pyepics將其發(fā)送至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(‘a(chǎn)iHost:xxxExample’,number) time.sleep(0.05) 運(yùn)行結(jié)果 以管理員身份運(yùn)行python程序,可在AIxBoard上不斷讀取到CODESYS發(fā)送的數(shù)據(jù)。

| AIxBoard上最終運(yùn)行結(jié)果,左側(cè)為接收到的數(shù)據(jù)量 同時(shí)在CODESYS中可建立信號(hào)跟蹤器,檢測(cè)發(fā)送出的數(shù)據(jù)波形。

| 信號(hào)跟蹤器上顯示的CODESYS中發(fā)出的數(shù)據(jù)波形 通過(guò)新建CS-Studio界面,可以從Epics中查看數(shù)據(jù),驗(yàn)證CODESYS中發(fā)送出來(lái)的數(shù)據(jù)的正確性。

| 在CS-Studio界面上監(jiān)視到的Epics網(wǎng)絡(luò)中PV量的變化波形 至此,我們已完成了將AIxBoard變?yōu)镻LC并與外界程序通信的全部任務(wù),順利將AIxBoard從一臺(tái)非實(shí)時(shí)性的開(kāi)發(fā)板變成了一個(gè)能夠用于工業(yè)控制領(lǐng)域的實(shí)時(shí)PLC控制器。能夠與外界程序進(jìn)行通信,使基于AIxBoard與CODESYS配置而成的軟PLC相比傳統(tǒng)的PLC而言,具有了更高的靈活性,通過(guò)搭配OpenVINO等人工智能模型,能夠?qū)崿F(xiàn)更加智能化的控制效果。 文中所涉及到的所有工程文件與代碼均已開(kāi)源于github。 網(wǎng)址為: https://github.com/EHU0/Codesys_ShareMemory_On_AIxBoard.git
-
英特爾
+關(guān)注
關(guān)注
61文章
10275瀏覽量
179326 -
plc
+關(guān)注
關(guān)注
5045文章
14443瀏覽量
483624 -
智能化
+關(guān)注
關(guān)注
15文章
5209瀏覽量
59714
原文標(biāo)題:英特爾開(kāi)發(fā)者套件愛(ài)克斯板與CODESYS實(shí)現(xiàn)軟PLC配置并與外界程序通信
文章出處:【微信號(hào):SDNLAB,微信公眾號(hào):SDNLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
英特爾BOOT Loader開(kāi)發(fā)套件-高級(jí)嵌入式開(kāi)發(fā)基礎(chǔ)
英特爾quark處理器開(kāi)發(fā)者手冊(cè)
Buzz研討會(huì)和英特爾游戲開(kāi)發(fā)者計(jì)劃
物聯(lián)網(wǎng)開(kāi)發(fā)者展示:英特爾語(yǔ)音啟用開(kāi)發(fā)人員套件
使用英特爾物聯(lián)網(wǎng)開(kāi)發(fā)人員套件實(shí)現(xiàn)快速原型設(shè)計(jì)
英特爾正式宣布建立統(tǒng)一開(kāi)發(fā)者平臺(tái)Developer Zone
英特爾On技術(shù)創(chuàng)新峰會(huì)公布開(kāi)發(fā)者重點(diǎn)投入計(jì)劃,全面賦能開(kāi)發(fā)者
英特爾oneAPI 2023工具包正式上線(xiàn),幫助開(kāi)發(fā)者利用英特爾硬件的先進(jìn)功能
英特爾開(kāi)發(fā)者套件愛(ài)克斯板與CODESYS實(shí)現(xiàn)軟PLC配置并與外界程序通信
使用英特爾開(kāi)發(fā)者套件搭建RTMP流媒體服務(wù)器
基于OpenVINO在英特爾開(kāi)發(fā)套件上實(shí)現(xiàn)眼部追蹤
基于英特爾開(kāi)發(fā)套件的AI字幕生成器設(shè)計(jì)
基于英特爾哪吒開(kāi)發(fā)者套件平臺(tái)來(lái)快速部署OpenVINO Java實(shí)戰(zhàn)
【轉(zhuǎn)載】英特爾開(kāi)發(fā)套件“哪吒”快速部署YoloV8 on Java | 開(kāi)發(fā)者實(shí)戰(zhàn)
英特爾開(kāi)發(fā)套件『哪吒』在Java環(huán)境實(shí)現(xiàn)ADAS道路識(shí)別演示 | 開(kāi)發(fā)者實(shí)戰(zhàn)

英特爾開(kāi)發(fā)者套件愛(ài)克斯板與CODESYS實(shí)現(xiàn)軟PLC配置并與外界程序通信
評(píng)論