1
序言
英特爾開發(fā)者套件AIxBoard 愛克斯板是一款功能強(qiáng)大的小型計(jì)算機(jī),專為支持入門級邊緣人工智能應(yīng)用程序和設(shè)備而設(shè)計(jì)。無論是在人工智能學(xué)習(xí)、開發(fā)還是實(shí)訓(xùn)等應(yīng)用場景下,它都能完美勝任。
該開發(fā)板是類樹莓派的 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 小電腦來看待,且其可集成一塊 Arduino Leonardo 單片機(jī),可外拓各種傳感器模塊。
此外, 其接口與 Jetson Nano 載板兼容,GPIO 與樹莓派兼容,能夠最大限度地復(fù)用樹莓派、Jetson Nano 等生態(tài)資源,無論是攝像頭物體識(shí)別,3D 打印,還是 CNC 實(shí)時(shí)插補(bǔ)控制都能穩(wěn)定運(yùn)行。可作為邊緣計(jì)算引擎用于人工智能產(chǎn)品驗(yàn)證、開發(fā);也可以作為域控核心用于機(jī)器人產(chǎn)品開發(fā)。
然而,雖然愛克斯板具有如上的諸多優(yōu)點(diǎn)。但由于其運(yùn)行的 Windows 或者 Linux 系統(tǒng)都是非實(shí)時(shí)性的操作系統(tǒng),難以用于對實(shí)時(shí)性要求較高的工業(yè)環(huán)境中。而實(shí)時(shí)性的 PLC 環(huán)境通常較為封閉,難以使用 Python ,OpenVINO 等外界程序。
1.2CODESYS 介紹
CODESYS 是一款工業(yè)自動(dòng)化領(lǐng)域的一款開發(fā)編程系統(tǒng)(CODESYS 是 Code System 的簡寫),應(yīng)用領(lǐng)域涉及工廠自動(dòng)化、汽車自動(dòng)化、嵌入式自動(dòng)化、過程自動(dòng)化和樓宇自動(dòng)化等等。CODESYS 軟件可以分為兩個(gè)部分,一部分是運(yùn)行在各類硬件中的 RTE(Runtime Environment ),另一部分是運(yùn)行在 PC 機(jī)上的 IDE。因此 CODESYS的用戶既包括生產(chǎn) PLC 、運(yùn)動(dòng)控制器的硬件廠商,也包括最終使用 PLC 、運(yùn)動(dòng)控制器的用戶。
目前全球有近400家的控制系統(tǒng)生產(chǎn)制造商是 CODESYS 的用戶:如 ABB 、施耐德電氣 SchneiderElectric、伊頓電氣 EATON 、博世力士樂 Rexroth、倍福 BECKHOFF 、科控 KEBA 、日立 HITACHI、三菱自動(dòng)化 MITSUBISHI 、歐姆龍 OMRON、研華科技、凌華科技 ADLINK 、新漢電腦、和利時(shí)集團(tuán)、 SUPCON 中控集團(tuán)、步科自動(dòng)化 KINCO 、深圳雷賽、匯川技術(shù)、深圳合信、深圳英威騰、華中數(shù)控、固高科技等等。
簡單來說,CODESYS 可以說是 PLC 界的安卓,許多PLC 廠商都以 CODESYS 作為其 PLC 的內(nèi)核。
此外,CODESYS 可以將任何一款 arm 架構(gòu)或者 x86 架構(gòu)的處理器變?yōu)閷?shí)時(shí)的 PLC 系統(tǒng)。CODESYS 結(jié)合 AIxBoard ,我們能夠得到一個(gè)可以用于工業(yè)控制檢測領(lǐng)域的一款功能強(qiáng)大的人工智能小型計(jì)算機(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 軟件包,由于本文需要在運(yùn)行有 Ubuntu 的AIxBoard 上部署 CODESYS Runtime ,并通過共享內(nèi)存實(shí)現(xiàn)與外界程序通信,故需安裝的軟件包有以下幾種:
CODESYS Control for LinuxSL
CODESYS Edge Gateway for Linux
Shared Memory Communication
完成安裝后,可在包管理器中查看到這三個(gè)軟件包:
圖2在 CODESYS 中安裝軟件包
安裝完成三個(gè)軟件包后,重啟 CODESYS ,隨后能夠在工具中最下面一行找到 Update Linux ,點(diǎn)擊后會(huì)打開一個(gè)能夠與安裝了 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。
為驗(yàn)證 CODESYS 能夠與外界程序通信,同時(shí)也安裝了 Epics 。Epics(Experimental Physics and Industrial Control System)即“實(shí)驗(yàn)物理及工業(yè)控制系統(tǒng)”,是上世紀(jì)90年代初由美國洛斯阿拉莫斯國家實(shí)驗(yàn)室(LANL)和阿貢國家實(shí)驗(yàn)室(ANL)等聯(lián)合開發(fā)的大型控制軟件系統(tǒng)。安裝完成 Epics 后,需使其在后臺(tái)運(yùn)行,后續(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)工程選項(xiàng)
3.2加載所需函數(shù)庫
將我們剛剛安裝的軟件包中的所需函數(shù)庫加載到此工程中,需要添加的函數(shù)庫有:
SysShm,3.5.8.0 (System)
SysTypes2 Interfaces,3.5.4.0 (System)
打開庫管理器( Library Manager ),選擇“添加庫( Add Library )”,點(diǎn)“高級( Advanced... )”;
圖7 在工程中加載剛剛安裝好的函數(shù)庫
在搜索框(String for a fulltext search...)中分別輸入 SysShm 和 SysTypes 搜索添加 SysShm,3.5.8.0 和 SysTypes2 Interfaces,3.5.4.0 ,
選中搜索到的庫,點(diǎn) “OK” 確認(rèn)添加,
圖8 搜索并添加所需的兩個(gè)函數(shù)庫
3.3建立設(shè)備通信
點(diǎn)擊工具-Update Linux 打開與 Linux 通信的界面,在左側(cè)輸入用戶名和密碼,搜索到 AIxBoard 的 IP 后,點(diǎn)擊Install 將 CODESYS Runtime 安裝至 AIxBoard 中,安裝文件可以在 AIxBoard的 /etc/ 中找到。
圖9與 AIxBoard 通信并將 Runtime 部署在 AIxBoard 上
經(jīng)過圖9的操作之后,AIxBoard 便已經(jīng)成為了一個(gè)能夠運(yùn)行 CODESYS 的實(shí)時(shí)性系統(tǒng)的 PLC 了。
圖10 在 AIxBoard 上安裝好的 CODESYS Runtime 程序文件
新建項(xiàng)目后,點(diǎn)擊左下角設(shè)備進(jìn)入設(shè)備樹,雙擊 Device 后,點(diǎn)擊掃描網(wǎng)絡(luò)進(jìn)行設(shè)備連接,選擇 AIxBoard 為控制器的網(wǎng)絡(luò)路徑。
圖11 進(jìn)行設(shè)備掃描與連接
輸入賬號密碼進(jìn)行登錄,如果是第一次登陸,還需要另外設(shè)置一次登錄密碼。
圖12 在 CODESYS Runtime 上登錄并自動(dòng)下載代碼
登陸完成后,將會(huì)自動(dòng)下載程序代碼至 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)來的變量分離開。
新建兩個(gè)數(shù)據(jù)類型分別為:Str_ParaFromHMI 與Str_ParaToHMI ,目前結(jié)構(gòu)體內(nèi)部僅包含一個(gè)長整型格式的數(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ù)類型實(shí)例化,并添加至全局變量中。實(shí)例化的名稱分別為 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; //返回運(yùn)行錯(cuò)誤碼,0中為運(yùn)行錯(cuò)誤碼,1中為讀取執(zhí)行錯(cuò)誤碼,2中為寫出執(zhí)行錯(cuò)誤碼 ResultWrite: ARRAY[0..2] OF RTS_IEC_RESULT; //返回運(yùn)行錯(cuò)誤碼,0中為運(yùn)行錯(cuò)誤碼,1中為讀取執(zhí)行錯(cuò)誤碼,2中為寫出執(zhí)行錯(cuò)誤碼 SMRead: __UXINT; SMWrite: __UXINT; ulOffsetRead: __UXINT:= 0; ulOffsetWrite: __UXINT:= 0; END_VAR
向右滑動(dòng)查看完整代碼
szNameRead: STRING:= 'CODESYS_MEMORY_READ'; //聲明共享內(nèi)存的讀取內(nèi)存名稱 szNameWrite: STRING:= 'CODESYS_MEMORY_WRITE'; //聲明共享內(nèi)存的寫入內(nèi)存名稱
向右滑動(dòng)查看完整代碼
其中,上面這兩行語句部分所指定的名稱是之后需要與 Python 中讀取共享內(nèi)存中數(shù)據(jù)一致的文件名稱。可任意修改但是應(yīng)與 Python 中程序一致,共享內(nèi)存的文件將會(huì)保存在 /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í)行的錯(cuò)誤碼 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í)行的錯(cuò)誤碼 END_IF
向右滑動(dòng)查看完整代碼
在 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ù),用于輸入正弦波形
完成后,點(diǎn)擊上方編譯,編譯通過后即可將程序登錄下載至 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)
向右滑動(dòng)查看完整代碼
5
運(yùn)行結(jié)果
以管理員身份運(yùn)行 Python 程序,可在 AIxBoard 上不斷讀取到 CODESYS 發(fā)送的數(shù)據(jù)。
圖17 AIxBoard 上最終運(yùn)行結(jié)果,左側(cè)為接收到的數(shù)據(jù)量
同時(shí)在 CODESYS 中可建立信號跟蹤器,檢測發(fā)送出的數(shù)據(jù)波形。
圖18 信號跟蹤器上顯示的 CODESYS 中發(fā)出的數(shù)據(jù)波形
通過新建 CS-Studio 界面,可以從 Epics 中查看數(shù)據(jù),驗(yàn)證 CODESYS 中發(fā)送出來的數(shù)據(jù)的正確性。
圖19 在 CS-Studio 界面上監(jiān)視到的 Epics 網(wǎng)絡(luò)中 PV 量的變化波形
至此,我們已完成了將 AIxBoard 變?yōu)?PLC 并與外界程序通信的全部任務(wù),順利將 AIxBoard 從一臺(tái)非實(shí)時(shí)性的開發(fā)板變成了一個(gè)能夠用于工業(yè)控制領(lǐng)域的實(shí)時(shí) 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文章
10192瀏覽量
174617 -
plc
+關(guān)注
關(guān)注
5036文章
13902瀏覽量
474278 -
人工智能
+關(guān)注
關(guān)注
1806文章
48987瀏覽量
249116
原文標(biāo)題:英特爾開發(fā)者套件愛克斯板與CODESYS實(shí)現(xiàn)軟PLC配置并與外界程序通信 | 開發(fā)者實(shí)戰(zhàn)
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
使用英特爾? NPU 插件C++運(yùn)行應(yīng)用程序時(shí)出現(xiàn)錯(cuò)誤:“std::Runtime_error at memory location”怎么解決?
英特爾發(fā)布全新GPU,AI和工作站迎來新選擇
2025英特爾人工智能創(chuàng)新應(yīng)用大賽正式啟動(dòng)
為什么無法檢測到OpenVINO?工具套件中的英特爾?集成圖形處理單元?
請問OpenVINO?工具套件英特爾?Distribution是否與Windows? 10物聯(lián)網(wǎng)企業(yè)版兼容?
安裝OpenVINO?適用于Raspberry Pi64位操作系統(tǒng)的工具套件2022.3.1,配置英特爾?NCS2時(shí)出錯(cuò)怎么解決?
將英特爾?獨(dú)立顯卡與OpenVINO?工具套件結(jié)合使用時(shí),無法運(yùn)行推理怎么解決?
英特爾的開發(fā)板評測

軟通動(dòng)力亮相英特爾新質(zhì)生產(chǎn)力技術(shù)生態(tài)大會(huì)
使用英特爾哪吒開發(fā)套件部署YOLOv5完成透明物體目標(biāo)檢測

OpenVINO? C++ 在哪吒開發(fā)板上推理 Transformer 模型|開發(fā)者實(shí)戰(zhàn)

軟銀與英特爾AI芯片合作計(jì)劃告吹
英特爾中國開源技術(shù)委員會(huì)成立一周年
從運(yùn)動(dòng)員到開發(fā)者: 英特爾以開放式AI系統(tǒng)應(yīng)對多重挑戰(zhàn)

評論