序言
愛克斯板介紹
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等外界程序。
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結合AIxBoard,我們能夠得到一個可以用于工業控制檢測領域的一款功能強大的人工智能小型計算機。
前期準備
CODESYS軟件分三層架構,可用下圖來表示:
| CODESYS軟件架構示意圖
其中開發層(IDE)可使用CODESYS Development System(具有完善的在線編程和離線編程功能)、編譯器及其配件組件、可視化界面編程組件等對CODESYS程序進行開發與部署。本文使用的版本為CODESYS V3.5 SP17,下載與安裝教程可見:CODESYS 3.5.17.0 軟件安裝_codesys安裝教程_小 Co的博客-CSDN博客。
開發層主機前期準備
在安裝完CODESYS后,還需要根據需求下載安裝部分CODESYS軟件包,由于本文需要在運行有Ubuntu的AIxBoard上部署CODESYS Runtime,并通過共享內存實現與外界程序通信,故需安裝的軟件包有以下幾種:
1. CODESYS Control for Linux SL
2. CODESYS Edge Gateway for Linux
3. Shared Memory Communication
完成安裝后,可在包管理器中查看到這三個軟件包。
| 在CODESYS中安裝軟件包
安裝完成三個軟件包后,重啟CODESYS,隨后能夠在工具中最下面一行找到Update Linux,點擊后會打開一個能夠與安裝了Linux系統的AIxBoard進行通信部署的界面。
| 安裝軟件包完成后的效果
設備硬件層前期準備
為了提高AIxBoard的適用性,本文將使用Ubuntu系統作為AIxBoard的操作系統,系統版本為Ubuntu 20.04LTS,這里使用的是Canonical為Intel優化的版本。下載與安裝教程如下:系統安裝 - AIxBoard開發指南 (xzsteam.com)。
除此之外,安裝完成系統后,還需安裝python以進行共享內存通信,本文使用的python版本為3.8.10。
為驗證CODESYS能夠與外界程序通信,同時也安裝了Epics。Epics全稱為Experimental Physics and Industrial Control System即“實驗物理及工業控制系統”,是上世紀90年代初由美國洛斯阿拉莫斯國家實驗室(LANL)和阿貢國家實驗室(ANL)等聯合開發的大型控制軟件系統。安裝完成Epics后,需使其在后臺運行,后續將通過CODESYS與其進行通信。
| 在AIxBoard中預先安裝好Ubuntu系統與Epics
工程建立
新建標準工程
在CODESYS中,選擇文件-新建工程,命名工程為AIxBoard,選擇新建標準工程。
| 新建標準工程
在彈出的標準工程對話框中,選擇設備為CODESYS Control for Linux SL,選擇結構化文本(ST)作為編程語言。
| 新建標準工程選項
加載所需函數庫
將我們剛剛安裝的軟件包中的所需函數庫加載到此工程中,需要添加的函數庫有:
· SysShm,3.5.8.0 (System)
· SysTypes2 Interfaces,3.5.4.0 (System)
打開庫管理器(Library Manager),選擇“添加庫(Add Library)”,點“高級(Advanced.。.)”;
| 在工程中加載剛剛安裝好的函數庫
在搜索框(String for a fulltext search.。.)中分別輸入SysShm和SysTypes搜索添加SysShm,3.5.8.0 和SysTypes2 Interfaces,3.5.4.0 ,
選中搜索到的庫,點“OK”確認添加,
| 搜索并添加所需的兩個函數庫
建立設備通信
點擊工具-Update Linux打開與Linux通信的界面,在左側輸入用戶名和密碼,搜索到AIxBoard的IP后,點擊Install將CODESYS Runtime安裝至AIxBoard中,安裝文件可以在AIxBoard的/etc/中找到。
| 與AIxBoard通信并將Runtime部署在AIxBoard上
經過圖9的操作之后,AIxBoard便已經成為了一個能夠運行CODESYS的實時性系統的PLC了。
| 在AIxBoard上安裝好的CODESYS Runtime程序文件
新建項目后,點擊左下角設備進入設備樹,雙擊Device后,點擊掃描網絡進行設備連接,選擇AIxBoard為控制器的網絡路徑。
| 進行設備掃描與連接
輸入賬號密碼進行登錄,如果是第一次登陸,還需要另外設置一次登錄密碼。
| 在CODESYS Runtime上登錄并自動下載代碼
登陸完成后,將會自動下載程序代碼至AIxBoard上,并且可以在device中看到設備信息。
| 連接完成后的設備網絡圖
代碼編寫
定義數據單元類型與全局變量
右擊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
編寫共享內存POU
右擊Application添加POU(Program organizational unit,程序組織單元),命名為Sharedmemory。
| 新增程序組織單元的相關配置
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 其中,高亮部分語句所指定的名稱是之后需要與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加入到執行程序中。
| 在任務配置中調用編寫好的程序
編寫數據來源POU
在主程序PLC_RPG中添加正弦數據函數,不斷向SetPara中發送正弦波數據。
| 編寫主程序相關函數,用于輸入正弦波形 完成后,點擊上方編譯,編譯通過后即可將程序登錄下載至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) 運行結果 以管理員身份運行python程序,可在AIxBoard上不斷讀取到CODESYS發送的數據。
| AIxBoard上最終運行結果,左側為接收到的數據量 同時在CODESYS中可建立信號跟蹤器,檢測發送出的數據波形。
| 信號跟蹤器上顯示的CODESYS中發出的數據波形 通過新建CS-Studio界面,可以從Epics中查看數據,驗證CODESYS中發送出來的數據的正確性。
| 在CS-Studio界面上監視到的Epics網絡中PV量的變化波形 至此,我們已完成了將AIxBoard變為PLC并與外界程序通信的全部任務,順利將AIxBoard從一臺非實時性的開發板變成了一個能夠用于工業控制領域的實時PLC控制器。能夠與外界程序進行通信,使基于AIxBoard與CODESYS配置而成的軟PLC相比傳統的PLC而言,具有了更高的靈活性,通過搭配OpenVINO等人工智能模型,能夠實現更加智能化的控制效果。 文中所涉及到的所有工程文件與代碼均已開源于github。 網址為: https://github.com/EHU0/Codesys_ShareMemory_On_AIxBoard.git
-
英特爾
+關注
關注
61文章
9955瀏覽量
171712 -
plc
+關注
關注
5010文章
13283瀏覽量
463181 -
智能化
+關注
關注
15文章
4875瀏覽量
55356
原文標題:英特爾開發者套件愛克斯板與CODESYS實現軟PLC配置并與外界程序通信
文章出處:【微信號:SDNLAB,微信公眾號:SDNLAB】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論