1
序言
英特爾開發(fā)者套件AIxBoard 愛克斯板是一款功能強(qiáng)大的小型計算機(jī),專為支持入門級邊緣人工智能應(yīng)用程序和設(shè)備而設(shè)計。無論是在人工智能學(xué)習(xí)、開發(fā)還是實訓(xùn)等應(yīng)用場景下,它都能完美勝任。
該開發(fā)板是類樹莓派的 x86 主機(jī),可支持 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 單片機(jī),可外拓各種傳感器模塊。
此外, 其接口與 Jetson Nano 載板兼容,GPIO 與樹莓派兼容,能夠最大限度地復(fù)用樹莓派、Jetson Nano 等生態(tài)資源,無論是攝像頭物體識別,3D 打印,還是 CNC 實時插補(bǔ)控制都能穩(wěn)定運行。可作為邊緣計算引擎用于人工智能產(chǎn)品驗證、開發(fā);也可以作為域控核心用于機(jī)器人產(chǎn)品開發(fā)。
然而,雖然愛克斯板具有如上的諸多優(yōu)點。但由于其運行的 Windows 或者 Linux 系統(tǒng)都是非實時性的操作系統(tǒng),難以用于對實時性要求較高的工業(yè)環(huán)境中。而實時性的 PLC 環(huán)境通常較為封閉,難以使用 Python ,OpenVINO 等外界程序。
1.2CODESYS 介紹
CODESYS 是一款工業(yè)自動化領(lǐng)域的一款開發(fā)編程系統(tǒng)(CODESYS 是 Code System 的簡寫),應(yīng)用領(lǐng)域涉及工廠自動化、汽車自動化、嵌入式自動化、過程自動化和樓宇自動化等等。CODESYS 軟件可以分為兩個部分,一部分是運行在各類硬件中的 RTE(Runtime Environment ),另一部分是運行在 PC 機(jī)上的 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)域的一款功能強(qiáng)大的人工智能小型計算機(jī)。
2
前期準(zhǔn)備
CODESYS 軟件分三層架構(gòu),可用下圖來表示:
圖1 CODESYS 軟件架構(gòu)示意圖
其中開發(fā)層(IDE)可使用 CODESYS Development System(具有完善的在線編程和離線編程功能)、編譯器及其配件組件、可視化界面編程組件等對 CODESYS 程序進(jìn)行開發(fā)與部署。本文使用的版本為 CODESYS V3.5 SP17,下載與安裝教程可見《CODESYS 3.5.17.0 軟件安裝_codesys安裝教程》:
https://blog.csdn.net/goo__gle/article/details/116987188
2.1開發(fā)層主機(jī)前期準(zhǔn)備
在安裝完 CODESYS 后,還需要根據(jù)需求下載安裝部分CODESYS 軟件包,由于本文需要在運行有 Ubuntu 的AIxBoard 上部署 CODESYS Runtime ,并通過共享內(nèi)存實現(xiàn)與外界程序通信,故需安裝的軟件包有以下幾種:
CODESYS Control for LinuxSL
CODESYS Edge Gateway for Linux
Shared Memory Communication
完成安裝后,可在包管理器中查看到這三個軟件包:
圖2在 CODESYS 中安裝軟件包
安裝完成三個軟件包后,重啟 CODESYS ,隨后能夠在工具中最下面一行找到 Update Linux ,點擊后會打開一個能夠與安裝了 Linux 系統(tǒng)的 AIxBoard 進(jìn)行通信部署的界面。
圖3安裝軟件包完成后的效果
2.2設(shè)備硬件層前期準(zhǔn)備
為了提高 AIxBoard 的適用性,本文將使用 Ubuntu 系統(tǒng)作為 AIxBoard 的操作系統(tǒng),系統(tǒng)版本為 Ubuntu 20.04LTS ,這里使用的是 Canonical 為英特爾優(yōu)化的版本。下載與安裝教程如下:
https://www.xzsteam.com/docs/osinstallation.html
除此之外,安裝完成系統(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)行通信。
圖4在 AIxBoard 中預(yù)先安裝好 Ubuntu 系統(tǒng)與 Epics
3
工程建立
3.1新建標(biāo)準(zhǔn)工程
在 CODESYS 中,選擇文件-新建工程,命名工程為 AIxBoard ,選擇新建標(biāo)準(zhǔn)工程。
圖5新建標(biāo)準(zhǔn)工程
在彈出的標(biāo)準(zhǔn)工程對話框中,選擇設(shè)備為 CODESYS Control for Linux SL ,選擇結(jié)構(gòu)化文本(ST)作為編程語言。
圖6新建標(biāo)準(zhǔn)工程選項
3.2加載所需函數(shù)庫
將我們剛剛安裝的軟件包中的所需函數(shù)庫加載到此工程中,需要添加的函數(shù)庫有:
SysShm,3.5.8.0 (System)
SysTypes2 Interfaces,3.5.4.0 (System)
打開庫管理器( Library Manager ),選擇“添加庫( Add Library )”,點“高級( Advanced... )”;
圖7 在工程中加載剛剛安裝好的函數(shù)庫
在搜索框(String for a fulltext search...)中分別輸入 SysShm 和 SysTypes 搜索添加 SysShm,3.5.8.0 和 SysTypes2 Interfaces,3.5.4.0 ,
選中搜索到的庫,點 “OK” 確認(rèn)添加,
圖8 搜索并添加所需的兩個函數(shù)庫
3.3建立設(shè)備通信
點擊工具-Update Linux 打開與 Linux 通信的界面,在左側(cè)輸入用戶名和密碼,搜索到 AIxBoard 的 IP 后,點擊Install 將 CODESYS Runtime 安裝至 AIxBoard 中,安裝文件可以在 AIxBoard的 /etc/ 中找到。
圖9與 AIxBoard 通信并將 Runtime 部署在 AIxBoard 上
經(jīng)過圖9的操作之后,AIxBoard 便已經(jīng)成為了一個能夠運行 CODESYS 的實時性系統(tǒng)的 PLC 了。
圖10 在 AIxBoard 上安裝好的 CODESYS Runtime 程序文件
新建項目后,點擊左下角設(shè)備進(jìn)入設(shè)備樹,雙擊 Device 后,點擊掃描網(wǎng)絡(luò)進(jìn)行設(shè)備連接,選擇 AIxBoard 為控制器的網(wǎng)絡(luò)路徑。
圖11 進(jìn)行設(shè)備掃描與連接
輸入賬號密碼進(jìn)行登錄,如果是第一次登陸,還需要另外設(shè)置一次登錄密碼。
圖12 在 CODESYS Runtime 上登錄并自動下載代碼
登陸完成后,將會自動下載程序代碼至 AIxBoard 上,并且可以在 device 中看到設(shè)備信息。
圖13 連接完成后的設(shè)備網(wǎng)絡(luò)圖
4
代碼編寫
4.1定義數(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
4.2編寫共享內(nèi)存 POU
右擊 Application 添加POU (Program organizational unit,程序組織單元),命名為 Sharedmemory 。
圖14 新增程序組織單元的相關(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
向右滑動查看完整代碼
szNameRead: STRING:= 'CODESYS_MEMORY_READ'; //聲明共享內(nèi)存的讀取內(nèi)存名稱 szNameWrite: STRING:= 'CODESYS_MEMORY_WRITE'; //聲明共享內(nèi)存的寫入內(nèi)存名稱
向右滑動查看完整代碼
其中,上面這兩行語句部分所指定的名稱是之后需要與 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í)行程序中。
圖15 在任務(wù)配置中調(diào)用編寫好的程序
4.3編寫數(shù)據(jù)來源 POU
在主程序 PLC_RPG 中添加正弦數(shù)據(jù)函數(shù),不斷向SetPara 中發(fā)送正弦波數(shù)據(jù)。
圖16 編寫主程序相關(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('aiHost:xxxExample',number) time.sleep(0.05)
向右滑動查看完整代碼
5
運行結(jié)果
以管理員身份運行 Python 程序,可在 AIxBoard 上不斷讀取到 CODESYS 發(fā)送的數(shù)據(jù)。
圖17 AIxBoard 上最終運行結(jié)果,左側(cè)為接收到的數(shù)據(jù)量
同時在 CODESYS 中可建立信號跟蹤器,檢測發(fā)送出的數(shù)據(jù)波形。
圖18 信號跟蹤器上顯示的 CODESYS 中發(fā)出的數(shù)據(jù)波形
通過新建 CS-Studio 界面,可以從 Epics 中查看數(shù)據(jù),驗證 CODESYS 中發(fā)送出來的數(shù)據(jù)的正確性。
圖19 在 CS-Studio 界面上監(jiān)視到的 Epics 網(wǎng)絡(luò)中 PV 量的變化波形
至此,我們已完成了將 AIxBoard 變?yōu)?PLC 并與外界程序通信的全部任務(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文章
9995瀏覽量
172023 -
plc
+關(guān)注
關(guān)注
5013文章
13341瀏覽量
464359 -
人工智能
+關(guān)注
關(guān)注
1792文章
47492瀏覽量
239175
原文標(biāo)題:英特爾開發(fā)者套件愛克斯板與CODESYS實現(xiàn)軟PLC配置并與外界程序通信 | 開發(fā)者實戰(zhàn)
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論