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