序言
愛克斯板介紹
AIxBoard愛克斯板開發(fā)者套件是一款功能強大的小型計算機,專為支持入門級邊緣人工智能應(yīng)用程序和設(shè)備而設(shè)計。無論是在人工智能學(xué)習(xí)、開發(fā)還是實訓(xùn)等應(yīng)用場景下,它都能完美勝任。
該開發(fā)板是類樹莓派的x86主機,可支持Linux Ubuntu及 完整版Windows操作系統(tǒng)。板載一顆英特爾4核處理器,最高運行頻率可達(dá)2.9 GHz,且內(nèi)置核顯(iGPU),板載 64GB eMMC存儲及LPDDR4x 2933MHz(4GB/6GB/8GB),內(nèi)置藍(lán)牙和Wi-Fi模組,支持USB 3.0、HDMI視頻輸出、3.5mm音頻接口,1000Mbps以太網(wǎng)口。完全可把它作為一臺mini小電腦來看待,且其可集成一塊Arduino Leonardo單片機,可外拓各種傳感器模塊。
此外, 其接口與Jetson Nano載板兼容,GPIO與樹莓派兼容,能夠最大限度地復(fù)用樹莓派、Jetson Nano等生態(tài)資源,無論是攝像頭物體識別,3D打印,還是CNC實時插補控制都能穩(wěn)定運行??勺鳛檫吘売嬎阋嬗糜谌斯ぶ悄?a target="_blank">產(chǎn)品驗證、開發(fā);也可以作為域控核心用于機器人產(chǎn)品開發(fā)。
然而,雖然愛克斯板具有如上的諸多優(yōu)點。但由于其運行的Windows或者Linux系統(tǒng)都是非實時性的操作系統(tǒng),難以用于對實時性要求較高的工業(yè)環(huán)境中。而實時性的PLC環(huán)境通常較為封閉,難以使用python,Openvino等外界程序。
CODESYS介紹
CODESYS是一款工業(yè)自動化領(lǐng)域的一款開發(fā)編程系統(tǒng)(CODESYS是Code System的簡寫),應(yīng)用領(lǐng)域涉及工廠自動化、汽車自動化、嵌入式自動化、過程自動化和樓宇自動化等等。CODESYS軟件可以分為兩個部分,一部分是運行在各類硬件中的RTE(Runtime Environment),另一部分是運行在PC機上的IDE。因此CODESYS的用戶既包括生產(chǎn)PLC、運動控制器的硬件廠商,也包括最終使用PLC、運動控制器的用戶。
目前全球有近400家的控制系統(tǒng)生產(chǎn)制造商是CODESYS的用戶:如ABB、施耐德電氣SchneiderElectric、伊頓電氣EATON、博世力士樂Rexroth、倍福BECKHOFF、科控KEBA、日立HITACHI、三菱自動化MITSUBISHI、歐姆龍OMRON、研華科技、凌華科技ADLINK、新漢電腦、和利時集團(tuán)、SUPCON 中控集團(tuán)、步科自動化KINCO、深圳雷賽、匯川技術(shù)、深圳合信、深圳英威騰、華中數(shù)控、固高科技等等。
簡單來說,CODESYS可以說是PLC界的安卓,許多PLC廠商都以CODESYS作為其PLC的內(nèi)核。
此外,CODESYS可以將任何一款arm架構(gòu)或者x86架構(gòu)的處理器變?yōu)閷崟r的PLC系統(tǒng)。CODESYS結(jié)合AIxBoard,我們能夠得到一個可以用于工業(yè)控制檢測領(lǐng)域的一款功能強大的人工智能小型計算機。
前期準(zhǔn)備
CODESYS軟件分三層架構(gòu),可用下圖來表示:
| CODESYS軟件架構(gòu)示意圖
其中開發(fā)層(IDE)可使用CODESYS Development System(具有完善的在線編程和離線編程功能)、編譯器及其配件組件、可視化界面編程組件等對CODESYS程序進(jìn)行開發(fā)與部署。本文使用的版本為CODESYS V3.5 SP17,下載與安裝教程可見:CODESYS 3.5.17.0 軟件安裝_codesys安裝教程_小 Co的博客-CSDN博客。
開發(fā)層主機前期準(zhǔn)備
在安裝完CODESYS后,還需要根據(jù)需求下載安裝部分CODESYS軟件包,由于本文需要在運行有Ubuntu的AIxBoard上部署CODESYS Runtime,并通過共享內(nèi)存實現(xiàn)與外界程序通信,故需安裝的軟件包有以下幾種:
1. CODESYS Control for Linux SL
2. CODESYS Edge Gateway for Linux
3. Shared Memory Communication
完成安裝后,可在包管理器中查看到這三個軟件包。
| 在CODESYS中安裝軟件包
安裝完成三個軟件包后,重啟CODESYS,隨后能夠在工具中最下面一行找到Update Linux,點擊后會打開一個能夠與安裝了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開發(fā)指南 (xzsteam.com)。
除此之外,安裝完成系統(tǒng)后,還需安裝python以進(jìn)行共享內(nèi)存通信,本文使用的python版本為3.8.10。
為驗證CODESYS能夠與外界程序通信,同時也安裝了Epics。Epics全稱為Experimental Physics and Industrial Control System即“實驗物理及工業(yè)控制系統(tǒng)”,是上世紀(jì)90年代初由美國洛斯阿拉莫斯國家實驗室(LANL)和阿貢國家實驗室(ANL)等聯(lián)合開發(fā)的大型控制軟件系統(tǒng)。安裝完成Epics后,需使其在后臺運行,后續(xù)將通過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)工程對話框中,選擇設(shè)備為CODESYS Control for Linux SL,選擇結(jié)構(gòu)化文本(ST)作為編程語言。
| 新建標(biāo)準(zhǔn)工程選項
加載所需函數(shù)庫
將我們剛剛安裝的軟件包中的所需函數(shù)庫加載到此工程中,需要添加的函數(shù)庫有:
· SysShm,3.5.8.0 (System)
· SysTypes2 Interfaces,3.5.4.0 (System)
打開庫管理器(Library Manager),選擇“添加庫(Add Library)”,點“高級(Advanced.。.)”;
| 在工程中加載剛剛安裝好的函數(shù)庫
在搜索框(String for a fulltext search.。.)中分別輸入SysShm和SysTypes搜索添加SysShm,3.5.8.0 和SysTypes2 Interfaces,3.5.4.0 ,
選中搜索到的庫,點“OK”確認(rèn)添加,
| 搜索并添加所需的兩個函數(shù)庫
建立設(shè)備通信
點擊工具-Update Linux打開與Linux通信的界面,在左側(cè)輸入用戶名和密碼,搜索到AIxBoard的IP后,點擊Install將CODESYS Runtime安裝至AIxBoard中,安裝文件可以在AIxBoard的/etc/中找到。
| 與AIxBoard通信并將Runtime部署在AIxBoard上
經(jīng)過圖9的操作之后,AIxBoard便已經(jīng)成為了一個能夠運行CODESYS的實時性系統(tǒng)的PLC了。
| 在AIxBoard上安裝好的CODESYS Runtime程序文件
新建項目后,點擊左下角設(shè)備進(jìn)入設(shè)備樹,雙擊Device后,點擊掃描網(wǎng)絡(luò)進(jìn)行設(shè)備連接,選擇AIxBoard為控制器的網(wǎng)絡(luò)路徑。
| 進(jìn)行設(shè)備掃描與連接
輸入賬號密碼進(jìn)行登錄,如果是第一次登陸,還需要另外設(shè)置一次登錄密碼。
| 在CODESYS Runtime上登錄并自動下載代碼
登陸完成后,將會自動下載程序代碼至AIxBoard上,并且可以在device中看到設(shè)備信息。
| 連接完成后的設(shè)備網(wǎng)絡(luò)圖
代碼編寫
定義數(shù)據(jù)單元類型與全局變量
右擊Application,選擇添加DUT(Data Unit Type,數(shù)據(jù)單元類型),DUT為自定義的數(shù)據(jù)類型,本文中新建自定義的數(shù)據(jù)單元類型目的為通過不同類型的數(shù)據(jù)單元,將輸出至外部程序的變量與從外部程序輸入進(jìn)來的變量分離開。
新建兩個數(shù)據(jù)類型分別為:Str_ParaFromHMI與Str_ParaToHMI,目前結(jié)構(gòu)體內(nèi)部僅包含一個長整型格式的數(shù)據(jù)(LREAL),可根據(jù)實際需求修改或添加。
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ù)類型實例化,并添加至全局變量中。實例化的名稱分別為GetPara與SetPara。其中GetPara用于從外部程序中獲取數(shù)據(jù)進(jìn)入CODESYS,SetPara用于將CODESYS中的數(shù)據(jù)輸出至外部程序中。
VAR_GLOBAL GetPara:Str_ParaFromHMI; SetPara:Str_ParaToHMI; END_VAR
編寫共享內(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)存名稱 szNameWrite: STRING:= ‘CODESYS_MEMORY_WRITE’; //聲明共享內(nèi)存的寫入內(nèi)存名稱 ulPhysicalAddressRead: __UXINT:= 0;//讀取數(shù)據(jù)的偏移地址,0為從頭讀取 ulPhysicalAddressWrite: __UXINT:= 0;//寫入數(shù)據(jù)的偏移地址,0為從頭寫入 ulSizeRead: __UXINT:= 1024;//讀取空間大小 ulSizeWrite: __UXINT:= 1024;//寫入空間大小 ResultRead: ARRAY[0..2] OF RTS_IEC_RESULT; //返回運行錯誤碼,0中為運行錯誤碼,1中為讀取執(zhí)行錯誤碼,2中為寫出執(zhí)行錯誤碼 ResultWrite: ARRAY[0..2] OF RTS_IEC_RESULT; //返回運行錯誤碼,0中為運行錯誤碼,1中為讀取執(zhí)行錯誤碼,2中為寫出執(zhí)行錯誤碼 SMRead: __UXINT; SMWrite: __UXINT; ulOffsetRead: __UXINT:= 0; ulOffsetWrite: __UXINT:= 0; END_VAR 其中,高亮部分語句所指定的名稱是之后需要與python中讀取共享內(nèi)存中數(shù)據(jù)一致的文件名稱??扇我庑薷牡菓?yīng)與python中程序一致,共享內(nèi)存的文件將會保存在/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 //讀入數(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í)行的錯誤碼 END_IF //寫出數(shù)據(jù) IF RTS_INVALID_HANDLE 《》 WriteHandle THEN SMWrite:= SysSharedMemoryWrite( hShm:= WriteHandle, //寫入內(nèi)存的設(shè)備句柄 ulOffset:= ulOffsetWrite, //寫入數(shù)據(jù)的偏移地址 pbyData:= ADR(GVL.SetPara), //指向?qū)懭霐?shù)據(jù)的緩沖區(qū) ulSize:= SIZEOF(Str_ParaToHMI), //寫入數(shù)據(jù)的字節(jié)大小 pResult:= ADR(ResultWrite[2])); //返回執(zhí)行的錯誤碼 END_IF 在Maintask中調(diào)用編輯好的POU,將此POU加入到執(zhí)行程序中。
| 在任務(wù)配置中調(diào)用編寫好的程序
編寫數(shù)據(jù)來源POU
在主程序PLC_RPG中添加正弦數(shù)據(jù)函數(shù),不斷向SetPara中發(fā)送正弦波數(shù)據(jù)。
| 編寫主程序相關(guān)函數(shù),用于輸入正弦波形 完成后,點擊上方編譯,編譯通過后即可將程序登錄下載至AIxBoard中。 在AIxBoard上,編寫相關(guān)python程序接收來自CODESYS傳遞的信號并通過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) 運行結(jié)果 以管理員身份運行python程序,可在AIxBoard上不斷讀取到CODESYS發(fā)送的數(shù)據(jù)。
| AIxBoard上最終運行結(jié)果,左側(cè)為接收到的數(shù)據(jù)量 同時在CODESYS中可建立信號跟蹤器,檢測發(fā)送出的數(shù)據(jù)波形。
| 信號跟蹤器上顯示的CODESYS中發(fā)出的數(shù)據(jù)波形 通過新建CS-Studio界面,可以從Epics中查看數(shù)據(jù),驗證CODESYS中發(fā)送出來的數(shù)據(jù)的正確性。
| 在CS-Studio界面上監(jiān)視到的Epics網(wǎng)絡(luò)中PV量的變化波形 至此,我們已完成了將AIxBoard變?yōu)镻LC并與外界程序通信的全部任務(wù),順利將AIxBoard從一臺非實時性的開發(fā)板變成了一個能夠用于工業(yè)控制領(lǐng)域的實時PLC控制器。能夠與外界程序進(jìn)行通信,使基于AIxBoard與CODESYS配置而成的軟PLC相比傳統(tǒng)的PLC而言,具有了更高的靈活性,通過搭配OpenVINO等人工智能模型,能夠?qū)崿F(xiàn)更加智能化的控制效果。 文中所涉及到的所有工程文件與代碼均已開源于github。 網(wǎng)址為: https://github.com/EHU0/Codesys_ShareMemory_On_AIxBoard.git
-
英特爾
+關(guān)注
關(guān)注
61文章
9993瀏覽量
172022 -
plc
+關(guān)注
關(guān)注
5013文章
13340瀏覽量
464345 -
智能化
+關(guān)注
關(guān)注
15文章
4912瀏覽量
55546
原文標(biāo)題:英特爾開發(fā)者套件愛克斯板與CODESYS實現(xiàn)軟PLC配置并與外界程序通信
文章出處:【微信號:SDNLAB,微信公眾號:SDNLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論