雷紅華,楊國富
(襄陽職業(yè)技術(shù)學(xué)院,湖北 襄陽 441050)
隨著大規(guī)模集成電路的發(fā)展,以微處理器為核心的可編程序控制器(PLC)得到了迅猛的發(fā)展,它在現(xiàn)代工業(yè)的應(yīng)用也越來越廣泛,PLC也成為了各大高職院校制造類相關(guān)專業(yè)必修的專業(yè)核心能力課程。面對高職學(xué)生自控性較差、班級學(xué)生組成結(jié)構(gòu)復(fù)雜、水平層次參差不齊、學(xué)習(xí)激情不高的特點,利用博途PLC程序、HMI人機界面和一些外部配件設(shè)計完成了俄羅斯方塊應(yīng)用程序,通過制作這個游戲項目,讓學(xué)生較好的掌握PLC工作原理、工作方式、流程控制和應(yīng)用編程等,將被動學(xué)習(xí)變?yōu)橹鲃訉W(xué)習(xí)。
俄羅斯方塊最早是由俄羅斯人阿列克謝·帕基特諾夫于1984年6月發(fā)明的一款經(jīng)典游戲,[1]娛樂性強,規(guī)則簡單,項目的設(shè)計難度適中,既培養(yǎng)學(xué)習(xí)人員的編程思維,又使自我效能感獲得增強。[2]
俄羅斯方塊應(yīng)用程序可一個人獨立完成,其所需設(shè)備為一臺西門子S7-1200系列PLC 1212C DC/DC/DC,及一個配套的HMI KPT 900 Basic,四個外部按鈕,一個三色燈。PLC作為一個處理器處理所有的數(shù)據(jù),HMI作為一個輸入輸出設(shè)備既可以用來顯示畫面,也可以采集玩家的操作,并移交于PLC處理。整套設(shè)備特別要注意通信類型的匹配。
游戲中所有的俄羅斯方塊都是由四個正方形塊在一個4*4的矩形中組合而成的,共有七種,加上每個方塊都有四個不同的方向(2*2的矩形方塊四個不同方向形狀一致也算四個)共有28種。游戲操作是在一個10*20的矩形中進行的,至少需要四個功能鍵:左移、右移、旋轉(zhuǎn)、快速下落,以及一些基礎(chǔ)的“開始、結(jié)束、暫停鍵”等,而且游戲界面需顯示操作者當(dāng)前得分。
所有畫面和動畫的顯示都借助HMI完成,添加200個矩形對象排列成10*20的狀態(tài),并為其添加相應(yīng)的動畫,將200個矩形動畫與顯示數(shù)組一一關(guān)聯(lián)起來。所有的實體與虛體都被存儲在對應(yīng)的數(shù)組里,數(shù)組顯示為實體與虛體的總合,即顯示所有的實體和虛體,虛體中的數(shù)據(jù)是根據(jù)方塊的位置和方塊的模型生成的。
該游戲的基本規(guī)則是通過一定的旋轉(zhuǎn)和移動來放置方塊,并根據(jù)規(guī)則消除滿行。[3]在按下開始鍵后,系統(tǒng)會隨機生成一個方塊,并隨機生成一個位置。每個下落周期游離的方塊(以下簡稱“虛體”)都會下落一次,在下落的過程中,可以進行相應(yīng)的移動和旋轉(zhuǎn)操作,每個下落周期結(jié)束后,系統(tǒng)都會判斷虛體是否已經(jīng)碰觸底部,或者是已經(jīng)固定的方塊(以下簡稱“實體”)。若已觸及底部或?qū)嶓w則當(dāng)前的游離周期(從模型生成至虛體到轉(zhuǎn)化為實體稱一個游離周期)結(jié)束,接著所有的虛體都轉(zhuǎn)化成實體。若實體超出了上邊界,則游戲被結(jié)束,所有實體和虛體都會被清空。若游戲未結(jié)束,則從下往上判斷是否存在一整行的實體,若存在,則消除該行,將該行以上的實體都下移一行,然后從該行繼續(xù)判斷,若不存在,則向上判斷,直至判斷完所有實體。判斷完成后生成下一個隨機模型,開始下一次游離周期。在平移或旋轉(zhuǎn)操作后,若虛體超出邊界或與實體重合,則該次操作是不被允許的,虛體不會發(fā)生任何改變。
玩家通過外部的開始按鈕啟動游戲,游戲一開始系統(tǒng)就會自動生成一個隨機模型和一個隨機位置,然后開始一個游離周期,在游離周期過程中,玩家可以左右移動及旋轉(zhuǎn)操作,也可以通過外部按鈕暫停游戲。在暫停期間外部的三色燈黃色閃爍,游戲進行時三色燈綠色亮起,當(dāng)游戲結(jié)束時紅燈會亮起。若玩家想要終止游戲也可以通過一個外部按鈕來結(jié)束當(dāng)前的游戲。俄羅斯方塊應(yīng)用程序總流程控制框圖如圖1所示。
圖1 總控制流程框圖
如圖2所示為一個俄羅斯方塊,以右下角為低位,左上角為高位,每個方塊都表示一個16位二進制數(shù),將圖2中16位二進制數(shù)轉(zhuǎn)換為一個十進制整數(shù)1112,則這個整數(shù)就表示當(dāng)前模型,同理制作另外27個模型,將28個模型存儲在一個模型倉庫數(shù)組中,相同方塊不同方向的模型在存儲時下標(biāo)相差7,例如當(dāng)前模型被存儲在了模型倉庫數(shù)組第一個位置,則其模型的下一個方向應(yīng)該是由上一個模型順時針旋轉(zhuǎn)90度后存儲到數(shù)組第八個,用同樣的方法存儲到第十五個、第二十二個。
圖2 方塊模型
由于TIA博途中沒有自帶有關(guān)的隨機函數(shù),需自行設(shè)計一段生成隨機數(shù)的程序,利用一個函數(shù)RD_SYS_T讀取系統(tǒng)的時間。再利用當(dāng)前時間的納秒數(shù)值除1 000后加上秒數(shù)并除28求余(除1000是為了防止讀取的納秒數(shù)值后3位都為0,加上秒數(shù)是為了增加隨機性,以達到生成隨機數(shù)的目的),將求取的余數(shù)作為下標(biāo)。接著建立一個長度為17位模型數(shù)組,即在模型數(shù)組中前16位數(shù)表示模型的形狀,最后一位數(shù)值則表示模型在模型倉庫中的位置既下標(biāo),同樣也可以表示種類號,即在模型倉庫中抽取一個隨機模型,將隨機模型對應(yīng)的十進制整數(shù)依次除2求余,形成一個16位二進制數(shù),若余數(shù)為1,則將模型的種類號存儲到模型數(shù)組當(dāng)中。七種方塊對應(yīng)七個種類號,不同的種類號會令方塊顯示不同的顏色,通過這個方法可以再次將圖2的模型表示了出來。同時,在圖上顯示方塊,除了需要一個確定形狀的模型,還需要一個位置。再次使用隨機抽取模型的方法,在“隨機位置”數(shù)組中任意取一個位置作為模型位置。以模型左上角與模型位置為較準(zhǔn)點等比例將模型映射到虛體(可變化可移動)上作為一個確定的方塊,因每個周期模型位置都會下降一行(模型左上角是與模型位置重合的,一行有十個方塊,將模型位置+10,正好將模型位置下移一行),所以整個方塊也會下降一行。
因為確定了模型位置,所以在移動過程中只需移動模型位置,整個方塊的位置也會隨之改變。當(dāng)HMI收到左移的指令時,PLC會判斷虛體是否已經(jīng)接觸左邊界或虛體左側(cè)存在實體。若已接觸左邊界或左側(cè)存在實體那么條件不滿足,不執(zhí)行移動。若模型位置-1則向左移動一格;右移同理。
在制作模型的過程中,已將一種模型的四個不同方向方塊存儲在了模型倉庫數(shù)組中,并且各個不同方向模型在數(shù)組中下標(biāo)相差7。按下旋轉(zhuǎn)命令后,則將模型數(shù)組的最后一個數(shù)值加上7后除28求余(防止下標(biāo)越界),既可得到新的模型下標(biāo),通過新的模型下標(biāo)即可在模型倉庫數(shù)組中得到新的模型,用上面相同的方法將模型存儲到模型數(shù)組的前16位中。這樣新的模型數(shù)組中的模型就是旋轉(zhuǎn)后的模型了。若旋轉(zhuǎn)后的虛體與實體相重合,或超出邊界,則旋轉(zhuǎn)的條件不滿足,模型會被還原到旋轉(zhuǎn)之前的樣子。
利用一個定時器,每隔一段時間就會觸發(fā)一次下落的程序。下落前會進行一次判斷,判斷是否虛體已經(jīng)接觸底部或者下方存在實體。若未接觸或下方不存在實體,則會觸發(fā)一次下落,既將模型位置+10。若已接觸底部或下方存在實體,則會將虛體轉(zhuǎn)換為實體,既將虛體中所有不為0的值賦值給實體,然后從下往上判斷實體中是否存在一整行的情況,若存在則從該行開始,依次將上一行的值賦值給下一行。然后繼續(xù)判斷該行,若不存在,則向上判斷直至判斷完全是實體。完成后,再次生成一個隨機模型和隨機模型位置,繼續(xù)下一個游離周期。
以模型生成的程序為例,首先添加一個FC的函數(shù)塊,更改名字為“模型生成”,更改編程語言為SCL語言。新建兩個DB塊,一個命名為“命令”,一個命令為“數(shù)據(jù)”。在“數(shù)據(jù)”塊中添加變量如圖3如示,在“命令”塊中添加變量如圖4所示。
圖3 數(shù)據(jù)塊中的變量
添加完所有程序數(shù)據(jù)后,便可開始編程了,生成模型程序如圖5所示。如圖6所示完成的PLC主控程序,按下按鈕1開始鍵后,“開始”、“生成模型”變量會被置位。當(dāng)“生成模型”變量被置位后,生成模型函數(shù)中對應(yīng)的程序會被觸發(fā),首先通過讀取時間,再將讀取到的時間做一個運算獲得一個隨機數(shù),求余數(shù)后保存至模型數(shù)組最后一個值。再通過這個值在模型倉庫中獲取相應(yīng)的模型,并存儲到一個臨時變量#m中,再將#m依次除二求取余數(shù),若求取的余數(shù)為1則將種類號存儲到模型數(shù)組相應(yīng)的位置。并把“下一個”置位以啟動其他的程序,然后將“生成模型”復(fù)位。
圖4 命令塊中的變量
參照上述的各個功能的描述和解釋,依次編寫所有的函數(shù)塊,并將所有函數(shù)塊在主程序中調(diào)用。并在主程序中編寫外部按鈕和三色燈的程序。實現(xiàn)按下按鈕1后置位“生成模型”和“開始”,按下按鈕2后暫停游戲,第二次按下后繼續(xù)游戲,既按下時將“暫?!比》?按下按鈕3后結(jié)束游戲,既置位“停止”。當(dāng)“暫?!睘?時,三色燈黃燈閃爍,當(dāng)“開始”為1并且“暫?!辈粸?時綠燈常亮,當(dāng)“開始”“暫?!倍疾粸?時紅燈常亮。
完成PLC的程序編寫后,需布局HMI中的畫面及一些事件。設(shè)計一個如圖7所示的畫面。
圖7 HMI人機界面圖
圖8 方塊顏色設(shè)定
并為每個方塊都添加圖8所示多種不同顏色的動畫,關(guān)聯(lián)對應(yīng)變量,即可讓不同的方塊顯示不同的顏色。添加“GAME OVER”的字樣,設(shè)置其可見性,僅在游戲結(jié)束時出現(xiàn)。添加四個操作按鍵并關(guān)聯(lián)對應(yīng)的事件,以及四個流程的控制鍵及其變量關(guān)聯(lián)。添加兩個“I/O域”用于顯示難度和得分。在完成PLC程序和HMI的動畫和事件后,可將其下載至PLC和HMI中查看效果,點擊開始鍵后,整個游戲便可開始運行了。
職業(yè)技術(shù)教育是通過教學(xué)使學(xué)生具有扎實的理論知識和熟練的動手操作能力,為企業(yè)培養(yǎng)生產(chǎn)一線上的復(fù)合型技能人才。[4]針對于制造類應(yīng)用性、實踐性較強的PLC課程教學(xué),既以企業(yè)典型工作任務(wù)或者項目為載體,開展“教學(xué)做一體化”課堂教學(xué),讓課程理論與企業(yè)實踐達到無縫對接。同時,又利用現(xiàn)有基礎(chǔ)開發(fā)些益智類、趣味性強的小游戲或創(chuàng)客項目,調(diào)動學(xué)生積極性,培養(yǎng)學(xué)生的開發(fā)能力,達到以能力為本位,創(chuàng)客教育活動為載體,培養(yǎng)創(chuàng)新型機器人人才的目的,[5]整體提升工業(yè)機器人技術(shù)專業(yè)人才培養(yǎng)的質(zhì)量。