李雪蓮
(寶雞文理學(xué)院 陜西 寶雞 721016)
可編程控制器(PLC)以工作可靠、維護(hù)簡(jiǎn)單、編程方便被廣泛應(yīng)用于工業(yè)控制現(xiàn)場(chǎng)。目前,大部分PLC工程師采用的是梯形圖進(jìn)行編程,容易上手,開(kāi)發(fā)周期短,然而,人們?cè)谑褂眠^(guò)程中也逐漸發(fā)現(xiàn)了傳統(tǒng)PLC的缺點(diǎn):兼容性差、標(biāo)準(zhǔn)不統(tǒng)一、封閉、擴(kuò)展能力差、成本較高等[1],針對(duì)這一現(xiàn)狀,市場(chǎng)上的多款單片機(jī)工控板應(yīng)運(yùn)而生。這些工控板與傳統(tǒng)PLC相比有明顯的價(jià)格優(yōu)勢(shì),但是很多做工業(yè)現(xiàn)場(chǎng)的工程師仍不愿用單片機(jī)工控板代替PLC,其主要原因是單片機(jī)工控板的C語(yǔ)言開(kāi)發(fā)方式與梯形圖開(kāi)發(fā)相比難度較大且不利于應(yīng)用于工業(yè)控制現(xiàn)場(chǎng)。
通過(guò)對(duì)PLC運(yùn)行機(jī)制、梯形圖指令及其軟件開(kāi)發(fā)工具的研究,本文設(shè)計(jì)以STM32為平臺(tái)、以西門子S7-200為設(shè)計(jì)模型的嵌入式PLC,支持梯形圖與C語(yǔ)言的混合開(kāi)發(fā),同時(shí)兼容了單片機(jī)的開(kāi)發(fā)靈活、成本低廉等優(yōu)點(diǎn)。為了更好的適應(yīng)當(dāng)今通信的快速發(fā)展要求,移植了Modbus、TCP-ip協(xié)議,增強(qiáng)了嵌入式PLC的應(yīng)用場(chǎng)合。
S7-200是一種小型的PLC,具有結(jié)構(gòu)設(shè)計(jì)緊湊、擴(kuò)展性好、功能模塊豐富、指令強(qiáng)大以及價(jià)格低廉等特點(diǎn),可以滿足多種控制系統(tǒng)的需要[2]。傳統(tǒng)PLC采用循環(huán)掃描工作方式,一般包括5個(gè)階段:內(nèi)部處理,通信服務(wù),輸入采樣,程序執(zhí)行,輸出刷新[3]。
本文以S7-200為參考模型進(jìn)行設(shè)計(jì),遵循傳統(tǒng)PLC工作方式,采用掃描方式運(yùn)行。有兩種狀態(tài),Run(運(yùn)行)和Stop(停止),分別對(duì)應(yīng)硬件資源的兩個(gè)按鍵。當(dāng)系統(tǒng)處于Run狀態(tài)時(shí),除完成內(nèi)部處理和通信服務(wù)后,還要完成輸入采樣、程序運(yùn)行、輸出刷新。當(dāng)系統(tǒng)處于Stop狀態(tài)時(shí),只運(yùn)行內(nèi)部處理和通信服務(wù)。
本系統(tǒng)建立在STM32F103RBT6芯片平臺(tái)之上,利用軟件方法實(shí)現(xiàn)傳統(tǒng)PLC的計(jì)算、控制、存儲(chǔ)、通信以及編程等功能,通過(guò)I/O驅(qū)動(dòng)模塊以及現(xiàn)場(chǎng)總線等物理設(shè)備完成現(xiàn)場(chǎng)數(shù)據(jù)的采集以及信號(hào)的輸出[4]。整個(gè)系統(tǒng)可以分成內(nèi)部處理、通信服務(wù)以及虛擬機(jī)運(yùn)行三階段,Run和Stop兩種狀態(tài),如圖1所示。內(nèi)部處理階段,進(jìn)行PLC自檢,系統(tǒng)硬件軟件初始化、是否進(jìn)行程序上載/下載等;通信服務(wù)階段,該嵌入式PLC可以通過(guò)Modbus或者Tcp-ip協(xié)議與其他裝置實(shí)現(xiàn)通信,響應(yīng)編程器鍵入的命令,更新LCD液晶屏的顯示內(nèi)容;虛擬機(jī)運(yùn)行階段是整個(gè)系統(tǒng)的核心,它直接解析語(yǔ)句表代碼,通過(guò)I/O驅(qū)動(dòng)不斷讀取I/O設(shè)備的狀態(tài),經(jīng)過(guò)程序逐條執(zhí)行,生成最終的I/O控制信號(hào),驅(qū)動(dòng)外部負(fù)載。
圖1 嵌入式PLC工作流程示意圖Fig.1 Schematic plot of Embedded PLCwork process
嵌入式PLC通過(guò)對(duì)光耦器件進(jìn)行電氣隔離和對(duì)電源部分加入高頻濾波來(lái)提高其安全性。系統(tǒng)的硬件根據(jù)其功能布局,可以劃分成5個(gè)模塊電路:CPU模塊,輸入模塊,輸出模塊,通信模塊,片外存儲(chǔ)模塊。其整體框圖如圖2所示。
圖2 硬件邏輯框圖Fig.2 The logic picture of hardware
CPU模塊采用的主控芯片隸屬于STM32系列中等容量增強(qiáng)型。CPU內(nèi)核為ARM 32位的Cortex?-M3,最高72MHz工作頻率,擁有128K字節(jié)的閃存程序存儲(chǔ)器與高達(dá)20K字節(jié)的 SRAM,外設(shè)豐富[5]。
輸入模塊包括6路A/D模擬輸入以及8路隔離I/O開(kāi)關(guān)量輸入兩種類型。輸出模塊包括7路繼電器輸出、一個(gè)液晶屏和一個(gè)蜂鳴器輸出。其中,繼電器為歐姆龍G5V-1DC5小型繼電器。線圈額定電壓5 V,額定電流30mA。額定負(fù)載AC125V 0.5A、DC24V 1A,動(dòng)作時(shí)間 5ms以下。
Modbus通過(guò)串口該嵌入式PLC通信,其接口原理圖如圖3所示。串口電平轉(zhuǎn)換芯片為美芯公司的MAX3232,TXD0與RXD0連接到STM32的USART1。
圖3 RS-232接口原理圖Fig.3 The principle picture of RS-232 port
通信模塊同時(shí)設(shè)計(jì)了來(lái)自Microchip帶SPI接口的獨(dú)立以太網(wǎng)控制器ENC28J60,方便擴(kuò)展。該以太網(wǎng)控制器集成MAC和10 BASE-T PHY,與STM32的通信接口為最高速度可達(dá)10 Mb/s的SPI接口。脈沖變壓器來(lái)自Pulse型號(hào)為H1102。原理圖如圖4所示。
片外存儲(chǔ)模塊主要是指2MB的片外Flash,用來(lái)儲(chǔ)存PLC程序,通過(guò)SPI接口與CPU模塊進(jìn)行數(shù)據(jù)的存取。
根據(jù)系統(tǒng)工作流程可知,軟件設(shè)計(jì)主要包括3部分:內(nèi)部處理、通信服務(wù)、虛擬機(jī)運(yùn)行過(guò)程,以下將詳細(xì)進(jìn)行說(shuō)明。
主要包括以下幾個(gè)方面:
1)硬件初始化:STM32內(nèi)核芯片的初始化及軟件所用到的片上資源以及通信協(xié)議的初始化,如時(shí)鐘、定時(shí)器、Flash、ADC、串口、I/O口、液晶屏及顯示器、FreeModbus協(xié)議的初始化等。
2)按鍵判斷:2個(gè)按鍵,按下分別代表上載和下載。程序上載是指將系統(tǒng)存儲(chǔ)的程序上載傳輸?shù)絇C機(jī)上,程序下載是將編寫(xiě)好的梯形圖程序燒寫(xiě)到系統(tǒng)的Flash。整個(gè)過(guò)程都是在單片機(jī)控制下完成的,其中PC機(jī)通過(guò)串口與系統(tǒng)傳輸程序,系統(tǒng)通過(guò)SPI接口對(duì)Flash進(jìn)行燒寫(xiě)。在程序下載時(shí)利用了STM32串口的DMA高速傳輸,加快存取速度。為確保程序傳輸與程序燒寫(xiě)能夠并行,DMA傳輸?shù)闹鞔娴刂肥莾山M512字節(jié)的緩沖器,當(dāng)一組傳輸完成后觸發(fā)中斷,在中斷中切換DMA的主存地址到另一組緩沖器,同時(shí)CPU開(kāi)始將緩沖器中的內(nèi)容燒寫(xiě)片外Flash,這樣通過(guò) “雙乒乓緩沖”的方式大幅提升程序燒寫(xiě)速度。
考慮到較好通用性,以便與其他設(shè)備相連進(jìn)行通信,系統(tǒng)集成了高級(jí)通信協(xié)議Modbus與TCP/IP協(xié)議。系統(tǒng)利用FreeModbus實(shí)現(xiàn)RTU與ASCII格式的Modbus從站通信,用戶可利用Modbus協(xié)議讀寫(xiě)Q、I、模擬量變量。同時(shí),利用Uip協(xié)議棧提供的TCP與DUP接口函數(shù),可方便的進(jìn)行以太網(wǎng)通行,可以搭建小型的WEB服務(wù)器,用戶可通過(guò)瀏覽器遠(yuǎn)程訪問(wèn)該嵌入式PLC。
3.2.1 協(xié)議移植
1)FreeModbus的移植
Modbus是一種串行通信協(xié)議,已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議標(biāo)準(zhǔn),并且現(xiàn)在是工業(yè)電子設(shè)備之間相當(dāng)常用的連接方式。FreeModbus是針對(duì)通用的Modbus協(xié)議在嵌入式系統(tǒng)中應(yīng)用的一個(gè)實(shí)現(xiàn),協(xié)議接收和傳輸RTU/ASCII數(shù)據(jù)幀是通過(guò)一個(gè)由硬件提取層的調(diào)用來(lái)驅(qū)動(dòng)狀態(tài)機(jī)實(shí)現(xiàn)的,這就使得該協(xié)議棧非常容易移植到其他的平臺(tái)之上。當(dāng)收到一個(gè)完整的數(shù)據(jù)幀后,該數(shù)據(jù)幀被傳人Modbus應(yīng)用層,數(shù)據(jù)幀的內(nèi)容在該層得到解析。為方便增加新的Modbus功能,F(xiàn)reeModbus在應(yīng)用層通提供了Hooks。
圖4 以太網(wǎng)接口原理圖Fig.4 The principle picture of Ethernet port
本系統(tǒng)采用的Freemodbus版本為V1.5,其協(xié)議的移植對(duì)硬件的需求是比較少的,需要處理器具有一個(gè)支持中斷的異步串行接口,該中斷至少包括接收緩沖區(qū)滿中斷和發(fā)送寄存器空中斷。另外,需要一個(gè)足夠處理FreeModbus數(shù)據(jù)幀的RAM空間,和一個(gè)用來(lái)產(chǎn)生Modbus協(xié)議時(shí)基的定時(shí)器。對(duì)于本設(shè)計(jì)硬件系統(tǒng)的主控芯片STM32F103RBT6來(lái)說(shuō),完全滿足上述條件,具備了較好的硬件移植環(huán)境,主要移植過(guò)程如下:
第一步:在port.h中定義了全局中斷的開(kāi)關(guān)用來(lái)處理臨界問(wèn)題。
第二步:配置異步串口的中斷接口,用來(lái)處理數(shù)據(jù)。
第三步:提供時(shí)間基準(zhǔn)的定時(shí)器。
FreeModbus主要通過(guò)4個(gè)回調(diào)函數(shù):eMBRegInputCB(讀數(shù) 字 寄 存 器 )、eMBRegHoldingCB ( 讀/寫(xiě) 數(shù) 字 寄 存 器 )、eMBRegCoilsCB(讀/寫(xiě)開(kāi)關(guān)寄存器)、eMBRegDiscreteCB(讀開(kāi)關(guān)寄存器),來(lái)訪問(wèn)用戶所指定的數(shù)據(jù)。嵌入式PLC已將I/O開(kāi)關(guān)寄存器,模擬量數(shù)字寄存器與回調(diào)函數(shù)進(jìn)行掛接,可使用Modbus進(jìn)行讀寫(xiě)。寄存器的讀寫(xiě)函數(shù)已經(jīng)將PLC虛擬機(jī)的各變量的地址重新映射如表1所示,將PLC虛擬機(jī)的數(shù)據(jù)區(qū)分成了3個(gè)區(qū) 。
2)uip協(xié)議的移植
TCP/IP協(xié)議是傳輸控制協(xié)議的簡(jiǎn)稱,它實(shí)際上是一個(gè)協(xié)議族,包括許多相關(guān)協(xié)議,目前較為著名的免費(fèi)開(kāi)源協(xié)議棧有:lwIP、uIP、openTCP、TinyTCP 等。 uIP 是專門為 8 位和 16單片機(jī)設(shè)計(jì)的一個(gè)非常小的TCP/IP協(xié)議棧。uIP完全用C編寫(xiě),可以很方便的移植到各種不同的結(jié)構(gòu)和操作系統(tǒng)上[6]。一個(gè)編譯的??梢杂袔譑B ROM或幾百字節(jié)RAM中運(yùn)行。并且其硬件處理層、協(xié)議棧層和應(yīng)用層共用一個(gè)全局緩存區(qū),不存在數(shù)據(jù)的拷貝,極大的節(jié)省空間和時(shí)間。由于結(jié)構(gòu)簡(jiǎn)單、功能可靠,很多單片機(jī)都移植uIP協(xié)議棧。
表1 嵌入式PLC與FreeM odbus地址對(duì)應(yīng)關(guān)系Tab.1 The corresponding relationship of embedded PLC and FreeM odbus address
本文移植的版本是uIP1.0版本,uIP協(xié)議棧去掉了完整的TCP/IP中不常用的功能,簡(jiǎn)化了通訊流程,但保留了網(wǎng)絡(luò)通信必須使用的協(xié)議,本系統(tǒng)實(shí)現(xiàn)了以下協(xié)議:
ARP:地址解析協(xié)議
IP:網(wǎng)際協(xié)議
ICMP:因特網(wǎng)信息控制協(xié)議
TCP:傳輸控制協(xié)議
UDP:數(shù)據(jù)報(bào)協(xié)議
主要移植過(guò)程如下:
第一步:提供網(wǎng)卡驅(qū)動(dòng)3個(gè)函數(shù):tapdev_init()網(wǎng)卡初始化函數(shù),初始化網(wǎng)卡的工作模式;tapdev_read()讀包函數(shù)。
第二步:配置STM32的SysTick定時(shí)器作時(shí)鐘。
第三步:在uipopt.h/uip-conf.h用來(lái)配置uIP,包括本地IP地址、網(wǎng)關(guān)地址、MAC地址等。
3.2.2 通信服務(wù)過(guò)程
主要是Modbus、Tcp-ip協(xié)議的處理過(guò)程,本系統(tǒng)默認(rèn)的通信過(guò)程發(fā)生在Stop狀態(tài)下,其他時(shí)間是無(wú)效的。系統(tǒng)對(duì)Modbus協(xié)議進(jìn)行解析和中斷觸發(fā)讀取網(wǎng)絡(luò)接受緩存,來(lái)判斷是否有Modbus或者Tcp-ip通信的需求,若是有,則進(jìn)行相應(yīng)的通信過(guò)程。
3.2.3 通信協(xié)議測(cè)試
通過(guò)簡(jiǎn)單的組態(tài)控制平臺(tái),該平臺(tái)運(yùn)行于TPC7062KS一體化觸摸屏,通過(guò)RS-232串行口與STM相連。控制平臺(tái)為ModbusRTU主站,STM32-PLC為從站,設(shè)計(jì)簡(jiǎn)單的語(yǔ)句進(jìn)行測(cè)試。經(jīng)驗(yàn)證,協(xié)議運(yùn)行正常。
在嵌入式PLC內(nèi)置Web服務(wù)器,其他設(shè)備可訪問(wèn)這個(gè)WEB站點(diǎn)。通過(guò)網(wǎng)頁(yè)的表單操作便可控制PLC中部分的變量值或是實(shí)現(xiàn)其他功能,驗(yàn)證了uip協(xié)議的正確性。
虛擬機(jī)運(yùn)行是整個(gè)系統(tǒng)核心部分,分為三步:輸入采樣、程序執(zhí)行、輸出刷新,其原理圖如圖5所示。首先通過(guò)掃描輸入電路得到的狀態(tài)輸入到輸入映像寄存器中,其次經(jīng)過(guò)虛擬機(jī)處理執(zhí)行程序,按照順序方式掃描[7],當(dāng)指令涉及到輸入、輸出狀態(tài)時(shí),分別從相應(yīng)的虛擬存儲(chǔ)器中讀取或者更新數(shù)據(jù)。最后,當(dāng)程序執(zhí)行完畢,將根據(jù)輸出映像的狀態(tài)輸出,驅(qū)動(dòng)相應(yīng)負(fù)載。輸入采樣和輸出刷新相對(duì)簡(jiǎn)單,以下將對(duì)程序執(zhí)行部分進(jìn)行詳細(xì)論述。
圖5 虛擬機(jī)執(zhí)行原理圖Fig.5 The principle picture of virtualmachine execution
程序執(zhí)行,主要完成指令程序的處理,將輸出結(jié)果時(shí)時(shí)更新到虛擬存儲(chǔ)單元中。根據(jù)其過(guò)程,將其分成兩個(gè)步驟:代碼載入和語(yǔ)句解釋。代碼載入負(fù)責(zé)讀取程序以及對(duì)程序的初步處理,語(yǔ)句解釋將完成程序運(yùn)算以及堆棧操作,并且不斷更新定時(shí)器、AD轉(zhuǎn)換器、IO模塊的數(shù)值。
1)代碼載入
語(yǔ)句表代碼載入主要負(fù)責(zé)將片外Flash芯片中的語(yǔ)句表進(jìn)行讀取,分離掉語(yǔ)句表中如注釋、空格、換行等無(wú)效內(nèi)容,提取程序塊,網(wǎng)絡(luò)號(hào)以及當(dāng)前的程序地址,以便更新代碼載入,將有效的語(yǔ)句表指令送入一個(gè)二維數(shù)組,然后進(jìn)入下一條指令的讀取。語(yǔ)句表代碼載入主要由兩部分構(gòu)成:指令讀取、指令預(yù)處理。
在STM32芯片中,開(kāi)辟了一個(gè)容量為512字節(jié)的緩存,指令每次讀取以換行符為一行的結(jié)束標(biāo)志的一行,直到將片外Flash的讀取到此緩存放滿512字節(jié)為止。指令讀取完畢后,進(jìn)行指令預(yù)處理,進(jìn)行信息更新和instruc[][]數(shù)組的更新。instruc[][]數(shù)組是個(gè)二維數(shù)組,存放的是當(dāng)前指令,其中,instruc[0]存放的是指令操作碼,如 LD(取指令),A(與指令)等,instruc[1]、instruct[2]、instruct[3]存放的是操作數(shù),本文默認(rèn)的可支持操作數(shù)個(gè)數(shù)是3個(gè)。
2)語(yǔ)句解釋
語(yǔ)句表解釋器將根據(jù)instruc[][]中的內(nèi)容操作PLC虛擬機(jī)的堆棧與變量。解釋器函數(shù)名為Execute_Instruc()。這是一個(gè)狀態(tài)機(jī)結(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ù)進(jìn)行執(zhí)行,在執(zhí)行過(guò)程中,采用了堆棧來(lái)實(shí)現(xiàn)語(yǔ)句表功能。虛擬機(jī)使用一個(gè)16位全局變量Stack作為STM-PLC堆棧,堆棧操作采用STEP7的標(biāo)準(zhǔn)進(jìn)行設(shè)計(jì),LD、OLD、ALD等指令將會(huì)對(duì)這個(gè)虛擬的堆棧進(jìn)行操作,在此過(guò)程中,更新相應(yīng)的虛擬輸出存儲(chǔ)寄存器。
本文在充分研究傳統(tǒng)PLC工作原理基礎(chǔ)上,采用微控制器STM32平臺(tái)實(shí)現(xiàn)了嵌入式PLC的設(shè)計(jì),在不改變傳統(tǒng)PLC優(yōu)點(diǎn)前提下,解決了傳統(tǒng)PLC某些場(chǎng)合成本過(guò)高、資源浪費(fèi)等缺陷。與傳統(tǒng)PLC相比較,嵌入式PLC不僅能支持梯形圖開(kāi)發(fā),還可以支持與C語(yǔ)言混合開(kāi)發(fā),開(kāi)發(fā)方式更靈活。同時(shí),系統(tǒng)集成了通信功能,可以滿足不同的工業(yè)控制需求。
[1]陳輝,李堅(jiān)強(qiáng),裴海龍,等.基于梯形圖語(yǔ)言的軟PLC技術(shù)研究與實(shí)現(xiàn)[J].微型計(jì)算機(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快速入門與實(shí)踐[M].北京:人民郵電出版社,2010.
[3]翟紅程,俞寧.西門子S7-200 PLC應(yīng)用教程[M].北京:機(jī)械工業(yè)出版社,2009.
[4]馬遠(yuǎn)佳.軟PLC通信接口的研究及實(shí)現(xiàn)[D].成都:西華大學(xué),2009.
[5]張舞杰,南亦民.基于STM32F103VB的應(yīng)用編程技術(shù)的實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,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)絡(luò)協(xié)議Uip的移植和分析[D].武漢:武漢理工大學(xué),2011.
[7]嚴(yán)盈富.西門子S7-200 PLC入門[M].北京:人民郵電出版社,2007.