我們自己來(lái)做一個(gè)PLC(Programmable Logic Controller,即可編程邏輯控制器)怎么樣?就像很多計(jì)算機(jī)專業(yè)的同學(xué)都自己寫過(guò)最簡(jiǎn)單的操作系統(tǒng)一樣,作為工控領(lǐng)域的軟件人,怎么能不自己動(dòng)手做個(gè)簡(jiǎn)單的PLC呢? PLC其實(shí)也是經(jīng)歷了很長(zhǎng)時(shí)間的演變,最早的PLC雖然也是運(yùn)行在單片機(jī)上,但是僅支持指定模塊的編程,而下裝組態(tài)其實(shí)是在傳輸各個(gè)點(diǎn)及各個(gè)點(diǎn)之間的連接信息,再由PLC根據(jù)這些信息在內(nèi)部進(jìn)行解析運(yùn)行。而現(xiàn)在的PLC,大多數(shù)都可以被稱之為軟PLC(也稱Soft PLC),即在PC端便已經(jīng)編譯成二進(jìn)制文件,下載至PLC的過(guò)程是拷貝或者燒錄程序的過(guò)程,這使得PC的高性能得到了更好的發(fā)揮,我們今天討論的PLC便屬于軟PLC。 如果你想要找我要代碼的話,雖然我自己已經(jīng)嘗試著做過(guò)一個(gè)簡(jiǎn)單基本的了,但是不得不說(shuō)一個(gè)完整的PLC是相當(dāng)?shù)凝嫶蠛蛷?fù)雜,我自己的僅供我自己學(xué)習(xí)使用了,沒(méi)有足夠的注釋和文檔去幫助別人了解,故在這里我可以推薦一個(gè)做得還算不錯(cuò)的開(kāi)源項(xiàng)目(當(dāng)時(shí)我自己嘗試的時(shí)候也借用了這個(gè)項(xiàng)目中不少的組件),這個(gè)開(kāi)源項(xiàng)目叫做beremiz。
首先讓我們來(lái)考慮一下,我自己要做的PLC需要些什么組件呢? 軟件環(huán)境- PLC程序IDE,方便開(kāi)發(fā)人員編寫和調(diào)試程序的人機(jī)界面,支持多種語(yǔ)言的開(kāi)發(fā)?蛇x的開(kāi)源項(xiàng)目:
- PLCEdit:完全按照IEC61131標(biāo)準(zhǔn)開(kāi)發(fā),所有五種語(yǔ)言均支持,使用Python開(kāi)發(fā),故可以做到跨平臺(tái)。
- Beremiz:一套完整的開(kāi)源PLC解決方案,不過(guò)放在這里主要是因?yàn)樗坏褂昧松厦嬲f(shuō)的PLCEdit,同時(shí)還對(duì)其進(jìn)行了增強(qiáng),使得其增加了重要的在線調(diào)試功能。
- SoapBox Snap:使用C#+WPF開(kāi)發(fā)的,僅支持梯形圖一種語(yǔ)言,不過(guò)卻已經(jīng)支持了在線調(diào)試功能,含模擬器。
- 我的解決方案:我使用了Node.js+HTML5開(kāi)發(fā),僅支持梯形圖一種語(yǔ)言,不支持在線調(diào)試,使用HTML5方案最大的優(yōu)勢(shì)有兩點(diǎn),一是適應(yīng)未來(lái)發(fā)展需要,二是類似于家用路由器一樣,可以將網(wǎng)頁(yè)嵌入到設(shè)備中,故只要一臺(tái)能瀏覽HTML5網(wǎng)頁(yè)的瀏覽器便可以配置PLC。
按照工業(yè)控制領(lǐng)域常用的IEC61131-3標(biāo)準(zhǔn)來(lái)看,工業(yè)控制領(lǐng)域程序語(yǔ)言被分為了兩大類五種語(yǔ)言,兩大類是指圖形化編程和代碼編程,圖形化編程中有Ladder(梯形圖),F(xiàn)BD(Function Block Diagram,功能塊圖)和SFC(Sequential Function Chart,序列功能表),而代碼編程有IL(Instruction List,指令集)和ST(Structured Text,結(jié)構(gòu)化文本),具體內(nèi)容我就不展開(kāi)了,有需要自行百度百科或維基百科。
- HMI設(shè)計(jì)器,Human-machine interface,即人機(jī)界面,主要用來(lái)顯示控制過(guò)程中的實(shí)時(shí)數(shù)據(jù),并設(shè)置一些按鍵方便操作員快速控制系統(tǒng)?蛇x方案:
- Beremiz:使用SVG技術(shù)開(kāi)發(fā),樣式可擴(kuò)展性強(qiáng),但是邏輯擴(kuò)展性弱。
我的解決方案:使用HTML5技術(shù)開(kāi)發(fā),不但有豐富的開(kāi)源編輯器可供選用,而且用戶可以自行嵌入JS邏輯。 - 編譯器,顧名思義,就是將在IDE環(huán)境中編寫好的程序轉(zhuǎn)換成可以直接運(yùn)行在單片機(jī)上的二進(jìn)制序列?蛇x的開(kāi)源項(xiàng)目:
- mat:最全面的開(kāi)源編譯器,輸入符合其標(biāo)準(zhǔn)的定義文件,并可以支持IL和ST兩種文本語(yǔ)言。使用純C開(kāi)發(fā),大量使用了宏定義,導(dǎo)致我看代碼看得挺吃力的。
- Avrian-Jump:一個(gè)非常初級(jí)的梯形圖編輯器,并可以將該梯形圖轉(zhuǎn)譯成ATMega168的二進(jìn)制程序,使用js開(kāi)發(fā),直接在網(wǎng)頁(yè)上操作。
我的解決方案:我的初版解決方案是使用C#語(yǔ)言通過(guò)正則表達(dá)式識(shí)別代碼并轉(zhuǎn)成可供執(zhí)行的Python代碼。后來(lái)將正則表達(dá)式的方式改為Coco/R,即專門的編譯器生成器。 其他必要的類庫(kù)或驅(qū)動(dòng),通常情況主要就是IO的驅(qū)動(dòng),以及通信的協(xié)議棧,當(dāng)然還不能缺少基本的供開(kāi)發(fā)人員調(diào)用的類庫(kù)。很多時(shí)候都是內(nèi)嵌在編譯器中,或者提供足夠的靈活性讓用戶自行開(kāi)發(fā)。
硬件環(huán)境 |