【正文】
{ //輸入更新 update_input()。 //邏輯堆棧復(fù)位 logic_reset()。 //用戶(hù)程序執(zhí)行 program_excute()。 //輸出更新 update_output()。}}進(jìn)行程序執(zhí)行program_excute()。 //輸出更新梯形圖的PLC指令解釋過(guò)程如下:(logic_main_主邏輯系統(tǒng)堆棧,loc_cout_邏輯計(jì)數(shù)堆棧)1176。堆棧清零,loc_cout、logic_g和logic_main清零,第一條指令為L(zhǎng)D,判斷前置邏輯(loc_cout)是否完成,若沒(méi)有完成,則將logic_main值壓棧,啟用新一行邏輯,給loc_cout置1,將母線(xiàn)邏輯和讀取位進(jìn)行邏輯“與”運(yùn)算,,并置logic_main狀態(tài)為1。2176。下一條指令,發(fā)現(xiàn)指令為OUT,如果logic_mian為ON(1/0來(lái)判斷),否則為OFF.3176。最后一條指令為END,程序掃描周期結(jié)束,將輸出映象區(qū)的ON/OFF狀態(tài)輸出,稱(chēng)為實(shí)際的輸出,然后開(kāi)始新一輪掃描周期?;具壿嬛噶罱忉尫椒ǖ膶?shí)現(xiàn)PLC指令解釋主要有指令分析程序和指令解釋子程序,指令分析子程序通過(guò)對(duì)指令的中間代碼進(jìn)行分析,當(dāng)分析到某種指令的指令代碼時(shí),解釋程序跳轉(zhuǎn)到對(duì)應(yīng)的解釋子程序。解釋子程序得到指令的操作數(shù)并計(jì)算操作數(shù)對(duì)應(yīng)元件在系統(tǒng)中的存儲(chǔ)地址,完成規(guī)定的指令功能后再分析下一條PLC指令,如此周而復(fù)始。4176。AND指令發(fā)現(xiàn)指令為AND,將logic_mian堆棧里的值和exe_read_bit()進(jìn)行邏輯與運(yùn)算,邏輯運(yùn)算結(jié)果保存在logic_main中,并置logic_main為1。5176。OR指令發(fā)現(xiàn)指令為OR,將logic_mian堆棧里的值和exe_read_bit()進(jìn)行邏輯或運(yùn)算,邏輯運(yùn)算結(jié)果保存在logic_main中,并置logic_main為1。任務(wù)堆棧:任務(wù)堆棧是任務(wù)的重要的組成部分。所謂堆棧,就是在存儲(chǔ)器中按數(shù)據(jù)“先進(jìn)后出(LIFO)”的原則組織的連續(xù)存儲(chǔ)空間。為了滿(mǎn)足任務(wù)切換和響應(yīng)中斷時(shí)保存CPU寄存器中的內(nèi)容及任務(wù)調(diào)用其他函數(shù)時(shí)的需要,每個(gè)任務(wù)都應(yīng)該配有自己的堆棧。所有系統(tǒng)任務(wù)的任務(wù)控制塊中都含有一個(gè)指向該任務(wù)堆棧的指針。在PLC梯形圖中,位元件即繼電器對(duì)應(yīng)的物理實(shí)體是存儲(chǔ)單元中的某一位,稱(chēng)為位功能存儲(chǔ)器。如果該位為1則表示對(duì)應(yīng)的繼電器線(xiàn)圈通電,其常開(kāi)觸點(diǎn)閉合,常閉觸點(diǎn)斷開(kāi)。反之,如果該位為0,則表示對(duì)應(yīng)的繼電器線(xiàn)圈失電,將常開(kāi)觸點(diǎn)斷開(kāi),常閉觸點(diǎn)閉合。在解釋梯形圖指令時(shí),CPU掃描用戶(hù)程序的中間代碼將各個(gè)元件的狀態(tài)進(jìn)行邏輯與、或、非等運(yùn)算,運(yùn)算結(jié)果ON或者OFF保存在元件對(duì)應(yīng)的存儲(chǔ)單元中。如果必須指出一個(gè)位元件所占用的存儲(chǔ)單元,在FX2N系列PLC中,元件分為位元件和字元件,字元件用于數(shù)據(jù)的處理,在系統(tǒng)中占用兩個(gè)字節(jié)的存儲(chǔ)單元。模擬繼電器的功能的位元件,可以分為以下幾類(lèi):?jiǎn)尉€(xiàn)圈,單觸點(diǎn)和當(dāng)前值得位元件,如果是定時(shí)器和計(jì)數(shù)器。定時(shí)器在線(xiàn)圈通電后延遲一定的時(shí)間將觸點(diǎn)閉合,因此定時(shí)器線(xiàn)圈和觸點(diǎn)不能共用一個(gè)位存儲(chǔ)單元。每一個(gè)定時(shí)器必須占用兩個(gè)位和兩個(gè)字節(jié)的存儲(chǔ)單元來(lái)分別存放線(xiàn)圈、觸點(diǎn)的狀態(tài)和定時(shí)器當(dāng)前值。計(jì)數(shù)器使用兩個(gè)位存儲(chǔ)單元保存線(xiàn)圈當(dāng)前狀態(tài)和上一個(gè)掃描周期的狀態(tài)。計(jì)數(shù)器當(dāng)前值需要有兩個(gè)字節(jié)保存。所以每一個(gè)計(jì)數(shù)器也占用兩個(gè)位和兩個(gè)字節(jié)的存儲(chǔ)單元。基本邏輯指令解釋方法的實(shí)現(xiàn)PLC梯形圖在上位機(jī)編程軟件編制并轉(zhuǎn)換為指令中間代碼后,通過(guò)串口UART下載到本系統(tǒng)的指令存儲(chǔ)區(qū),指令中間代碼的存放次序和梯形圖指令的順序保持一致。PLC指令解釋主要有指令分析程序和指令解釋子程序,指令分析子程序?qū)χ噶畹闹虚g代碼進(jìn)行分析,當(dāng)分析到某種指令的指令代碼時(shí),解釋程序跳轉(zhuǎn)到對(duì)應(yīng)的解釋子程序。解釋子程序得到指令的操作數(shù)并計(jì)算操作數(shù)對(duì)應(yīng)元件在系統(tǒng)中的存儲(chǔ)地址,完成規(guī)定的指令功能后再分析下一條PLC指令,如此周而復(fù)始。,以及LCD顯示與按鍵程序的編寫(xiě)1176。、在STM32單片機(jī)中移植了μC/OSII操作系統(tǒng)。本控制器的軟件部分是基于uC/OSII實(shí)時(shí)操作系統(tǒng)內(nèi)核編寫(xiě)的。常規(guī)的編程方法程序是順序執(zhí)行的方式,而采用了實(shí)時(shí)操作系統(tǒng),程序是按任務(wù)進(jìn)行劃分的,編程人員可以根據(jù)任務(wù)重要性的不同,進(jìn)行優(yōu)先級(jí)高低的劃分,提高了應(yīng)用軟件的實(shí)時(shí)性。而采用了嵌入式操作系統(tǒng),更加利于程序模塊化的編寫(xiě)、移植等等。uC/OSII 是專(zhuān)門(mén)為計(jì)算機(jī)的嵌入式應(yīng)用設(shè)計(jì)的, 絕大部分代碼是用C語(yǔ)言編寫(xiě)的。CPU 硬件相關(guān)部分是用匯編語(yǔ)言編寫(xiě)的、總量約200行的匯編語(yǔ)言部分被壓縮到最低限度,為的是便于移植到任何一種其它的CPU 上。用戶(hù)只要有標(biāo)準(zhǔn)的ANSI 的C交叉編譯器,有匯編器、連接器等軟件工具,就可以將uC/OSII嵌人到開(kāi)發(fā)的產(chǎn)品中。uC/OSII 具有執(zhí)行效率高、占用空間小、實(shí)時(shí)性能優(yōu)良和可擴(kuò)展性強(qiáng)等特點(diǎn), 最小內(nèi)核可編譯至 2KB 。uC/OSII 已經(jīng)移植到了幾乎所有知名的CPU 上。嚴(yán)格地說(shuō)uC/OSII只是一個(gè)實(shí)時(shí)操作系統(tǒng)內(nèi)核,它僅僅包含了任務(wù)調(diào)度,任務(wù)管理,時(shí)間管理,內(nèi)存管理和任務(wù)間的通信和同步等基本功能。沒(méi)有提供輸入輸出管理,文件系統(tǒng),網(wǎng)絡(luò)等額外的服務(wù)。但由于uC/OSII良好的可擴(kuò)展性和源碼開(kāi)放,這些非必須的功能完全可以由用戶(hù)自己根據(jù)需要分別實(shí)現(xiàn)。 μC/ OS Ⅱ是一個(gè)完整的、可移植、固化、裁減的占先式實(shí)時(shí)多任務(wù)內(nèi)核。μC/ OS Ⅱ包括任務(wù)調(diào)度、時(shí)間管理、內(nèi)存管理、資源管理(信號(hào)量、郵箱、消息隊(duì)列) 四大部分,沒(méi)有文件系統(tǒng)、網(wǎng)絡(luò)接口、輸入輸出界面。他的移植只與4 個(gè)文件相關(guān):匯編文件(OS CPU A. ASM) 、處理器相關(guān)C 文件(OS CPU. H ,OS CPU C. C) 和配置文件(OSCFG. H)。有64 個(gè)優(yōu)先級(jí),系統(tǒng)占用8 個(gè),用戶(hù)可創(chuàng)建56 個(gè)任務(wù),不支持時(shí)間片輪轉(zhuǎn)。他的基本思路就是“近似地每時(shí)每刻總是讓優(yōu)先級(jí)最高的就緒任務(wù)處于運(yùn)行狀態(tài)”。任務(wù)的切換是通過(guò)模擬一次中斷實(shí)現(xiàn)的。μC/ OS Ⅱ的工作的核心原理是近似地讓最高優(yōu)先級(jí)的就緒任務(wù)處于運(yùn)行狀態(tài)。所謂移植,就是使一個(gè)實(shí)時(shí)內(nèi)核能在其他微處理器上運(yùn)行,為了方便移植,大部分μC/ OS Ⅱ的代碼是用C 語(yǔ)言編寫(xiě)的。由于μC/ OS Ⅱ在設(shè)計(jì)之初就已經(jīng)充分考慮了可移植性,所以μC/ OS Ⅱ的移植相對(duì)來(lái)說(shuō)比較