李雪蓮
(寶雞文理學院 陜西 寶雞 721016)
可編程控制器(PLC)以工作可靠、維護簡單、編程方便被廣泛應用于工業(yè)控制現(xiàn)場。目前,大部分PLC工程師采用的是梯形圖進行編程,容易上手,開發(fā)周期短,然而,人們在使用過程中也逐漸發(fā)現(xiàn)了傳統(tǒng)PLC的缺點:兼容性差、標準不統(tǒng)一、封閉、擴展能力差、成本較高等[1],針對這一現(xiàn)狀,市場上的多款單片機工控板應運而生。這些工控板與傳統(tǒng)PLC相比有明顯的價格優(yōu)勢,但是很多做工業(yè)現(xiàn)場的工程師仍不愿用單片機工控板代替PLC,其主要原因是單片機工控板的C語言開發(fā)方式與梯形圖開發(fā)相比難度較大且不利于應用于工業(yè)控制現(xiàn)場。
通過對PLC運行機制、梯形圖指令及其軟件開發(fā)工具的研究,本文設計以STM32為平臺、以西門子S7-200為設計模型的嵌入式PLC,支持梯形圖與C語言的混合開發(fā),同時兼容了單片機的開發(fā)靈活、成本低廉等優(yōu)點。為了更好的適應當今通信的快速發(fā)展要求,移植了Modbus、TCP-ip協(xié)議,增強了嵌入式PLC的應用場合。
S7-200是一種小型的PLC,具有結(jié)構(gòu)設計緊湊、擴展性好、功能模塊豐富、指令強大以及價格低廉等特點,可以滿足多種控制系統(tǒng)的需要[2]。傳統(tǒng)PLC采用循環(huán)掃描工作方式,一般包括5個階段:內(nèi)部處理,通信服務,輸入采樣,程序執(zhí)行,輸出刷新[3]。
本文以S7-200為參考模型進行設計,遵循傳統(tǒng)PLC工作方式,采用掃描方式運行。有兩種狀態(tài),Run(運行)和Stop(停止),分別對應硬件資源的兩個按鍵。當系統(tǒng)處于Run狀態(tài)時,除完成內(nèi)部處理和通信服務后,還要完成輸入采樣、程序運行、輸出刷新。當系統(tǒng)處于Stop狀態(tài)時,只運行內(nèi)部處理和通信服務。
本系統(tǒng)建立在STM32F103RBT6芯片平臺之上,利用軟件方法實現(xiàn)傳統(tǒng)PLC的計算、控制、存儲、通信以及編程等功能,通過I/O驅(qū)動模塊以及現(xiàn)場總線等物理設備完成現(xiàn)場數(shù)據(jù)的采集以及信號的輸出[4]。整個系統(tǒng)可以分成內(nèi)部處理、通信服務以及虛擬機運行三階段,Run和Stop兩種狀態(tài),如圖1所示。內(nèi)部處理階段,進行PLC自檢,系統(tǒng)硬件軟件初始化、是否進行程序上載/下載等;通信服務階段,該嵌入式PLC可以通過Modbus或者Tcp-ip協(xié)議與其他裝置實現(xiàn)通信,響應編程器鍵入的命令,更新LCD液晶屏的顯示內(nèi)容;虛擬機運行階段是整個系統(tǒng)的核心,它直接解析語句表代碼,通過I/O驅(qū)動不斷讀取I/O設備的狀態(tài),經(jīng)過程序逐條執(zhí)行,生成最終的I/O控制信號,驅(qū)動外部負載。

圖1 嵌入式PLC工作流程示意圖Fig.1 Schematic plot of Embedded PLCwork process
嵌入式PLC通過對光耦器件進行電氣隔離和對電源部分加入高頻濾波來提高其安全性。系統(tǒng)的硬件根據(jù)其功能布局,可以劃分成5個模塊電路:CPU模塊,輸入模塊,輸出模塊,通信模塊,片外存儲模塊。其整體框圖如圖2所示。

圖2 硬件邏輯框圖Fig.2 The logic picture of hardware
CPU模塊采用的主控芯片隸屬于STM32系列中等容量增強型。CPU內(nèi)核為ARM 32位的Cortex?-M3,最高72MHz工作頻率,擁有128K字節(jié)的閃存程序存儲器與高達20K字節(jié)的 SRAM,外設豐富[5]。
輸入模塊包括6路A/D模擬輸入以及8路隔離I/O開關量輸入兩種類型。輸出模塊包括7路繼電器輸出、一個液晶屏和一個蜂鳴器輸出。其中,繼電器為歐姆龍G5V-1DC5小型繼電器。線圈額定電壓5 V,額定電流30mA。額定負載AC125V 0.5A、DC24V 1A,動作時間 5ms以下。
Modbus通過串口該嵌入式PLC通信,其接口原理圖如圖3所示。串口電平轉(zhuǎn)換芯片為美芯公司的MAX3232,TXD0與RXD0連接到STM32的USART1。

圖3 RS-232接口原理圖Fig.3 The principle picture of RS-232 port
通信模塊同時設計了來自Microchip帶SPI接口的獨立以太網(wǎng)控制器ENC28J60,方便擴展。該以太網(wǎng)控制器集成MAC和10 BASE-T PHY,與STM32的通信接口為最高速度可達10 Mb/s的SPI接口。脈沖變壓器來自Pulse型號為H1102。原理圖如圖4所示。
片外存儲模塊主要是指2MB的片外Flash,用來儲存PLC程序,通過SPI接口與CPU模塊進行數(shù)據(jù)的存取。
根據(jù)系統(tǒng)工作流程可知,軟件設計主要包括3部分:內(nèi)部處理、通信服務、虛擬機運行過程,以下將詳細進行說明。
主要包括以下幾個方面:
1)硬件初始化:STM32內(nèi)核芯片的初始化及軟件所用到的片上資源以及通信協(xié)議的初始化,如時鐘、定時器、Flash、ADC、串口、I/O口、液晶屏及顯示器、FreeModbus協(xié)議的初始化等。
2)按鍵判斷:2個按鍵,按下分別代表上載和下載。程序上載是指將系統(tǒng)存儲的程序上載傳輸?shù)絇C機上,程序下載是將編寫好的梯形圖程序燒寫到系統(tǒng)的Flash。整個過程都是在單片機控制下完成的,其中PC機通過串口與系統(tǒng)傳輸程序,系統(tǒng)通過SPI接口對Flash進行燒寫。在程序下載時利用了STM32串口的DMA高速傳輸,加快存取速度。為確保程序傳輸與程序燒寫能夠并行,DMA傳輸?shù)闹鞔娴刂肥莾山M512字節(jié)的緩沖器,當一組傳輸完成后觸發(fā)中斷,在中斷中切換DMA的主存地址到另一組緩沖器,同時CPU開始將緩沖器中的內(nèi)容燒寫片外Flash,這樣通過 “雙乒乓緩沖”的方式大幅提升程序燒寫速度。
考慮到較好通用性,以便與其他設備相連進行通信,系統(tǒng)集成了高級通信協(xié)議Modbus與TCP/IP協(xié)議。系統(tǒng)利用FreeModbus實現(xiàn)RTU與ASCII格式的Modbus從站通信,用戶可利用Modbus協(xié)議讀寫Q、I、模擬量變量。同時,利用Uip協(xié)議棧提供的TCP與DUP接口函數(shù),可方便的進行以太網(wǎng)通行,可以搭建小型的WEB服務器,用戶可通過瀏覽器遠程訪問該嵌入式PLC。
3.2.1 協(xié)議移植
1)FreeModbus的移植
Modbus是一種串行通信協(xié)議,已經(jīng)成為工業(yè)領域通信協(xié)議標準,并且現(xiàn)在是工業(yè)電子設備之間相當常用的連接方式。FreeModbus是針對通用的Modbus協(xié)議在嵌入式系統(tǒng)中應用的一個實現(xiàn),協(xié)議接收和傳輸RTU/ASCII數(shù)據(jù)幀是通過一個由硬件提取層的調(diào)用來驅(qū)動狀態(tài)機實現(xiàn)的,這就使得該協(xié)議棧非常容易移植到其他的平臺之上。當收到一個完整的數(shù)據(jù)幀后,該數(shù)據(jù)幀被傳人Modbus應用層,數(shù)據(jù)幀的內(nèi)容在該層得到解析。為方便增加新的Modbus功能,F(xiàn)reeModbus在應用層通提供了Hooks。

圖4 以太網(wǎng)接口原理圖Fig.4 The principle picture of Ethernet port
本系統(tǒng)采用的Freemodbus版本為V1.5,其協(xié)議的移植對硬件的需求是比較少的,需要處理器具有一個支持中斷的異步串行接口,該中斷至少包括接收緩沖區(qū)滿中斷和發(fā)送寄存器空中斷。另外,需要一個足夠處理FreeModbus數(shù)據(jù)幀的RAM空間,和一個用來產(chǎn)生Modbus協(xié)議時基的定時器。對于本設計硬件系統(tǒng)的主控芯片STM32F103RBT6來說,完全滿足上述條件,具備了較好的硬件移植環(huán)境,主要移植過程如下:
第一步:在port.h中定義了全局中斷的開關用來處理臨界問題。
第二步:配置異步串口的中斷接口,用來處理數(shù)據(jù)。
第三步:提供時間基準的定時器。
FreeModbus主要通過4個回調(diào)函數(shù):eMBRegInputCB(讀數(shù) 字 寄 存 器 )、eMBRegHoldingCB ( 讀/寫 數(shù) 字 寄 存 器 )、eMBRegCoilsCB(讀/寫開關寄存器)、eMBRegDiscreteCB(讀開關寄存器),來訪問用戶所指定的數(shù)據(jù)。嵌入式PLC已將I/O開關寄存器,模擬量數(shù)字寄存器與回調(diào)函數(shù)進行掛接,可使用Modbus進行讀寫。寄存器的讀寫函數(shù)已經(jīng)將PLC虛擬機的各變量的地址重新映射如表1所示,將PLC虛擬機的數(shù)據(jù)區(qū)分成了3個區(qū) 。
2)uip協(xié)議的移植
TCP/IP協(xié)議是傳輸控制協(xié)議的簡稱,它實際上是一個協(xié)議族,包括許多相關協(xié)議,目前較為著名的免費開源協(xié)議棧有:lwIP、uIP、openTCP、TinyTCP 等。 uIP 是專門為 8 位和 16單片機設計的一個非常小的TCP/IP協(xié)議棧。uIP完全用C編寫,可以很方便的移植到各種不同的結(jié)構(gòu)和操作系統(tǒng)上[6]。一個編譯的??梢杂袔譑B ROM或幾百字節(jié)RAM中運行。并且其硬件處理層、協(xié)議棧層和應用層共用一個全局緩存區(qū),不存在數(shù)據(jù)的拷貝,極大的節(jié)省空間和時間。由于結(jié)構(gòu)簡單、功能可靠,很多單片機都移植uIP協(xié)議棧。

表1 嵌入式PLC與FreeM odbus地址對應關系Tab.1 The corresponding relationship of embedded PLC and FreeM odbus address
本文移植的版本是uIP1.0版本,uIP協(xié)議棧去掉了完整的TCP/IP中不常用的功能,簡化了通訊流程,但保留了網(wǎng)絡通信必須使用的協(xié)議,本系統(tǒng)實現(xiàn)了以下協(xié)議:
ARP:地址解析協(xié)議
IP:網(wǎng)際協(xié)議
ICMP:因特網(wǎng)信息控制協(xié)議
TCP:傳輸控制協(xié)議
UDP:數(shù)據(jù)報協(xié)議
主要移植過程如下:
第一步:提供網(wǎng)卡驅(qū)動3個函數(shù):tapdev_init()網(wǎng)卡初始化函數(shù),初始化網(wǎng)卡的工作模式;tapdev_read()讀包函數(shù)。
第二步:配置STM32的SysTick定時器作時鐘。
第三步:在uipopt.h/uip-conf.h用來配置uIP,包括本地IP地址、網(wǎng)關地址、MAC地址等。
3.2.2 通信服務過程
主要是Modbus、Tcp-ip協(xié)議的處理過程,本系統(tǒng)默認的通信過程發(fā)生在Stop狀態(tài)下,其他時間是無效的。系統(tǒng)對Modbus協(xié)議進行解析和中斷觸發(fā)讀取網(wǎng)絡接受緩存,來判斷是否有Modbus或者Tcp-ip通信的需求,若是有,則進行相應的通信過程。
3.2.3 通信協(xié)議測試
通過簡單的組態(tài)控制平臺,該平臺運行于TPC7062KS一體化觸摸屏,通過RS-232串行口與STM相連??刂破脚_為ModbusRTU主站,STM32-PLC為從站,設計簡單的語句進行測試。經(jīng)驗證,協(xié)議運行正常。
在嵌入式PLC內(nèi)置Web服務器,其他設備可訪問這個WEB站點。通過網(wǎng)頁的表單操作便可控制PLC中部分的變量值或是實現(xiàn)其他功能,驗證了uip協(xié)議的正確性。
虛擬機運行是整個系統(tǒng)核心部分,分為三步:輸入采樣、程序執(zhí)行、輸出刷新,其原理圖如圖5所示。首先通過掃描輸入電路得到的狀態(tài)輸入到輸入映像寄存器中,其次經(jīng)過虛擬機處理執(zhí)行程序,按照順序方式掃描[7],當指令涉及到輸入、輸出狀態(tài)時,分別從相應的虛擬存儲器中讀取或者更新數(shù)據(jù)。最后,當程序執(zhí)行完畢,將根據(jù)輸出映像的狀態(tài)輸出,驅(qū)動相應負載。輸入采樣和輸出刷新相對簡單,以下將對程序執(zhí)行部分進行詳細論述。

圖5 虛擬機執(zhí)行原理圖Fig.5 The principle picture of virtualmachine execution
程序執(zhí)行,主要完成指令程序的處理,將輸出結(jié)果時時更新到虛擬存儲單元中。根據(jù)其過程,將其分成兩個步驟:代碼載入和語句解釋。代碼載入負責讀取程序以及對程序的初步處理,語句解釋將完成程序運算以及堆棧操作,并且不斷更新定時器、AD轉(zhuǎn)換器、IO模塊的數(shù)值。
1)代碼載入
語句表代碼載入主要負責將片外Flash芯片中的語句表進行讀取,分離掉語句表中如注釋、空格、換行等無效內(nèi)容,提取程序塊,網(wǎng)絡號以及當前的程序地址,以便更新代碼載入,將有效的語句表指令送入一個二維數(shù)組,然后進入下一條指令的讀取。語句表代碼載入主要由兩部分構(gòu)成:指令讀取、指令預處理。
在STM32芯片中,開辟了一個容量為512字節(jié)的緩存,指令每次讀取以換行符為一行的結(jié)束標志的一行,直到將片外Flash的讀取到此緩存放滿512字節(jié)為止。指令讀取完畢后,進行指令預處理,進行信息更新和instruc[][]數(shù)組的更新。instruc[][]數(shù)組是個二維數(shù)組,存放的是當前指令,其中,instruc[0]存放的是指令操作碼,如 LD(取指令),A(與指令)等,instruc[1]、instruct[2]、instruct[3]存放的是操作數(shù),本文默認的可支持操作數(shù)個數(shù)是3個。
2)語句解釋
語句表解釋器將根據(jù)instruc[][]中的內(nèi)容操作PLC虛擬機的堆棧與變量。解釋器函數(shù)名為Execute_Instruc()。這是一個狀態(tài)機結(jié)構(gòu)的函數(shù)。Execute_Instruc()將根據(jù)instruc[0]中的指令操作碼選擇不同的調(diào)用不同的函數(shù)。Execute_Instruc()部分為:
switch(*(u32*)instruc)
{
case 0x444c://LD指令Run_LD();//LD 處理break;
case 0x4e444c://LDN指令Run_LDN();break;
case 0x4e41://AN指令Run_AN();break;
……
不同的指令將調(diào)用不同的指令解釋函數(shù)進行執(zhí)行,在執(zhí)行過程中,采用了堆棧來實現(xiàn)語句表功能。虛擬機使用一個16位全局變量Stack作為STM-PLC堆棧,堆棧操作采用STEP7的標準進行設計,LD、OLD、ALD等指令將會對這個虛擬的堆棧進行操作,在此過程中,更新相應的虛擬輸出存儲寄存器。
本文在充分研究傳統(tǒng)PLC工作原理基礎上,采用微控制器STM32平臺實現(xiàn)了嵌入式PLC的設計,在不改變傳統(tǒng)PLC優(yōu)點前提下,解決了傳統(tǒng)PLC某些場合成本過高、資源浪費等缺陷。與傳統(tǒng)PLC相比較,嵌入式PLC不僅能支持梯形圖開發(fā),還可以支持與C語言混合開發(fā),開發(fā)方式更靈活。同時,系統(tǒng)集成了通信功能,可以滿足不同的工業(yè)控制需求。
[1]陳輝,李堅強,裴海龍,等.基于梯形圖語言的軟PLC技術(shù)研究與實現(xiàn)[J].微型計算機信息,2006,22(9-1):266.CHEN Hui,LI Jian-qiang,F(xiàn)EI Hai-long,et al.Study and realize soft PLC technology based on ladder language[J].Microcomputer Information,2006,22(9-1):266.
[2]謝麗萍,王占富,豈興明.西門子S7-200系列PLC快速入門與實踐[M].北京:人民郵電出版社,2010.
[3]翟紅程,俞寧.西門子S7-200 PLC應用教程[M].北京:機械工業(yè)出版社,2009.
[4]馬遠佳.軟PLC通信接口的研究及實現(xiàn)[D].成都:西華大學,2009.
[5]張舞杰,南亦民.基于STM32F103VB的應用編程技術(shù)的實現(xiàn)[J].計算機應用,2009,29(10):2820.ZHANGWu-jie,NAN Yi-min.Design and implementation of IAP techniques based on STM32F103VB [J].Journal of Computer Applications,2009,29(10):2820.
[6]江三青.基于STM32的嵌入式網(wǎng)絡協(xié)議Uip的移植和分析[D].武漢:武漢理工大學,2011.
[7]嚴盈富.西門子S7-200 PLC入門[M].北京:人民郵電出版社,2007.