跟著我一起來學(xué)習(xí)s7-200
【跟著我一起來學(xué)習(xí)s7-200】01如何學(xué)習(xí)
首先得明確自己想要學(xué)什么品牌的PLC,三菱的,西門子的,還是歐姆龍的,下面我就假如選擇了西門子這個品牌為例,再具體明確到學(xué)習(xí)s7-200,s7-300,還是s7-1200等PLC,再假如我選擇的是西門子s7-200的PLC,明確了方向之后就是對一些基礎(chǔ)知識的掌握。
所說的基礎(chǔ)就是了解s7-200PLC的型號及其區(qū)別,系統(tǒng)構(gòu)成,CPU的硬件結(jié)構(gòu),而且對其擴展模塊也應(yīng)先有個了解,還有CPU的參數(shù)和模塊的參數(shù)也是應(yīng)該了解的。再到對s7-200系統(tǒng)的選型,以及系統(tǒng)與模塊的安裝接線,包括數(shù)字量、模擬量的接線等。
等到對這些基礎(chǔ)有了一定的了解之后,就是對軟件的操作和使用的學(xué)習(xí)了,對于STEP 7 Micro/WIN 這個軟件,首先也要熟悉軟件界面,常用工具圖標(biāo),常用菜單工具,還要熟悉符號表、狀態(tài)表、數(shù)據(jù)塊、系統(tǒng)塊的使用,還有對電腦編程接口的設(shè)置以及通訊,程序上傳下載的常用操作。
除以上列舉之外,還需要知道PLC的工作過程以及程序的結(jié)構(gòu),掌握數(shù)制的轉(zhuǎn)換。在這之后就到掌握存儲器以及尋址這方面的知識了,這部分的內(nèi)容很重要,因為之后的應(yīng)用基本指令等進行編程時就要經(jīng)常用到這些內(nèi)容。當(dāng)你掌握了存儲器和尋址,那么就可以開始學(xué)習(xí)一下基本指令了,常用的位邏輯指令、傳送指令、定時器、計數(shù)器、比較指令、整數(shù)計算、移位/循環(huán)指令等都是需要掌握一下的。對這些基本指令需要平常多練習(xí),并且能夠熟練地運用,這才是真的掌握了。
這就是前面所說的基礎(chǔ)知識,只有掌握了這些基礎(chǔ)之后,你才能更好的學(xué)習(xí)之后的模擬量處理PID、通訊、高速脈沖輸出、配方等。
學(xué)習(xí)都是循序漸進,一步一步學(xué)習(xí)的,所以,莫浮躁。
在接下來的日子里,就從基礎(chǔ)到應(yīng)用循序漸進地為大家講一下s7-200的學(xué)習(xí)吧。想要學(xué)習(xí)s7-200的朋友,可以跟著我一起來學(xué)習(xí)。
【跟著我一起來學(xué)習(xí)s7-200】02 CPU參數(shù)與結(jié)構(gòu)
我們要知道,西門子S7-200 系列PLC是一款小型PLC,它主要有CPU221,CPU222,CPU224,CPU224XP,CPU226等幾種型號。而對于每個型號,又有分直流和交流這兩種電源供電的CPU類型。也就是說有分“DC/DC/DC”和“AC/DC/DELAY”兩種。“DC/DC/DC”表示的是CPU是直流24V供電/數(shù)字量輸入是直流24V/數(shù)字量輸出是晶體管直流24V類型的;“AC/DC/DELAY”表示的是CPU是交流220V供電/數(shù)字量輸入是是直流24V/數(shù)字量輸出是繼電器類型的。這都是首先要知道的東西。
對不同型號的CPU有不同的規(guī)格參數(shù),這個參數(shù)我們也是需要了解學(xué)習(xí)的。
要知道不同型號其本機I/O的數(shù)量,包括數(shù)字量和模擬量的;要知道不同型號其程序存儲區(qū)和數(shù)據(jù)存儲區(qū)的參數(shù)要求;還要注意各型號CPU對擴展模塊數(shù)量的要求,像CPU221是不能擴展模塊的,CPU222只能擴展2個模塊,而CPU224/CPU224XP/CPU226則最多可以擴展7個模塊。
然后是對CPU結(jié)構(gòu)的了解,s7-200系列 PLC它是將CPU、I/O點、存儲區(qū)和集成電源集成在一個機殼內(nèi)的,其構(gòu)造和外形就是下圖所看到的樣子。
我們可以看到CPU包括了RS485通訊口、可選卡插槽、CPU狀態(tài)LED燈、數(shù)字量輸入輸出端子、I/O點狀態(tài)LED燈、CPU電源端子、24VDC傳感器輸出端子、撥碼開關(guān)、電位計和擴展模塊接口等,如果是CPU224XP的話,還會有模擬量輸入輸出端子。對CPU結(jié)構(gòu),我們不僅要知道構(gòu)造的名稱和位置,還要了解各部分的功能。像知道通訊口的功能就是用來通訊,擴展模塊接口就是用于連接下一個擴展模塊,撥碼開關(guān)就是用來切換運行或停止?fàn)顟B(tài)等等。
【跟著我一起來學(xué)習(xí)s7-200】03擴展模塊
在學(xué)習(xí)到s7-200 PLC 的CPU結(jié)構(gòu)的時候知道了CPU是有擴展模塊接口的,這就提供了擴展模塊的功能,而且擴展模塊也是非常方便的,只要把擴展模塊的接頭接到前一個模塊的接口就可以了。
S7-200的擴展模塊主要有以下幾類:數(shù)字量模塊、模擬量模塊、通訊模塊、運動控制模塊。數(shù)字量模塊又分為數(shù)字量輸入模塊EM221,數(shù)字量輸出模塊EM222和數(shù)字量輸入輸出模塊EM223;模擬量模塊有模擬量輸入模塊EM231(包含了熱電阻模塊和熱電偶模塊),模擬量輸出模塊EM232和模擬量輸入輸出模塊EM235;通訊模塊有PROFIBUS從站模塊EM277,MODEM模塊EM241,工業(yè)以太網(wǎng)模塊CP243-1和AS-i主站模塊CP243-2;還有運動控制模塊EM253等。
看到這么多模塊,可能會覺得有點害怕,好像很多東西不懂要學(xué)習(xí)的,但是剛開始就對這些模塊先有個大概的了解,剛學(xué)習(xí)基礎(chǔ)的時候用到這些的地方會比較少,等到之后學(xué)到有一定基礎(chǔ)了,學(xué)到通訊、模擬量和運動控制等的時候再來詳細學(xué)習(xí)這些擴展模塊的內(nèi)容。
除此之外,在學(xué)習(xí)s7-200 PLC 的CPU結(jié)構(gòu)的時候也知道CPU是有一個擴展卡插槽的,這個擴展卡插槽跟前面的擴展模塊接口又有什么區(qū)別呢?擴展模塊還提供有存儲卡模塊、電池卡模塊、時鐘電池卡模塊,那么這個擴展卡插槽就可以根據(jù)自身要求選擇插入這幾個模塊。
而對于CPU的RS485串行通信接口,這個接口是PLC實現(xiàn)人機對話的通道,可以實現(xiàn)CPU與上位計算機的連接,實現(xiàn)PLC與PLC、
變頻器等外部設(shè)備的連接。而S7-200常用的編程設(shè)備是RS232/PPI電纜或者USB/PPI電纜,不過更通用的是USB/PPI電纜,因為基本所有電腦都配有了USB接口,要用RS232/PPI電纜的話,只能在電腦具備有RS232串口才能夠使用,這也是需要注意的。
【跟著我一起來學(xué)習(xí)s7-200】04通訊與網(wǎng)絡(luò)
在對s7-200 PLC的型號,系統(tǒng)構(gòu)成,CPU的硬件結(jié)構(gòu),擴展模塊有了一定的了解之后,然后是到s7-200的通訊與網(wǎng)絡(luò)部分。S7-200支持PPI,自由口,AS-i,Profibus,MPI,以太網(wǎng)等協(xié)議。
在s7-200系統(tǒng)中,PPI,MPI,Profibus-DP協(xié)議都可以在RS-485網(wǎng)絡(luò)上通信,RS-485是s7-200最常用的通信基礎(chǔ),這些是我們需要了解與學(xué)習(xí)的。還有,對各種協(xié)議的主要特點以及主要應(yīng)用在什么地方等等也是要知道的,關(guān)于這部分的具體介紹,梁老師的《s7-200從入門到精通》的第4課時到第7課時有較為詳細的介紹,下面就大概強調(diào)一下一些總結(jié)性的東西吧。
在應(yīng)用方面,多個s7-200 PLC通訊選用PPI,也可以用自由口通訊(但不推薦),也可選用以太網(wǎng)(但需要選用CP243-1模塊);s7-200要與第三方設(shè)備通訊,要使用自由口;s7-200與s7-300/400通訊,對于簡單的數(shù)據(jù)量不大的情況,可以選MPI網(wǎng)絡(luò),對于要求高數(shù)據(jù)量大的情況,選Profibus網(wǎng)絡(luò),也可以選以太網(wǎng);s7-200與
觸摸屏通訊,一般用MPI或PPI網(wǎng)絡(luò)。
關(guān)于這部分的內(nèi)容,在對基礎(chǔ)的學(xué)習(xí)時對這些先有個了解也就差不多了,等到時學(xué)到做通訊應(yīng)用的時候再來詳細地學(xué)習(xí)。
然后就到s7-200 CPU及模塊參數(shù)的學(xué)習(xí),這些參數(shù)對于我們選型的時候是很重要的。在前面也有發(fā)過CPU參數(shù)圖,除了前面說到的,還有一個要注意的是CPU的供電能力。各型號CPU的供電能力不一樣,CPU每擴展一個模塊,擴展模塊就要消耗一些CPU的供電,所以要注意擴展模塊的時候不能超過CPU的供電能力。另外,CPU的電源有兩種,一種是5VDC,另一種是24VDC,我們在計算時主要考慮CPU的5VDC電流供應(yīng)能力就可以了。至于CPU和各個模塊的詳細參數(shù)可以參看一下手冊。
那么,關(guān)于通訊與網(wǎng)絡(luò),CPU及模塊參數(shù)主要就是這些了。
【跟著我一起來學(xué)習(xí)s7-200】05系統(tǒng)選型
S7-200系統(tǒng)對于PLC的選型也是很重要的,我們在選型的時候,一般需要考慮幾個因素,一個是控制系統(tǒng)的I/O數(shù)量和類型,還有通訊、環(huán)境、功能等要求,還有系統(tǒng)的復(fù)雜程度也是需要考慮的。CPU所能帶的I/O數(shù)量是由CPU的輸入輸出過程映像區(qū)大小、集成I/O數(shù)量、CPU能帶的擴展模塊數(shù)量、5VDC電源帶載能力以及CPU所帶智能模塊對I/O地址的占用這幾個因素所決定的。另外對于I/O點的類型,根據(jù)其不同類型也有其注意事項,對環(huán)境、功能要求等也有些需要注意的地方,具體的注意事項可以參看梁老師的《s7-200從入門到精通》的第11、12課時的內(nèi)容,里面有詳細的講解到,我在這里就不贅述了。
在課程視頻里,梁老師還有舉一個選型的例子,例子是這樣子的,一個系統(tǒng)需要三臺PLC控制。每臺36DI(24VDC),25DO(晶體管),8AI(4-20mA電流),2AO(4-20mA電流),控制3個伺服電機(100KHz),連接2臺RS485接口的儀表,連接一臺觸摸屏。三臺PLC之間需交換數(shù)據(jù)(距離20米)。具體選型如何考慮,應(yīng)該怎么樣去選,梁老師都有給出一個較為詳細的方法,有空的話可以去看一下這個例子,這樣你會對選型有一個更加明確的理解。
【跟著我一起來學(xué)習(xí)s7-200】06硬件接線
正確的安裝接線,對系統(tǒng)正常工作是至關(guān)重要的,這也是我們務(wù)必要掌握的東西。
那么就先看一下一些總結(jié)性的東西,首先CPU是分有DC/DC/DC型和AC/DC/繼電器型的,DC/DC/DC型的CPU接24V直流電源,AC/DC/繼電器型的CPU接交流電源。再說下來,還有數(shù)字量信號的接線、模擬量信號的接線。
對于數(shù)字量信號的接線,又有分?jǐn)?shù)字量輸入的接線和數(shù)字量輸出的接線。數(shù)字量輸入的接線既有直流輸入接法,也有交流輸入接法。而對于直流數(shù)字量輸入,既可以是源型接法,也可以是漏型接法。在這里我們需要注意的是西門子源型漏型的說法跟日系PLC是相反的,這個不能搞混了。對于數(shù)字量輸出分有晶體管輸出、繼電器輸出和可控硅輸出,不過可控硅輸出的用的比較少,主要知道晶體管輸出和繼電器輸出的就可以了。繼電器輸出的可以接成直流或交流,而晶體管輸出的接成源型,這是我們需要注意的。
對于模擬量信號的接線,在這里就說一下CPU224XP的模擬量信號接線,因為CPU224XP它是集成了2路模擬量輸入和1路模擬量輸出的,需要注意其中模擬量輸入只支持電壓信號,模擬量輸出可支持電壓或電流。另外,模擬量輸入接線還需要注意各種線制的不同接法。
以上幾部分的接線方法是首先需要掌握的,除此之外,還有對熱電阻模塊、熱電偶模塊的接線和網(wǎng)絡(luò)接線等,至于這部分的內(nèi)容在這里就不強調(diào)了,在梁老師的《s7-200從入門到精通》的第13、14、15課時《安裝接線規(guī)范》有詳細講解。
下面就附上重點要掌握的接線圖。
下面也具體解釋一下前面說的源型輸入,漏型輸入,源型輸出,漏型輸出等。所說的源型輸入接法,即是電流從PLC公共端流入,從輸入端流出,即PLC公共端接外接DC電源的正極,是共陽極電路。所說的漏型輸入接法,即是電流從PLC的輸入端流進,從公共端流出,即公共端外接電源的負極,是共陰極電路。PLC的輸出,分為源型輸出和漏型輸出,如果是源型輸出,輸出部分的L+端要接電源正極;如果是漏型輸出,輸出部分的COM端要接電源負極。有一個我們需要注意的是,在s7-200 中除了CPU224XPSI是漏型輸出的,其他都是源型輸出的。
【跟著我一起來學(xué)習(xí)s7-200】07熟悉軟件
在這之前我們已經(jīng)學(xué)習(xí)了s7-200的型號,系統(tǒng)構(gòu)成,CPU的硬件結(jié)構(gòu),擴展模塊,通訊與網(wǎng)絡(luò),CPU及模塊參數(shù),系統(tǒng)選型以及安裝接線等基礎(chǔ)性東西了。在這之后就是對STEP 7 Micro/WIN 這個軟件的操作和使用的學(xué)習(xí)了。在最前面的時候有說到對于這個軟件,我們要熟悉軟件界面,常用工具圖標(biāo),常用菜單工具,還要熟悉符號表、狀態(tài)表、數(shù)據(jù)塊、系統(tǒng)塊的使用,還有對電腦編程接口的設(shè)置以及通訊,程序上傳下載的常用操作等。
對于STEP 7 Micro/WIN,剛安裝好時默認是英文界面的,有很多學(xué)員會問應(yīng)該怎么改成中文界面。其實修改方法很簡單,選擇菜單欄的“Tools – Options – General – Chinese”,再點擊確定就可以了。如下圖所示。
下面就先熟悉一下軟件的界面以及常用工具圖標(biāo)吧。下圖就是軟件的界面,包括有菜單與工具欄、查看工具欄、指令列表、程序編輯區(qū)、程序接口區(qū)和信息窗口。
然后再看一下菜單與工具欄,以下是一些常用的工具圖標(biāo),這是我們剛接觸軟件時需要認識一下的。
下面也按順序說明一下圖標(biāo)的功能。
第一個圖依次是編譯,全部編譯,上傳,下載。編譯就是檢查程序的錯誤,而全部編譯是檢查程序塊數(shù)據(jù)塊和系統(tǒng)塊的錯誤,這幾個圖標(biāo)在程序的上傳下載時需要用到。
第二個圖依次是運行,停止,程序狀態(tài)監(jiān)控,暫停程序狀態(tài)監(jiān)控,狀態(tài)表監(jiān)控,趨勢圖,暫停趨勢圖,單次讀取,全部寫入,強制,取消強制,取消全部強制,讀取全部強制。這些圖標(biāo)在我們監(jiān)控程序的時候會用到。
第三個圖依次是插入網(wǎng)絡(luò),刪除網(wǎng)絡(luò),切換POU注釋,切換網(wǎng)絡(luò)注釋,切換符號信息表,切換書簽,下一個書簽,上一個書簽,清除全部書簽。而這些圖標(biāo)是為了我們可以更方便地查看程序更好地進行調(diào)試,有時也不一定非要用到。
第四個圖依次是向下連線,向上連線,向左連線,向右連線,觸點,線圈,指令盒。這些圖標(biāo)是我們在編寫程序的時間經(jīng)常要用到的,當(dāng)然你也可以用快捷鍵,觸點的快捷鍵是F4,線圈的快捷鍵是F6,指令盒的快捷鍵是F9,連線的快捷鍵是Ctrl+鍵盤的上下左右鍵。
這就是對軟件界面和一些常用工具圖標(biāo)的認識,比較簡單,學(xué)習(xí)起來這應(yīng)該不是什么難事吧。
【跟著我一起來學(xué)習(xí)s7-200】08常用菜單工具
在菜單的“文件-設(shè)置密碼”,這里可以為項目文件設(shè)置密碼。
在菜單的“查看-屬性-保護”,這里可以用密碼保護POU。
除此之外,在系統(tǒng)塊的“密碼”也可以設(shè)置權(quán)限。到這里就一共有三處可以設(shè)密了。對這個可以了解一下。
在菜單的“文件-導(dǎo)入/導(dǎo)出”,這里主要是用于仿真。比如可以導(dǎo)出程序塊,保存為awl文件,再將此awl文件用于仿真軟件上。雖然西門子官方?jīng)]有提供仿真軟件,但是還是有流傳一些仿真軟件的。對于現(xiàn)階段手上沒有設(shè)備又想要學(xué)習(xí)一下的朋友可以找到我發(fā)的帖子《
西門子s7-200仿真軟件下載》和《
強大的s7-200模擬器(支持通信/模擬量)》進行下載使用。
在菜單的“文件-新建庫/添加/刪除庫”,如其名稱所言,可以新建庫,添加或刪除庫。對于庫的操作,就留在后面再來學(xué)習(xí)。
在菜單的“查看”可以看到有STL,梯形圖和FBD,在這里可以進行編程語言的切換。比如在使用s7-200仿真軟件的時候,仿真軟件可能要求要切換到STL,再粘貼到仿真軟件里面,這就需要進行編程語言的切換了。
另外,在菜單的“查看”中有符號尋址和符號信息表。符號尋址選中與否可以用來切換是符號尋址還是絕對地址尋址,選中了的話,在程序每個地址旁邊會出現(xiàn)其符號名。選中了符號信息表的話,在程序下方會出現(xiàn)符號信息表。
在菜單的“PLC-信息”中,我們可以從中獲得PLC版本信息、掃描周期。出錯信息、模塊信息等。不過必須注意的是只有在電腦跟PLC通訊成功之后才能打開PLC信息的。
在菜單的“PLC-實時時鐘”,可以為帶實時時鐘的CPU設(shè)置時間等信息,可以讀取PC或者是讀取PLC。
另外,在菜單的“PLC-比較”中,可以將項目與PLC進行比較,比較的結(jié)果會提示出來,比較一致的會出現(xiàn)已通過,比較不一致的會出現(xiàn)紅色字符提示信息。
以上就是一些可能會要用到的菜單工具,是我們需要學(xué)習(xí)一下的。
【跟著我一起來學(xué)習(xí)s7-200】09查看工具欄的使用
前面我們已經(jīng)熟悉了STEP 7 Micro/WIN 這個軟件的軟件界面,常用工具圖標(biāo),常用菜單工具,然后就是學(xué)習(xí)查看工具欄里面的程序塊、符號表、狀態(tài)表、數(shù)據(jù)塊、系統(tǒng)塊、交叉引用、通信和設(shè)置PG/PC接口的使用,以及程序上傳下載的常用操作等了。
首先是程序塊。選擇程序塊后會出現(xiàn)程序編輯區(qū),在這里默認是有一個主程序,一個子程序和一個中斷程序的。在程序編輯區(qū)點擊右鍵-插入,可以插入子程序或者中斷程序,當(dāng)然,對著指令列表的程序塊點擊右鍵-插入,同樣可以插入子程序或者中斷程序。
在程序編輯區(qū)的上方是程序接口區(qū),這里我們要知道主程序和中斷程序的變量類型只有臨時變量TEMP,它們只能定義臨時變量,而子程序的變量類型有四種,分別為輸入IN,輸出OUT,輸入輸出IN_OUT,臨時變量TEMP。
另外,在指令列表是有指令集的,編輯程序時可以從直接指令集里拖拽出來,當(dāng)然你也可以使用快捷鍵。
然后是符號表。在符號表里,我們可以為每個地址賦予一個符號名和注釋,這就可以為我們閱讀程序帶來很大的方便,所以也是需要了解的。在使用符號表的時候要注意一下命名規(guī)則,比如首字不能出現(xiàn)數(shù)字,不能出現(xiàn)特殊符號等,這些都是需要注意的。
還有是狀態(tài)表。通過狀態(tài)表,我們可以監(jiān)控或者修改CPU的變量。我們只需要在地址處輸入需要監(jiān)控的變量地址,另外,在格式欄中我們還可以選擇所監(jiān)控變量的格式,然后點擊工具欄的“狀態(tài)表監(jiān)控”,就可以獲得當(dāng)前值了。另外,點擊工具欄的“趨勢圖”,還可以看到變量的變化趨勢。
如果我們想要修改變量的值的話,可以在新值這欄輸入數(shù)值,然后點擊工具欄的“全部寫入”就可以修改數(shù)值了。還有一個需要注意的是,對于數(shù)字量輸入和模擬量輸入,要修改數(shù)值的話,是寫入不了的,這時候只能強制,點擊工具欄的“強制”就可以了,要取消強制的時候就點擊“取消強制”。
對于狀態(tài)表,我們在對程序進行監(jiān)控的時候是經(jīng)常會要用到的,這也是需要我們學(xué)習(xí)的東西。
還有是數(shù)據(jù)塊。在數(shù)據(jù)塊,我們常用來為變量定義初值。因為數(shù)據(jù)塊內(nèi)的數(shù)據(jù)下載到CPU中是存放在ROM存儲區(qū)的,掉電不會丟失。我們在定義初值的時候可以按Ctrl+Enter鍵換行,它會自動列出下一個變量地址。
【跟著我一起來學(xué)習(xí)s7-200】10程序上傳下載
我們的計算機要與PLC進行連接通訊,首先要做的是設(shè)置PG/PC接口。因為我們一般使用的都是PC/PPI編程電纜,所以在設(shè)置PG/PC接口時選擇“PC/PPI cable(PPI)”,然后點擊屬性。
然后在屬性的PPI中選擇傳輸率,一般是選9.6kbps就可以了,并在本地連接選擇連接到USB或COM。
置好PG/PC接口之后,點擊查看工具欄的通信,出現(xiàn)通信窗口。點擊“雙擊刷新”之后會自動尋找CPU,找到之后會出現(xiàn)CPU的信息,此時再點一下這個出現(xiàn)的CPU,在地址的遠程會自動跳到相應(yīng)的地址。假如沒有操作這步,而遠程地址又不是對應(yīng)的地址,是會出現(xiàn)通信不了的情況的。
通信成功之后,就可以進行程序的上傳下載操作了。以下載程序為例,當(dāng)程序編好之后,點擊編譯或全部編譯,再點擊下載就可以了。
剛才在下載程序之前,我們操作了一步“編譯”,當(dāng)編譯通過之后,我們就可以打開查看工具欄的交叉引用來查看某個地址在哪里,用的是什么指令等信息。除此之外,還能看到字節(jié)使用以及位使用情況。
【跟著我一起來學(xué)習(xí)s7-200】11系統(tǒng)塊的使用
在前幾天我們已經(jīng)學(xué)習(xí)了程序塊、符號表、狀態(tài)表、數(shù)據(jù)塊的使用,交叉引用、通信和設(shè)置PG/PC接口的使用,以及程序上傳下載的常用操作等了,還剩下系統(tǒng)塊的內(nèi)容沒有學(xué)習(xí),那么今天就來學(xué)習(xí)一下系統(tǒng)塊吧。
打開查看工具欄的系統(tǒng)塊,我們可以看到有通信端口、斷電數(shù)據(jù)保持、密碼、輸出表、輸入濾波器、脈沖捕捉位、背景時間、EM配置、LED配置、增加存儲區(qū),我們看到LED配置、增加存儲區(qū)旁邊有個小叉叉,說明該CPU不支持這兩個功能,暫且可以不用理會它。這里我們需要注意的是在系統(tǒng)塊設(shè)置了參數(shù)之后,是需要把系統(tǒng)塊下載到CPU才會生效的。
在“通信端口”,我們可以對PLC地址以及波特率等進行設(shè)置,注意波特率要與通訊雙方設(shè)置成一致的。在這里對PLC地址端口等進行了設(shè)置之后,下載系統(tǒng)塊到CPU。
此時再打開通信,如果遠程地址沒有更改的話,再點擊確認進行通信連接是連接不上的。這樣只有點擊刷新重新搜索,搜索到之后再點擊一下CPU信息,此時遠程地址會自動改成設(shè)置好的地址。
在“斷電數(shù)據(jù)保持”中,我們可以自己去定義斷電數(shù)據(jù)保持的存儲區(qū)范圍,這里我們要注意的是在s7-200中,MB0-MB13默認是斷電不保持的,如果將其設(shè)為斷電保持的,那么斷電后會自動被保存在ROM存儲區(qū)中。
在“密碼”中,我們可以設(shè)密。CPU一共有四級密碼,每級密碼的權(quán)限不用相同,我們要注意慎用第4級禁止上載密碼,因為設(shè)置了該級密碼即使有正確的密碼也不能上載程序。這樣的話就只能點擊“PLC-清除”來恢復(fù)到默認設(shè)置了。
在“輸出表”中,在這里可以設(shè)置CPU從運行切換到停止?fàn)顟B(tài)時數(shù)字量輸出和模擬量輸出的結(jié)果。如果將“將輸出凍結(jié)在最后的狀態(tài)”處打鉤,下面將會變成灰色的。
在“輸入濾波”中,可以設(shè)置數(shù)字量和模擬量輸入濾波延時。有個要注意的是CPU224XP是集成了2路模擬量輸入的,因此不需要設(shè)置輸入濾波延時。
在“脈沖捕捉位”中,可以為CPU集成的數(shù)字量輸入使能脈沖捕捉功能。該功能在對于一些輸入信號持續(xù)時間很短的情況下會用到。
在“EM配置”中可以顯示項目中的智能模塊,我們可以在這里查看項目的智能模塊分配情況。
至于后面的背景時間、LED配置、增加存儲區(qū),一般來說也比較少會用到,所以只要知道一下就行了。關(guān)于STEP 7 Micro/WIN軟件的使用大概就是這些了,在這里只強調(diào)了一下重點并作了些補充,如果學(xué)習(xí)了還有不明白的地方,可以看一下梁老師的《s7-200從入門到精通》的第16到第20課時,里面有更為詳細的講解。
到現(xiàn)在為止,已經(jīng)學(xué)習(xí)了s7-200系統(tǒng)的基礎(chǔ)以及軟件的使用了,下一步就將是學(xué)習(xí)PLC工作原理、存儲器、尋址以及常用的基本指令了,你準(zhǔn)備好了嗎?
【跟著我一起來學(xué)習(xí)s7-200】12工作原理
在前面我們已經(jīng)學(xué)習(xí)了s7-200系統(tǒng)的基礎(chǔ)以及軟件的使用了,現(xiàn)在就是開始學(xué)習(xí)PLC工作原理、存儲器、尋址以及常用的基本指令等了。
首先我們得了解PLC的工作過程,CPU它的工作方式是循環(huán)掃描的,是周而復(fù)始地執(zhí)行一系列任務(wù)的。當(dāng)CPU處于RUN模式時,CPU將按順序執(zhí)行以下任務(wù):讀輸入,執(zhí)行邏輯控制程序,處理通信請求,執(zhí)行CPU自診斷,寫輸出。任務(wù)循環(huán)執(zhí)行一次則稱為一個掃描周期,下圖可以很直觀的看出CPU執(zhí)行任務(wù)過程。
我們要知道CPU的工作過程是分為五步的:首次掃描—開始循環(huán)監(jiān)視時間—更新輸入過程映像區(qū)—執(zhí)行用戶程序—更新輸出過程映像區(qū)。我們會注意到CPU到輸入輸出尋址時是不是直接訪問的,而是訪問包含了I/O過程映像的存儲區(qū)。
那么什么是過程映像區(qū),這個概念很重要,是我們需要了解的,還有在輸入采樣階段為什么要先輸入到輸入映像寄存器以及輸出刷新階段為什么要經(jīng)過元件映像寄存器,為什么要多一個這樣的環(huán)節(jié)呢,這也是我們需要了解的。關(guān)于這個過程映像區(qū)在梁老師的《s7-200從入門到精通》的第21課時有給出一個形象的解釋。
除了學(xué)習(xí)CPU的工作原理,我們還要知道CPU程序包括哪些,CPU程序是分為主程序,子程序和中斷程序的。我們要注意的是在一個程序中是有且只有一個主程序的,主程序可以調(diào)用子程序,而子程序的作用是什么呢?一個好的程序一般會將全部控制功能分為幾個子程序塊,這樣是為了清晰的組織所設(shè)計的項目。而所說的中斷程序,它與子程序的不同之處在于,中斷程序是不能由用戶調(diào)用的,只能由特定的事件觸發(fā)的。需要注意的是子程序可以嵌套調(diào)用,可以嵌套8層,而中斷程序只能調(diào)用一層子程序,也就是說它是不能嵌套調(diào)用子程序的,這點需要注意。
那么,這就是對PLC工作過程以及s7-200程序結(jié)構(gòu)的了解學(xué)習(xí)。
【跟著我一起來學(xué)習(xí)s7-200】13數(shù)據(jù)與數(shù)制
今天就是學(xué)習(xí)一下數(shù)據(jù)格式及要求和數(shù)制轉(zhuǎn)換,這部分也是我們編程的基礎(chǔ),是我們需要掌握的。
s7-200對數(shù)據(jù)的格式是有一定要求的,指令和數(shù)據(jù)之間的格式是只有一致才能正常工作的。那么什么是數(shù)據(jù)格式呢,數(shù)據(jù)格式就是指數(shù)據(jù)的長度和表示方式。
S7-200在尋址時,可以使用不同的數(shù)據(jù)長度。S7-200在存儲單元所存放的數(shù)據(jù)類型有布爾型、整數(shù)型、實數(shù)型和字符串型這四種,這是我們需要了解一下的。
對于整數(shù)又可以分為無符號整數(shù)和有符號整數(shù),那么對于一個有符號數(shù)來說,它的最高位是符號位來的,0代表是整數(shù),1代表是負數(shù)。下面就列出了幾種數(shù)據(jù)類型的取值范圍,大家可以看一下。
那么對于數(shù)制,二進制數(shù)據(jù)是用0和1兩個數(shù)碼來表示的數(shù),也就是一位二進制數(shù)是有0和1兩種不同的狀態(tài)的,所以我們是用一位二進制數(shù)來表示開關(guān)量的。而將二進制數(shù)從右往左每四位用一個十六進制來表示,即用4位二進制數(shù)來表示1位十六進制數(shù),這樣又引入了十六進制數(shù)。
對于二進制或十六進制,我們常用在邏輯運算里面,對于日常的計算常用的還是十進制。2#表示二進制,是逢二進一的,10#表示十進制,是逢十進一的,16#表示十六進制,是逢十六進一的。
對進制有了了解之后就是要對進制轉(zhuǎn)換要有一定的了解。比如二進制、十六進制數(shù)轉(zhuǎn)換成十進制數(shù)以及十進制數(shù)轉(zhuǎn)換成二進制、十六進制數(shù),還有二進制與十六進制的互換,都是我們要掌握的,掌握這部分的內(nèi)容將對以后編程時有很大的幫助,雖然說我們可以用電腦自帶的計算機進行轉(zhuǎn)換,但是掌握一下也是很有必要的。
二進制、十六進制數(shù)轉(zhuǎn)換成十進制數(shù),我們可以將二進制、十六進制的各位(從右往左第n位)乘以對應(yīng)的位權(quán)(
),并將結(jié)果累加求和,可得其大小。比如將2#11011轉(zhuǎn)成十進制數(shù),就是
十進制數(shù)轉(zhuǎn)換成二進制、十六進制數(shù),我們可以用除N取余,逆序排列的方法。比如10#8000轉(zhuǎn)換成十六進制,則
所以,10#8000=16#1F40。
而二進制與十六進制的互換,可以按一個口訣來轉(zhuǎn)換。2轉(zhuǎn)16:四位并一,按表查數(shù);16轉(zhuǎn)2:一位變四,按數(shù)查表。下面就給出二進制數(shù)和十六進制數(shù)的對應(yīng)表。
所以今天就學(xué)這么一個數(shù)據(jù)和數(shù)制的內(nèi)容,你有在學(xué)習(xí)嗎,你學(xué)習(xí)的怎樣了呢?
【跟著我一起來學(xué)習(xí)s7-200】14位邏輯指令
從最前面開始學(xué)習(xí)到現(xiàn)在已經(jīng)學(xué)習(xí)了s7-200的基礎(chǔ)知識,包括系統(tǒng)構(gòu)成、硬件結(jié)構(gòu)、硬件接線等,以及STEP 7 Micro/WIN軟件的使用,還有編程基礎(chǔ),包括工作原理、存儲器和尋址等?,F(xiàn)在開始就是學(xué)習(xí)一下s7-200 PLC的指令系統(tǒng)了。
在我們軟件的指令列表里面,可以看到有以下這些指令,這里就是所說的指令集。我們可以打開這些文件夾,找到需要用的指令,雙擊一下指令或者把指令拖拽到編程區(qū)就可以了。
我們首先學(xué)習(xí)的是位邏輯指令,我們可以看到在s7-200的位邏輯指令中有常開常閉指令、取反指令、跳變指令(也就是上升沿檢測和下降沿檢測)、輸出線圈指令、置位復(fù)位指令、置位優(yōu)先指令SR,和復(fù)位優(yōu)先指令RS,還有立即指令。我們可以利用這些位邏輯指令編寫小程序,練習(xí)一下這樣來學(xué)習(xí)。那么我們完全可以利用這些位邏輯指令來編寫單按鈕啟停的程序。下面我們就利用這些位邏輯指令來進行編寫。
1、 利用基本邏輯指令
2、 采用置位、復(fù)位指令
3、 利用置位優(yōu)先指令
4、 利用復(fù)位優(yōu)先指令
我們平時可以多找一些小程序的例子,來自己編程看看。這類小程序包括像啟保停、正反轉(zhuǎn)控制、單按鈕控制、連鎖控制、互鎖控制、順序控制等等。我們的一個大項目的程序基本都是由這些小程序組成的,所以掌握這些基礎(chǔ)的位邏輯指令的應(yīng)用是非常重要的。那么我們最近就多多練習(xí)一下小程序編程吧。
【跟著我一起來學(xué)習(xí)s7-200】15程序案例
昨天學(xué)習(xí)了位邏輯控制指令,也有提到可以自己找一些小程序的例子,包括像啟保停、正反轉(zhuǎn)控制、單按鈕控制、連鎖控制、互鎖控制、順序控制等等這樣的例子來練習(xí)。那么你有練習(xí)嗎?不知道你掌握的如何呢?
今天的話就來練習(xí)一下難度相對大一點的程序案例,是這樣一個五站點呼叫小車的案例,控制要求如下,今天就學(xué)習(xí)一下案例應(yīng)該怎么來編程吧。
首先,我們分析一下控制要求,要求是當(dāng)一個站點按下按鈕后,小車會自動進行到呼叫點,也就是到呼叫點就會停止下來。那么其實這里的呼叫按鈕就相當(dāng)于我們啟保停的啟動按鈕,而行程開關(guān)就相當(dāng)于停止按鈕,那么在這里就可以做以下這樣五個啟保停程序。
等到處理完這個要求之后就是處理小車是左行還是右行的控制了。在這里假定小車是停在最右的1號行程開關(guān)的,那么按下1號呼叫按鈕是無效的,只能是按下2、3、4、5號呼叫按鈕,所以在左行的控制程序里面是沒有1號呼叫按鈕的。假如我們按下2號呼叫按鈕,小車會左行,而到了行程開關(guān)2又會停下來,然后再按下3號呼叫按鈕,小車還會左行,并到相應(yīng)的行程開關(guān)處停下來。如果再按下的是2號呼叫按鈕,此時小車的左行不再接通了,而會右行到行程開關(guān)2處。這就是程序是先在呼叫按鈕上串聯(lián)一個對應(yīng)的行程開關(guān),再并聯(lián)下一個呼叫按鈕并做對應(yīng)的停止行程開關(guān)的原因了。
再假定小車在最左的5號行程開關(guān)處,按下5號呼叫按鈕也是無效的,只能是按下1、2、3、4號呼叫按鈕。假如我們按下4號呼叫按鈕,小車會右行,而到了行程開關(guān)4又會停下來,然后再按下3號呼叫按鈕,小車還會右行,并到相應(yīng)的行程開關(guān)處停下來。如果再按下的是4號呼叫按鈕,此時小車的右行不再接通了,而會左行到行程開關(guān)4處。
這就是對控制要求的分析和程序的分析了。
程序如下:
所以,我們進行編程之前首先要做的是對控制要求進行分析,分析之后才能更好的編寫出程序出來。然后還有一個很重要的是啟保停電路,經(jīng)過這個例子也會知道啟保停電路是“萬能”的了吧?這些都是可以靈活運用的。
【跟著我一起來學(xué)習(xí)s7-200】16定時器指令
前兩天我們學(xué)習(xí)了位邏輯指令,并做了一下對位邏輯指令應(yīng)用的練習(xí),想必各位對位邏輯已經(jīng)有了一定的了解了吧。昨天也有強調(diào)要多多練習(xí)一下,大家不要忘記了喔。在回顧學(xué)過知識的同時,還是要繼續(xù)向前學(xué)習(xí)的。那么今天就學(xué)習(xí)一下s7-200的定時器指令的知識吧。
S7-200提供了256個定時器,定時器號為0-255,共有三種類型:接通延時定時器(TON)、有記憶接通延時定時器(TONR)和斷開延時定時器(TOF)。接通延時定時器(TON)用于單一間隔的定時,比如延時啟動或延時停機;有記憶接通延時定時器(TONR)則是用于累計多個時間間隔;斷開延時定時器(TOF)常用于故障事件后的時間延時。至于這幾個定時器具體是如何使用如何計時的,你可以在軟件里對著定時器指令按下F1快捷鍵查找?guī)椭@個幫助也是很有用的,我們也要學(xué)會查找?guī)椭?div style="height:15px;">

定時器對時間間隔計數(shù),這個時間間隔就叫做分辨率,有時也有稱它為時基。在我們的S7-200中,定時器有3種分辨率:1ms、10ms、100ms,定時器分類及特征如下圖。
我們會看到定時器指令上有定時器號、輸入使能、設(shè)定值、類型和分辨率,我們要知道的是定時器號和分辨率是搭配好了的,選擇了一個定時器號,分辨率會自動就是對應(yīng)的分辨率的。
我們的定時器的定時時間是有個計算公式的,實際的定時時間等于設(shè)定值乘以分辨率。舉個例子,假如我們使用是的TON的定時器T37,設(shè)定值是10,那么定時時間就是1000ms,也就是1s了。
定時器指令在程序編寫過程中是經(jīng)常要用到的指令,所以我們要掌握好它。因為實際運用中,其實還是接通延時會用的比較多,所以,下面我們便舉一下幾個接通延時定時器的例子,以便更好地掌握定時器的知識。
1、閃爍電路(方法1)
2、閃爍電路(方法2)
對閃爍電路的程序再拓展一下,可以運用比較指令的來實現(xiàn)閃爍電路,順便可以掌握一下比較指令的知識。
3、延時啟動、延時停機
到這里,那么你對定時器掌握了有多少呢?想必至少了解了定時器的一些基本內(nèi)容吧。
【跟著我一起來學(xué)習(xí)s7-200】17計數(shù)器指令
前面我們學(xué)習(xí)了定時器的使用,那么今天就學(xué)習(xí)一下計數(shù)器的使用,在我們編程過程中,定時器計數(shù)器指令是我們經(jīng)常會要用到的指令,這兩部分的內(nèi)容我們要比較熟練地掌握。只有對定時器計時器掌握的比較好了,我們才能夠更好地去進行編程。
我們都知道在繼電控制線路中,計數(shù)器是作為一種儀表在電路中使用的,其基本功能是對輸入開關(guān)信號進行計數(shù)。換種說法來說,計數(shù)器就是用來累計輸入脈沖的次數(shù)。
S7-200的計數(shù)器有三種類型:增計數(shù)器CTU、減計數(shù)器CTD、增/減計數(shù)器CTUD。我們從下面的指令可以看到計數(shù)器的操作主要有四個方面,一個是計數(shù)器的編號,一個是脈沖輸入CU/CD,一個是預(yù)設(shè)值PV,還有復(fù)位輸入R/LD。我們要注意的是LD是裝載復(fù)位輸入端,它是只用于減計數(shù)器的。還有一個注意點是,計數(shù)器的預(yù)設(shè)值的數(shù)據(jù)類型是INT整型的,范圍是-32768~32767。
另外,計數(shù)器有兩種尋址類型:字和位。字類型用來訪問計數(shù)器的當(dāng)前值,位類型用來表示計數(shù)器位的狀態(tài)。那么什么是計數(shù)器的當(dāng)前值,簡單的說它就是計數(shù)器當(dāng)前累計的脈沖個數(shù),而計數(shù)器狀態(tài)位就是說當(dāng)計數(shù)器的當(dāng)前值等于預(yù)設(shè)值PV時,這個位會被置為“1”。
以上是對計數(shù)器的一些概述,下面我們便舉一些應(yīng)用計數(shù)器的簡單例子,以便更好的掌握計數(shù)器的知識。
1、單按鈕控制電動機啟停
前面的學(xué)習(xí)中也有學(xué)到用位邏輯控制指令來編寫這個單按鈕控制啟停的程序,除了用位邏輯控制指令來實現(xiàn),我們也可以用計數(shù)器來實現(xiàn)這個控制要求。
2、定時器和計數(shù)器實現(xiàn)長時間延時
實現(xiàn)長時間延時,我們除了利用定時器接力的方法,我們還可以利用定時器和計數(shù)器結(jié)合的辦法來獲得同樣的控制結(jié)果。
3、24小時時鐘控制
我們利用特殊標(biāo)志位SM0.5以及三個計數(shù)器可以實現(xiàn)24小時時鐘的控制。
經(jīng)過這幾個小例子的練習(xí),你對計數(shù)器的知識了解 有多少了呢?平時的話也可以多找些小例子來多多練習(xí)一下,這樣可以掌握地更好喔,試試吧。
【跟著我一起來學(xué)習(xí)s7-200】18比較指令
昨天學(xué)習(xí)了計數(shù)器指令,那么今天就再繼續(xù)學(xué)習(xí)一下比較指令。在我們的應(yīng)用中,在用計數(shù)器的時候必不可少也會要用到比較指令的,所以我們學(xué)習(xí)了計數(shù)器指令之后緊接著就來學(xué)習(xí)比較指令。
比較指令主要用來比較兩個數(shù)值或字符串。我們的數(shù)值比較指令有:等于=、大于等于>=、小于等于<=、大于>、小于<和不等于<>這6種,而字符串比較指令只有=和<>這兩種,這是我們需要注意的。
我們可以看到指令格式是比較符號+數(shù)據(jù)類型的。我們的數(shù)據(jù)類型又有幾種,一種是字節(jié)比較B,一種是整數(shù)比較I,一種是雙字整數(shù)比較D,一種是實數(shù)比較R,還有是字符串比較S。以下是在我們編程軟件里面指令列表中列出的指令。
對于字節(jié)比較,它是兩個字節(jié)型無符號數(shù)的比較;整數(shù)比較是用來比較兩個有符號字的大小的,比較的兩個數(shù)我們可以填入變量,也可以填入常數(shù);雙字整數(shù)比較則用于比較兩個有符號雙字的大?。粚崝?shù)比較用來比較兩個實數(shù)的大小,它也是有符號的比較;而字符串比較則是比較兩個字符串的ASCII碼是否相等。
我們需要注意的是字節(jié)比較的范圍是0-255,而整數(shù)比較的范圍是-32768~32767,雙字比較的范圍是16#80000000~16#7FFFFFFF,注意在使用的時候數(shù)值不能超限,不然是會提示有錯誤的。除此之外,我們在使用字符串比較的時候,是只需要填入整個字符串的首地址就可以了,而不能填入整個字符串的。
下面就舉一些對這些比較指令的使用的例子,并也舉了些錯誤例子,可以對照著學(xué)習(xí)一下。
那么,今天就先學(xué)習(xí)這么多,明天的話就學(xué)習(xí)一下計數(shù)器指令和比較指令結(jié)合在一起的應(yīng)用吧。你有跟著我的進度來學(xué)習(xí)嗎?
【跟著我一起來學(xué)習(xí)s7-200】19計數(shù)器和比較指令應(yīng)用
前面學(xué)習(xí)了計數(shù)器指令也學(xué)習(xí)了比較指令,那么今天就練習(xí)一下運用計數(shù)器指令和比較指令的編程案例。那么為什么這個案例學(xué)習(xí)是在學(xué)習(xí)了比較指令之后再來進行呢?其實我們的應(yīng)用中,在用計數(shù)器的時候必不可少也會要用到比較指令的,所以會將計數(shù)器指令和比較指令拉到一起來學(xué)習(xí)。
下面我們便舉一些應(yīng)用計數(shù)器指令和比較指令的簡單例子,以便我們可以更好地掌握計數(shù)器指令和比較指令的知識。
1、 應(yīng)用增計數(shù)器CTU實現(xiàn)按3次按鈕燈亮,再按2次燈滅
以上要求也可以應(yīng)用減計數(shù)器CTD來實現(xiàn),其實增計數(shù)器、減計數(shù)器都是類似的,區(qū)別就是增計數(shù)器是CU使當(dāng)前值遞增,直至32767,減計數(shù)器是CU使當(dāng)前值遞減,直至0。不過有一點需要注意的是減計數(shù)器的裝載端LD為裝載預(yù)置值,它應(yīng)該是沿觸發(fā)的,不然的話會一直裝載。下面便用減計數(shù)器來實現(xiàn)。
2、 應(yīng)用增/減計數(shù)器實現(xiàn)庫存統(tǒng)計與庫存情況提示
增/減計數(shù)器常用于出庫入庫等需要增計數(shù)又需要減計數(shù)的應(yīng)用中,比如產(chǎn)品的入庫出庫,停車入庫出庫等等,所以掌握這部分的知識還是比較重要的。
除了這些例子,你也可以另外再找些例子來多多練習(xí)一下。
【跟著我一起來學(xué)習(xí)s7-200】20定時器、計數(shù)器和比較指令應(yīng)用
前面已經(jīng)學(xué)習(xí)了定時器、計數(shù)器和比較指令的內(nèi)容,并且也做了一些小程序的練習(xí),那么今天就再繼續(xù)鞏固一下,做一下這幾個指令的綜合應(yīng)用。要想熟練地掌握編程方法,必須得多練習(xí),從易到難,這樣一步一步練習(xí),相信不久編程技巧和方法就會有所提高的。
那么下面就拿一兩個例子來進行練習(xí)一下。
1、五盞燈順序點亮,每個燈亮2秒,按下啟動按鈕I0.0第一個燈亮1秒時第二個燈亮,在第二秒時第一個燈滅第三個燈亮,如此循環(huán)十次后停止。按下停止按鈕所有的燈都不亮。
除了這種編程方法,你還能想的出其他方法嗎?多思考一下,自己也來動手練練吧。
2、用一個開關(guān)控制一臺電動機,開關(guān)接通時電動機正轉(zhuǎn)4S、停止4S、反轉(zhuǎn)4S、停止4S,并周而復(fù)始。斷開開關(guān),電機停止。
當(dāng)然,也是可以用另外的方法,比如下面給出的應(yīng)用比較指令的方法。編程的時候能夠多想幾種方法來實現(xiàn)同種控制要求,這樣對自己的提高也是有所幫助的呢。
學(xué)到這里的話,主要就是自己多編程練習(xí)這樣來學(xué)習(xí),這樣才知道自己在哪有有不足的地方,哪里有不足就補哪里。所以,自己也要多找些例題來練習(xí)噢。
【跟著我一起來學(xué)習(xí)s7-200】21轉(zhuǎn)換指令
前面已經(jīng)學(xué)習(xí)了位邏輯指令、定時器指令、計數(shù)器指令和比較指令了,并且也做了一些這些指令的應(yīng)用的例子。那么今天就開始學(xué)習(xí)新的內(nèi)容,學(xué)習(xí)一下轉(zhuǎn)換指令。轉(zhuǎn)換指令主要是用于對數(shù)碼的格式轉(zhuǎn)換,在編程過程中有時也是會要進行轉(zhuǎn)換會用到的,所以,關(guān)于轉(zhuǎn)換指令的內(nèi)容我們也是要學(xué)習(xí)一下的。
轉(zhuǎn)換指令也包括有很多種,有字節(jié)、整數(shù)、雙整數(shù)和浮點數(shù)之間的轉(zhuǎn)換,BCD碼與整數(shù)之間的轉(zhuǎn)換,ASCII碼與十六進制數(shù)之間的轉(zhuǎn)換,整數(shù)、雙整數(shù)和浮點數(shù)與ASCII碼之間的轉(zhuǎn)換,整數(shù),雙整數(shù)和浮點數(shù)與字符串之間的轉(zhuǎn)換,除此之外,還有編碼譯碼和七段數(shù)字顯示譯碼等。以上這么多轉(zhuǎn)換指令,最常用的還是字節(jié)、整數(shù)、雙整數(shù)和浮點數(shù)之間的轉(zhuǎn)換,這是我們必須要掌握的東西。
下面,我們就先看一下字節(jié)、整數(shù)、雙整數(shù)和浮點數(shù)之間的轉(zhuǎn)換。對于轉(zhuǎn)換,我們可以看到下面的程序里面的中間運算結(jié)果是用LW0或LD2進行存儲的,所以,中間運算結(jié)果用局部存儲區(qū)的話,這樣就不會占用到數(shù)據(jù)存儲區(qū)的空間?;蛘呶覀円部梢杂美奂悠鰽C進行存儲中間運算結(jié)果。
對于浮點數(shù)轉(zhuǎn)換為雙整數(shù)的指令,也就是取整指令ROUND和TRUNC,我們要注意的是ROUND指令是將小數(shù)部分四舍五入的,而TRUNC指令是將小數(shù)部分舍棄的。
對于BCD碼與整數(shù)之間的轉(zhuǎn)換,這在我們后面要學(xué)的的時鐘讀寫指令應(yīng)用時會用到,這個也是需要掌握一下的。
而至于ASCII碼與十六進制之間的轉(zhuǎn)換,整數(shù)、雙整數(shù)和浮點數(shù)與ASCII碼之間的轉(zhuǎn)換,整數(shù),雙整數(shù)和浮點數(shù)與字符串之間的轉(zhuǎn)換和七段數(shù)字顯示譯碼的話相對來說用的少些,可以了解一下。
有一個要注意的是,我們在整數(shù)、雙整數(shù)和浮點數(shù)與ASCII碼之間的轉(zhuǎn)換指令里面會看到“FMT”,那么這個FMT它是指定小數(shù)點右側(cè)的轉(zhuǎn)換精確度的,以及是否將小數(shù)點表示為逗號或點號及輸出緩沖區(qū)的大小。ITA的輸出緩沖區(qū)是8個字節(jié)的,DTA是12個字節(jié),RTA則是由FMT定義的。同樣的,在整數(shù),雙整數(shù)和浮點數(shù)與字符串之間的轉(zhuǎn)換指令也有“FMT”,I_S的輸出字符串長度是8個字節(jié),DI_S是12個字節(jié),而R_S則是由FMT定義的。因為這幾個指令用的較少些,就不舉例子了。
而對于編碼譯碼DECO和ENCO指令,DECO指令是將輸入字節(jié)的低4位所表示的數(shù)值置輸出字中相應(yīng)的位為1,其余位都為0;ENCO指令是將輸入字最低有效位的位號寫入到輸出字節(jié)中的低4位中。
那么針對以上程序,假如我們在輸入字節(jié)VB0里面寫入一個16#7,那么執(zhí)行DECO指令后會使得輸出字VW2中的第7位置為1,則VW2為16#0010或者2#0000 0000 1000 0000。假如我們在輸入字VW4里面寫入2#0000 0001 0000 0000,也就是第8位為1,那么執(zhí)行ENCO指令后會使得輸出字節(jié)VB6中輸出的數(shù)值就是8。
那么今天主要就是學(xué)習(xí)了一下轉(zhuǎn)換指令的使用,這么多指令中我們就主要掌握一下字節(jié)、整數(shù)、雙整數(shù)和浮點數(shù)之間的轉(zhuǎn)換,BCD碼與整數(shù)之間的轉(zhuǎn)換以及編碼譯碼指令,至于其他的轉(zhuǎn)換指令則在需要用到的時候查找一下幫助也就可以了。
【跟著我一起來學(xué)習(xí)s7-200】22算術(shù)運算指令
算術(shù)運算指令,在我們編程應(yīng)用過程中算術(shù)運算指令也是會要用到的,我們也要掌握一下的。我們的算術(shù)運算指令又分為整數(shù)計算和浮點數(shù)計算,算術(shù)運算指令包括有加減乘除運算指令、遞增遞減指令、平方根指令、自然對數(shù)、自然指數(shù)指令和三角函數(shù)指令等。
對于加減乘除運算指令,ADD_I、SUB_I、MUL_I、DIV_I是整數(shù)與整數(shù)的運算,ADD_DI、SUB_DI、MUL_DI、DIV_DI是雙整數(shù)與雙整數(shù)的運算,ADD_R、SUB_R、MUL_R、DIV_R是實數(shù)與實數(shù)的運算,我們要注意的是使用指令的時候輸入輸出的數(shù)據(jù)類型要跟指令的數(shù)據(jù)類型一致,不然是會提示有誤的。
我們要注意的是對于乘除指令的話,還有MUL和DIV指令,那么這兩個指令是整數(shù)與雙整數(shù)的運算,也就是說將兩個16位的整數(shù)進行相乘或相除,是得出一個32位結(jié)果的,同時要注意進行除法運算時是將結(jié)果中16位的余數(shù)存在高16位,16位的商存在低16位的。舉個例子,假設(shè)VW8寫入1,VW10寫入2,指令執(zhí)行后進行相除的結(jié)果是商為0,余數(shù)為1,并將余數(shù)1存到VW12,商0存到VW14里面(這里VW12就是高16位,VW14就是低16位)。
對于四則運算,應(yīng)用這些加減乘除運算指令也是比較簡單的,這里也就不舉例子了,大家也可以隨便寫些運算公式來進行編寫試試。
下面就是學(xué)習(xí)一下遞增遞減指令,也就是加1減1指令,這兩個指令在編程過程中也是經(jīng)常會要用到的,這個我們必須得掌握一下。對于遞增遞減指令,它可以進行加1或者減1的操作,我們要注意的是一般都是用沿觸發(fā)遞增遞減指令的。另外,因為遞增遞減指令有時是會配合傳送指令或移位指令等一起使用,這里我們就先學(xué)習(xí)指令的用法,等后面學(xué)了其他指令之后,再來學(xué)習(xí)對指令的應(yīng)用。
然后再看一下三角函數(shù)指令,三角函數(shù)指令有正弦SIN指令、余弦COS指令、正切TAN指令,這幾個指令是對角度值進行三角運算,我們要注意的是三角函數(shù)的輸入角是以弧度為單位的。如果我們要將輸入角從角度轉(zhuǎn)換成弧度,我們要用角度乘以0.0174(pi/180),再來計算三角函數(shù)。
最后就學(xué)習(xí)一下平方根指令、自然對數(shù)指令和自然指數(shù)指令,平方根SQRT指令我們要注意的是它是對32位實數(shù)取平方根并產(chǎn)生一個32位實數(shù)結(jié)果的,自然對數(shù)LN指令是對輸入的數(shù)值進行自然對數(shù)計算,自然指數(shù)指令是進行e的IN次方指數(shù)計算的。下面就舉個計算VD0的3次方的例子,以便更好的理解。我們假設(shè)VD0為x,那么就相當(dāng)于是計算的值,其實,那么計算時先取x的自然對數(shù),再乘以3.0,最后再進行e的IN次方指數(shù)計算,這樣就能計算出結(jié)果了。
關(guān)于三角函數(shù)指令、平方根指令、自然對數(shù)/指數(shù)指令等,用的也是相對少些的,我們大概知道怎么用就可以了,我們就重點掌握一下四則運算指令和遞增遞增指令。
【跟著我一起來學(xué)習(xí)s7-200】23邏輯運算指令
什么是邏輯運算指令呢?邏輯運算指令就是對字節(jié)、字和雙字進行取反/與/或/異或的操作。取反指令是INV,邏輯與指令是WAND,邏輯或指令是WOR,邏輯異或指令是WXOR。
對于WAND指令,我們可以說它是對信號的屏蔽,它是有0出0,全1出1的;WOR指令,我們可以說它是對信號的組合,它是有1出1,全0為0的;WXOR指令是對信號的轉(zhuǎn)換和檢測,它是相同為0,不同為1的,這是我們需要注意的,INV指令是對前面的邏輯運算結(jié)果進行取反的操作,前面的結(jié)果為1則取反后為0,前面的結(jié)果為0則取反后為1。下面便看一下這幾個指令的使用。
還有一個值得一提的是,我們可以根據(jù)指令的功能還可以進行置位和復(fù)位的操作。我們利用邏輯與WAND指令有0出0的功能可以進行復(fù)位操作,利用邏輯或WOR指令有1出1的功能可以進行置位操作。下面我們便看一下兩個小例子。
第一個是用WAND指令進行復(fù)位的例子,在IN1中輸入二進制數(shù)1111011111101111,因為VW0為VB0 VB1,那么當(dāng)I0.0接通,執(zhí)行一次邏輯與運算,這樣就將V0.3和V1.4復(fù)位了。
第二個是用WOR指令進行置位的例子,在IN1中輸入二進制數(shù)1000100,那么當(dāng)I0.1接通,執(zhí)行一次邏輯或運算,將V4.2和V4.6置位。
那么以上就是我們的邏輯運算指令了,也還算是比較簡單的,學(xué)習(xí)之后你掌握的如何呢。
【跟著我一起來學(xué)習(xí)s7-200】24傳送指令
數(shù)據(jù)傳送指令,傳送指令也是我們在編程過程中經(jīng)常會要使用到的指令,我們也要掌握好它。所謂的傳送指令就是把一個存儲單元(輸入端)的數(shù)值復(fù)制到另一個存儲單元(輸出端)里面,我們的傳送指令經(jīng)常是用于對存儲單元的清零或者程序的初始化等場合。
傳送指令有單個數(shù)據(jù)傳送指令MOV,以及塊傳送指令BLKMOV,根據(jù)數(shù)據(jù)的類型它又可以分為字節(jié)、字、雙字或者實數(shù)等這幾種情況,不過要注意的是塊傳送指令沒有實數(shù)類型的指令。除此之外,還有字節(jié)交換指令SWAP,字節(jié)傳送立即讀指令和字節(jié)傳送立即寫指令,當(dāng)然這些指令用的相對較少,對這幾個指令我們就先了解一下。
傳送指令MOV的輸入IN可以是常數(shù)、IB、QB、VB、SMB、LB、SB,輸出可以是IB、QB、VB、SMB、LB、SB,但是要注意輸出是沒有常數(shù)的,如果輸出是常數(shù),那么是會提示錯誤的。
除此之外,我們在使用傳送指令的時候,要注意的是輸入和輸出的數(shù)據(jù)類型是要一致的,如果不一致,同樣也是會提示錯誤的。
那么數(shù)據(jù)塊傳送指令BLKMOV,它是將字節(jié)或字或雙字?jǐn)?shù)目N從輸入存儲單元傳送到輸出存儲單元,也就是說塊傳送指令它是批量傳送的,注意N的范圍是1~255,使用的時候要注意不能超限。那么下面這條指令也就是將VB0~VB9的里面的數(shù)據(jù)傳送到VB50~VB59里面。
然后再學(xué)習(xí)一下字節(jié)交換指令SWAP,字節(jié)交換指令的功能是交換字的最高位字節(jié)和最低位字節(jié),下面就舉個例子來說明一下指令的用法,那么以下這條指令是對VW0進行字節(jié)交換,因為VW0=VB0 VB1,它是低地址在前高地址在后的,執(zhí)行了指令之后則變成VB1 VB0,變?yōu)楦叩刂吩谇暗偷刂吩诤罅恕?div style="height:15px;">

下面再繼續(xù)看一下字節(jié)傳送立即讀指令和字節(jié)傳送立即寫指令,它跟前面講到的立即指令是一樣的,而且它也是只針對I/O地址的。字節(jié)傳送立即讀指令是對輸入I進行讀操作,字節(jié)傳送立即寫指令是對輸出Q進行寫操作。
那么今天就學(xué)習(xí)了傳送指令,傳送指令也還算是比較簡單的是吧?那么之后就要學(xué)習(xí)一些相對難一些的指令了,你準(zhǔn)備好了嗎?
【跟著我一起來學(xué)習(xí)s7-200】25移位循環(huán)指令
移位指令有左移也有右移,移位指令也分有字節(jié)、字、雙字類型的移位,同樣的,循環(huán)指令也有左移右移,也有字節(jié)、字、雙字類型的循環(huán)。除此之外,我們也可以在指令列表看到還有SHRB移位寄存器指令。這些指令我們都要靈活地掌握,掌握了這些指令,在以后編程的時候有時可以做到簡化程序的效果,所以它還是比較有用的指令。
下面先學(xué)習(xí)一下移位指令,移位指令格式里面有使能輸入、輸入、輸出和移位位數(shù)N。下面就以字節(jié)移位指令為例看一下,字節(jié)左移SHR_B和字節(jié)左移SHL_B指令是將輸入字節(jié)(或字或雙字)數(shù)值根據(jù)移位位數(shù)向左或向右移動,并將結(jié)果送輸出字節(jié)(或字或雙字)。我們要注意的是對一個數(shù)左移一位相當(dāng)于乘以2,右移一位相當(dāng)于除以2。
對于移位指令,我們要注意的是移位指令是對每個移出的位進行自動補0的。如果移位位數(shù)大于或等于8(或字操作16或雙字操作32),那么數(shù)值最多是被移位8(或字操作16或雙字操作32)次的。當(dāng)移位位數(shù)大于或等于最大允許值時,其實就相當(dāng)于進行清零的操作。
除此之外,我們還要注意特殊內(nèi)存位的使用,對于SM1.0,如果移位結(jié)果是零,則SM1.0被置位;對于SM1.1,就是把最后一次移出位的數(shù)值被復(fù)制到SM1.1,要注意這個前提是移位位數(shù)大于0。我們要注意的是SM1.0和SM1.1是會自動復(fù)位的。
就以下面這個程序來說明一下指令的使用,這條指令是I0.0接通執(zhí)行移位操作,它是接通一次移位一次的,若VW200寫入的是1110 0010 1010 1101,因為移位位數(shù)是3,那么移位的最后結(jié)果是0001 0101 0110 1000的。因為移位位數(shù)是大于0的,最后一位移出位的數(shù)值是1,那么就把SM1.1置為1。
下面再學(xué)習(xí)一下循環(huán)移位指令,循環(huán)移位指令格式里面一樣是有使能輸入、輸入、輸出和移位位數(shù)N的。下面就以字節(jié)循環(huán)移位指令為例看一下,字節(jié)循環(huán)左移ROR_B和字節(jié)循環(huán)左移ROL_B指令是將輸入字節(jié)(或字或雙字)數(shù)值根據(jù)移位位數(shù)向左或向右旋轉(zhuǎn)N位,并將結(jié)果送輸出字節(jié)(或字或雙字)。
對于循環(huán)移位指令,我們要注意的是如果移位位數(shù)大于或等于8(或字操作16或雙字操作32),那么執(zhí)行循環(huán)移位之前要先對移位位數(shù)N進行模數(shù)8(或字操作16或雙字操作32)操作,使得移位位數(shù)在0~7(或字操作0~15或雙字操作0~31)之間,得到一個有效的移位位數(shù)。這里說的模數(shù)8操作是什么呢?它其實也就是對移位位數(shù)N除于8再求余數(shù),舉個例子,如果移位位數(shù)是20,那么20除于8等于2余4,那么4就是實際移位數(shù)目。
我們要知道如果移位位數(shù)為0,這指令也就沒有什么意義了,它是不執(zhí)行循環(huán)操作的。如果執(zhí)行循環(huán)操作,也就是移位位數(shù)大于0,那么旋轉(zhuǎn)的最后一位數(shù)值被復(fù)制到SM1.1。對于SM1.1,還有如果移位位數(shù)不是8(或16或32)的整數(shù)倍,那么旋轉(zhuǎn)出的最后一位數(shù)值也被復(fù)制到SM1.1;對于SM1.0,當(dāng)需要循環(huán)的數(shù)值是零時,SM1.0被置位。
就以下面這個程序來說明一下指令的使用,這條指令是I0.0接通執(zhí)行循環(huán)操作,若AC0寫入的是0100 0000 0000 0001,因為移位位數(shù)是2,那么移位的最后結(jié)果是0101 0000 0000 0000的。因為移位位數(shù)是大于0的,最后一位移出位的數(shù)值是0,那么SM1.1就為0。
下面就以小程序案例的形式講一下這幾個指令。
1、編寫跑馬燈程序,8個燈從左往右循環(huán)點亮,即Q0.0---Q0.7每隔1秒點亮一個燈,周期循環(huán)。
2、編寫8個燈先全部亮,接著8個燈從左往右依次熄滅,即Q0.0-Q0.7每隔1s熄滅一個燈。
那么這就是移位指令和循環(huán)指令了,今天主要是學(xué)習(xí)指令的基本使用,這里還有移位寄存器指令沒有學(xué)習(xí),那么明天就學(xué)習(xí)一下移位寄存器,并且后面再來學(xué)一下對這些指令的應(yīng)用。
【跟著我一起來學(xué)習(xí)s7-200】26移位寄存器指令
移位寄存器指令SHRB是將DATA數(shù)值移入移位寄存器。S_BIT指定移位寄存器的最低位。N指定移位寄存器的長度和移位方向(移位加 = N,移位減 = -N)。移位寄存器的最大長度是64位的,可以正也可以負。我們要注意的是SHRB指令移出的每個位是被放置在溢出內(nèi)存位(SM1.1)中的。
下面便以以下的程序來講解指令的使用,用I0.2的上升沿來執(zhí)行移位寄存器指令,那么就是一個掃描周期移一位的,指令中V100.0是移位寄存器的最低位,I0.3里面存的是0或1的數(shù)值,指令指定是移位加的,移位寄存器的長度是4。我們結(jié)合下面的時序圖和移位的圖來看,若V100為0000 0101,因為移位寄存器的長度是4,那么只有0101,當(dāng)I0.3為1時,執(zhí)行第一次移位,把1移到移位寄存器的最低位,把移出的位的值0放置到SM1.1中,那么SM1.1為0,當(dāng)I0.3為0時,執(zhí)行第二次移位,把0移到移位寄存器的最低位,把移出的位的值1放置到SM1.1中,那么SM1.1為1。
下面再看一個程序案例,更深入地來學(xué)習(xí)一下這個移位寄存器指令。
1、產(chǎn)品檢測分揀機,輸送帶上的產(chǎn)品經(jīng)過一臺檢測裝置時,檢測裝置輸出檢測結(jié)果到I0.0,有產(chǎn)品時為1。I0.1檢測產(chǎn)品的好壞,若I0.1為0則產(chǎn)品是好的,若I0.1為1則產(chǎn)品是壞的。在第4個產(chǎn)品位置有一個推產(chǎn)品的氣缸Q0.0。若檢測的產(chǎn)品為壞時,到達第4個產(chǎn)品位置時,Q0.0輸出,氣缸動作,產(chǎn)品被推出,1s后氣缸退回,傳送帶繼續(xù)工作,進行產(chǎn)品的檢測。
下面就分析一下程序,檢測裝置檢測到有產(chǎn)品時I0.0為1,I0.1檢測產(chǎn)品的好壞,產(chǎn)品壞為1,指定移位寄存器的最低位為M0.0,移位寄存器的長度為4。因為在第4個產(chǎn)品位置有一個氣缸Q0.0,若I0.1為1時,到達第4個產(chǎn)品位置時,那么就用M0.3驅(qū)動氣缸動作,推出產(chǎn)品,同時做了一個定時器定時1s,1s后復(fù)位M0.3,氣缸退回。
那么這就是對移位寄存器的學(xué)習(xí),可能會相對有些難理解,不過不要緊,相信多做一些練習(xí),那就會熟悉的。那么后面就開始學(xué)習(xí)一下應(yīng)用以上所學(xué)指令的程序案例的編程。
【跟著我一起來學(xué)習(xí)s7-200】27綜合程序應(yīng)用
前面已經(jīng)學(xué)習(xí)了好些指令了,像算術(shù)運算指令、邏輯運算指令、傳送指令、移位循環(huán)指令等,但都沒有做一個較綜合的應(yīng)用,那么今天就開始做一兩個較為綜合的程序案例應(yīng)用吧。
1、編寫出1S內(nèi)計算出PLC經(jīng)過多少個掃描周期的程序
下面就分析一下以上的程序,首先對后面要用到的V存儲區(qū)進行清0,然后做個啟保停程序,并做個定時器定時1s,當(dāng)定時時間到T37的常閉觸點斷開,使Q0.0斷開,后面再用一個Q0.0來驅(qū)動一個加1指令,這樣就可以計算出Q0.0接通1S的時間內(nèi)PLC經(jīng)過多少個掃描周期了。
2、編寫能夠計算VW0中1的個數(shù)的程序
下面也分析一下以上的程序,假如往VW0里面寫入的是16#FF,所以首先把16#FF傳送到VW0,同時對后面要用來存儲個數(shù)的存儲器VW2和VB4進行清0,然后是做一個字右移,因為移位的位數(shù)為1,是大于0 的,這樣就把移出位的數(shù)值復(fù)制到SM1.1,這在前面是有學(xué)習(xí)到的,把1移到SM1.1一次,也就是SM1.1接通一次,從而執(zhí)行加1指令,對VW2進行加1操作,因為VW0是有8個1的,那么程序執(zhí)行完后VW2里面就是8。這里同時做了對VB4進行加1操作,這樣是因為字的移位的有效移位最多是16位的,所以在移位指令前面做了一個比較指令VB4<=15。
以上兩個例子,正是運用了前面學(xué)習(xí)到的傳送指令、遞增指令和移位指令,經(jīng)過這樣的程序案例練習(xí),是否對指令的使用有了更深一層的理解呢。那么你也可以來嘗試這樣學(xué)習(xí)一下吧。
【跟著我一起來學(xué)習(xí)s7-200】28字符串指令
在軟件的指令列表里面,我們可以看到還有字符串指令,那么今天就學(xué)習(xí)一下字符串指令,雖然字符串指令在應(yīng)用方面可能會用的比較少,但作為s7-200的指令,我們還是要學(xué)習(xí)一下。字符串指令里面有字符串長度指令、字符串復(fù)制指令、復(fù)制子字符串指令、字符串連接指令、查找子字符串指令和查找字符串中的字符指令。
那么就先學(xué)習(xí)一下這些指令,對于字符串連接指令STR_CAT,顧名思義,就是把字符串進行連接起來;字符串長度指令STR_LEN是返回IN指定的字符串長度,也就是計算輸入字符串里面有多少個有效字符;字符串復(fù)制指令STR_CPY就是直接將IN指定的字符串復(fù)制至OUT指定的字符串;而復(fù)制子字符串指令它的操作內(nèi)容除了輸入IN輸出OUT之外,還有INDX和N,INDX是索引到哪個字符,N是字符數(shù),這個指令是將從輸入字符串索引到的字符開始的N個字符輸出。下面就看一下指令在程序中的使用。
以上程序在第一個STR_CAT輸入字符串“HELLO”,在第二個STR_CAT輸入字符串“WORLD”,那么指令執(zhí)行之后就將“HELLO WORLD”送到VB0里面,后面的SSTR_CPY指令是將“HELLO WORLD”中第7個字符開始的5個字符輸出到VB10,那么最后是將“WORLD”輸出到VB10的,再執(zhí)行STR_CPY指令是直接將VB10中的“WORLD”復(fù)制到VB100里面,最后的STR_LEN指令是計算VB100里面有多少個字符,VB100里面有5個字符,那么指令執(zhí)行后VB200輸出的就是5。
下面再繼續(xù)學(xué)習(xí)一下查找子字符串指令和查找字符串中的字符指令。查找子字符串指令是從OUT定義的字符位置開始,在字符串IN1中找符合IN2的字符串,如果找到一個與字符串IN2完全符合的字符系列,該系列的第一個字符位置被寫入到OUT里。如果在字符串IN1中未找到符合IN2的字符串,OUT被設(shè)為0。
以上程序首先是對要用的V存儲器VB300進行初始化,賦值1,因為位置的計算是以1開始計數(shù)的。因VB100里面的字符串是“WORLD”,執(zhí)行STR_FIND指令后,在字符串VB100中找符合“rld”的字符串,找到后把“rld”字符串的第一個字符的位置寫入到VB300里面,那么在VB300中輸出的就是3。
而查找字符串中的字符指令從OUT定義的字符位置開始,在字符串IN1中找符合IN2里定義的任何字符,如果找到一個字符與IN2里定義的任何字符一致,那么把找到的第一個字符位置寫入到OUT里。如果未找到相符的字符,OUT被設(shè)為0。
以上程序首先是對要用的V存儲器VB400進行初始化,賦值1,因為位置的計算是以1開始計數(shù)的。因VB100里面的字符串是“WORLD”,執(zhí)行CHR_FIND指令后,在字符串VB100中找符合字符串“l(fā)od”的任意字符,找到后把“l(fā)od”字符串的第一個字符的位置寫入到VB400里面,那么在VB400中輸出的就是2。
那么這就是對字符串指令的學(xué)習(xí)了。因為這些指令用的相對較少些,記不住也沒關(guān)系,先有個了解,等需要用的時候查找一下幫助看下指令的用法就可以了。
【跟著我一起來學(xué)習(xí)s7-200】29時鐘讀寫指令
時鐘讀寫指令有讀取時鐘指令READ_RTC和寫時鐘指令SET_RTC,讀取實時時鐘指令READ_RTC是從硬件時鐘中讀取當(dāng)前時間和日期,并把它裝載到一個以地址T起始的8個字節(jié)的存儲區(qū)中,寫時鐘指令SET_RTC是將當(dāng)前時間和日期寫入到用T指定的在8個字節(jié)存儲區(qū)開始的硬件時鐘中。以地址T起始的8個字節(jié)的存儲區(qū)中存儲的數(shù)據(jù)內(nèi)容及數(shù)值范圍如下表,我們要注意的是對于星期的數(shù)值,1代表星期日,7代表星期六,而0表示禁止計星期。
我們看一下數(shù)據(jù)內(nèi)容為星期的,因為年月日的關(guān)系,星期是自動固定了的,所以星期保持默認就好了,所以在實際應(yīng)用的時候,對于T+5,T+6,T+7經(jīng)常是不進行設(shè)置的。但要注意的是CPU不會檢查日期與星期是否合理的,比如2月30日可能會被接受。所以在寫入時鐘時要確認輸入的數(shù)據(jù)的正確性。
我們要注意的是,對于一個全新的CPU,需先在菜單的“PLC-實時時鐘”或者通過寫時鐘指令給CPU分配一個時間。
在使用時鐘讀寫指令時,有三個點是要注意的,一是,一般是用沿觸發(fā)設(shè)置實時時鐘指令的,也就是在驅(qū)動條件的上升沿,就把設(shè)定的時間寫入到PLC里面;二是,讀取實時時鐘指令用SM0.5來調(diào)用,也就是1s讀取一次,讀取出PLC里面的實時時間;三是,時鐘的顯示數(shù)值是以BCD碼(16#無字母的數(shù))形式的。
下面就看一下程序?qū)嵗?div style="height:15px;">
當(dāng)我們用狀態(tài)表監(jiān)控時,就可以監(jiān)控到讀取的實時時鐘信息。這里我用的是CPU224的PLC,我們要注意的是CPU221和CPU222是要另外配時鐘卡才具有實時時鐘功能的,而CPU224、CPU224XP和CPU226是內(nèi)置有時鐘卡的,所以如果我們用CPU221和CPU222時又沒有配時鐘卡的話是不支持實時時鐘功能的,這樣只能選用CPU224、CPU224XP或CPU226的PLC。
那么這就是我們的實時時鐘讀寫指令,應(yīng)該不會太難理解吧?
【跟著我一起來學(xué)習(xí)s7-200】30循環(huán)跳轉(zhuǎn)指令
程序控制指令有FOR-NEXT循環(huán)指令、跳轉(zhuǎn)指令JMP和LBL、順序控制指令SCR、SCRT和SCRE、子程序返回指令RET、程序結(jié)束指令END、轉(zhuǎn)到STOP模式的STOP指令、看門狗復(fù)位指令WDR和診斷LED指令DIAG_LED。
我們先看一下FOR-NEXT循環(huán)指令,F(xiàn)OR指令必須指定當(dāng)前循環(huán)計數(shù)INDX、起始值INIT和結(jié)束值FINAL,NEXT指令標(biāo)記FOR循環(huán)的結(jié)束。我們要注意的是每條FOR指令都必須對應(yīng)一條NEXT指令,而循環(huán)執(zhí)行的程序就在FOR-NEXT指令之間的,而且循環(huán)是可以嵌套的,它最多可以嵌套8層。
除此之外,我們要注意FOR指令一般用沿觸發(fā),每次觸發(fā),INDX會賦以INIT的值。假如INIT為1,F(xiàn)INAL為10,那么每執(zhí)行一次循環(huán)體內(nèi)的程序,INDX值遞增加1,直到大于FINAL值,退出循環(huán)。
下面再學(xué)習(xí)一下跳轉(zhuǎn)指令,跳轉(zhuǎn)指令JMP可以使程序從一個地方跳到另外一個地方去執(zhí)行,LBL指令標(biāo)記的就是跳轉(zhuǎn)的目的地。對于跳轉(zhuǎn)指令我們要注意的是可以在主程序、子程序或中斷例行程序中使用跳轉(zhuǎn)指令,但是不能從主程序跳到子程序或中斷程序中去的,跳轉(zhuǎn)必須是跳轉(zhuǎn)到相同的代碼段中的。
循環(huán)指令和跳轉(zhuǎn)指令在我們編程過程中,有時是會要用到的,所以我們要掌握一下的。那么今天就先學(xué)習(xí)這兩個指令,先消化好再來學(xué)習(xí)程序控制指令剩下的其他指令。
【跟著我一起來學(xué)習(xí)s7-200】31程序控制指令
我們看一下順序控制指令,順序控制指令可以使程序按照順序執(zhí)行,順序控制指令有SCR、SCRT和SCRE,我們要注意的是SCR指令和SCRE指令是配套使用的。SCR指令的作用是將n引用的S位數(shù)值載入SCR,即標(biāo)記SCR段的開始。SCRT指令的作用是識別要啟用的SCR位,即是下一個要設(shè)置的n位。SCRE指令的作用是標(biāo)記SCR段的結(jié)束。
我們要注意一下使用SCR的限制,第一,不能把相同的S位用于不同的程序中,舉個例子,如果在主程序中使用了S0.0,則不能在子程序中再使用它;第二,不能在SCR段中使用JMP和LBL指令,也不允許在SCR段內(nèi)跳轉(zhuǎn),但是可以使用跳轉(zhuǎn)和標(biāo)簽指令在SCR段周圍跳轉(zhuǎn)。SCR段之間的跳轉(zhuǎn),可以使用SCRT或者置位/復(fù)位指令;第三,不能在SCR段中使用"END"指令。
下面就看一下順序控制指令的使用的程序例子。這里的SCRT指令就是跳轉(zhuǎn),它是跳到S0.1的,也就是置位S0.1并復(fù)位S0.0。
下面再學(xué)習(xí)一下看門狗復(fù)位WDR指令,WDR指令重新觸發(fā)S7-200 CPU的看門狗定時器,擴展掃描允許使用的時間,而不會出現(xiàn)看門狗錯誤。我們在使用看門狗復(fù)位指令時應(yīng)當(dāng)小心,如果使用循環(huán)指令阻止掃描完成,那么像I/O更新、通訊等程序只有在掃描周期完成后才能執(zhí)行。如果對程序預(yù)計掃描時間將超過500毫秒,可能阻止返回主掃描超過500毫秒,這時就應(yīng)當(dāng)使用WDR指令,重新觸發(fā)看門狗定時器。以下程序就是使用了看門狗復(fù)位的例子。
下面看一下子程序返回RET指令,RET指令是根據(jù)前一個邏輯終止子程序,并返回主程序的。軟件是會自動在子程序最后增加子程序無條件返回指令的,但它不會顯示在"子程序POU"里面。
而主程序結(jié)束END指令,它是根據(jù)前一個邏輯條件終止主程序的,也就是是說在END指令之后的程序是不執(zhí)行的。同樣,軟件是會自動在主程序最后增加END指令的。我們要注意的是END指令只能用在主程序里,而不能用在子程序或者中斷程序中的。
還有是STOP指令,它可以強制將PLC切換到STOP停止模式。
最后再看一下診斷LED燈DIAG_LED指令,該指令中如果輸入?yún)?shù)IN的數(shù)值為零,則診斷LED會被設(shè)置為不發(fā)光。如果輸入?yún)?shù)IN的數(shù)值大于零,則診斷LED會被設(shè)置為發(fā)光 (黃色)。下面的程序讓診斷LED燈亮0.5s,滅0.5s,那么當(dāng)輸入IN的數(shù)值大于零時,診斷LED會被設(shè)置為發(fā)光(黃色)。
這里這么多個指令,其實可能會要用到的也就是順序控制指令和看門狗復(fù)位指令,我們主要學(xué)習(xí)一下這兩個指令就基本可以了。
【跟著我一起來學(xué)習(xí)s7-200】32循環(huán)跳轉(zhuǎn)應(yīng)用
前兩天學(xué)習(xí)了程序控制指令,那么今天我們就做一個循環(huán)跳轉(zhuǎn)指令的小練習(xí),因為循環(huán)跳轉(zhuǎn)指令相對重要些,所以就以一個例子來鞏固一下,并綜合用到前面學(xué)習(xí)的一些指令。下面就以從1加到100的求和這樣的一個例子來學(xué)習(xí)一下。
1、應(yīng)用FOR-NEXT循環(huán)指令來實現(xiàn)從1加到100的求和
首先用SM0.1給VW0和VW2分別賦值1和2,再用輸入I0.0的上升沿觸發(fā)FOR-NEXT循環(huán)指令,而在循環(huán)體里面是先做加法運算,將VW0和VW2進行相加,并把相加的結(jié)果送回到VW0,而VW2則是做遞增加1操作,如此實現(xiàn)求和運算,注意因為前面賦值為1和2,那么這里循環(huán)99次就可以了。下圖就是用狀態(tài)表監(jiān)控出來的結(jié)果,我們看到在VW0的當(dāng)前值是5050,也就是從1加到100的和就為5050。
2、在FOR-NEXT循環(huán)指令的基礎(chǔ)上增加了跳轉(zhuǎn)指令來實現(xiàn)從1加到100的求和
這里在FOR-NEXT循環(huán)指令的基礎(chǔ)上增加了跳轉(zhuǎn)指令,這里主要是為了對指令的使用而編的程序,在這里的程序跟前面的有些區(qū)別,在這里是先給VW0和VW2分別賦值為0和1,那么這里循環(huán)次數(shù)就應(yīng)該為100次的,這里我們要注意一下。下圖就是用狀態(tài)表監(jiān)控的結(jié)果,同樣VW0里面的當(dāng)前值也為5050。
那么今天就是做這樣一個例子,你也可以找些其他例子來練習(xí)練習(xí)。
【跟著我一起來學(xué)習(xí)s7-200】33表指令
除了通信指令外,前面我們已經(jīng)基本把所有指令講完了,就只剩下表指令了,那么今天我們就學(xué)習(xí)最后一部分指令,表指令。我們的表指令有后進先出LIFO指令、先進先出FIFO指令、填表指令A(yù)D_T_TBL、存儲區(qū)填充指令FILL_N和查表指令TBL_FIND。
那么什么是表呢,表它其實就是一段存儲區(qū)域。一個表最多只能有100條數(shù)據(jù),每個數(shù)據(jù)都是16位的。如果表溢出了,SM1.4會被置為1。我們要注意的是一個表中,首地址表示的是這個表的最大數(shù)據(jù)條數(shù),第二個地址表示的是當(dāng)前數(shù)據(jù)條數(shù),從第三個地址往下,才是實際數(shù)據(jù)。
我們要注意的是要建立表格,首先要為表的最大條目數(shù)建立一個條目。如果沒有這樣做,那么是無法在表格中建立任何條目的。
下面我們先看一下后進先出LIFO指令的使用。
所以,LIFO指令是將表格中的最后一個條目移至輸出內(nèi)存地址,每次執(zhí)行指令時,表格中的條目數(shù)減1。
下面我們再看一下先進先出FIFO指令的使用。
所以,F(xiàn)IFO指令是將表格中的第一個條目移至輸出內(nèi)存地址,表格中的所有其他條目均向上移動一個位置。每次執(zhí)行指令時,表格中的條目數(shù)減1。
下面我們再看一下填表指令A(yù)D_T_TBL的使用。
所以,填表指令A(yù)D_T_TBL指令是向表格(TBL)中加入字值(DATA),新數(shù)據(jù)被增加至表格中的最后一個條目,每次向表格中增加新數(shù)據(jù)后,條目計數(shù)加1。我們要注意的是表格最多只可以有100個條目,不包括指定最大條目數(shù)和實際條目數(shù)這兩個條目。如果過度填充表格的話,SM1.4會被置為1。
下面我們再看一下存儲區(qū)填充指令FILL_N的使用。FILL指令是把包含在地址IN中的數(shù)據(jù)寫入到從地址OUT開始N個連續(xù)字地址中。要注意的是數(shù)據(jù)類型是為字的,且N的范圍是1至255。
那么以上的程序其實就是把VW0、VW2、VW4……VW20清零。
下面我們再看一下查表指令TBL_FIND的使用。TBL_FIND指令是在表格(TBL)中搜索符合一定規(guī)則的數(shù)據(jù)。從INDX開始搜索表,尋找符合PTN和CMD的數(shù)據(jù)。CMD被指定一個1至4的數(shù)值,分別代表 =、<>、<、>。如果找到符合條件的數(shù)據(jù),那么INDX指向表格中該數(shù)的位置。
以上程序就是當(dāng)I0.0接通時,在表格中搜索等于3130的十六進制數(shù)。
那么今天主要就學(xué)習(xí)了這個表指令。對于表指令也是比較少會用到,我們有個了解就可以了。
【跟著我一起來學(xué)習(xí)s7-200】34 S7-200庫
在我們的編程軟件里面具有添加或刪除庫的功能,只要右鍵點擊一下“庫”,選擇“添加/刪除庫”,就可以進行添加和刪除庫。添加之后庫指令就會出現(xiàn)在指令列表里面。當(dāng)我們要使用庫指令時,直接從庫指令列表中拖拽出來就可以了。
我們要知道的是我們也可以為子程序生成一個庫,我們只要右鍵點擊“庫”,選擇“新建庫”。我們要注意的是要為子程序里用到的每個變量定義符號名。選擇新建庫后,在跳出的對話框的“組件”項選擇子程序并點擊添加,在庫的屬性里面填寫庫的名字和輸出路徑,我們一般選擇“C:\Program Files\Siemens\STEP 7-MicroWIN V4.0\Lib”這個路徑。此外,我們還可以為庫程序設(shè)置密碼。待新建好庫之后,同樣可以在“添加/刪除庫”把新建好的庫添加到指令列表里面。
另外,我們要注意的是,對于一些庫程序,有可能會占用以部分V存儲區(qū),這樣我們在調(diào)用庫程序之后要手工分配一些庫存儲區(qū),右鍵點擊“程序塊”,選擇“庫存儲區(qū)”,就會彈出“庫存儲區(qū)分配”的對話框,進行分配地址。如果沒有分配庫存儲區(qū),編譯時是會報錯的。如果庫程序沒有占有V存儲區(qū),那就不需要分配地址。下圖就是沒有用到V存儲區(qū)的情況,調(diào)用庫的時候不會要求分配地址。所以說,不是所有庫程序都需要分配庫存儲區(qū)的。
總結(jié)一下,我們在使用庫時有幾點要注意的,一是,待生成庫的程序里使用的存儲區(qū)要連續(xù),以免造成空間浪費;二是,待生成庫的程序里的變量都要使用V存儲區(qū),而且都要定義符號,如果使用的是M存儲區(qū),不會要求分配庫地址;三是,分配的庫存儲區(qū)地址不要跟編寫的程序地址重復(fù),我們可以選擇“建議地址”讓軟件自動分配,四是,不是所有庫程序都需要分配庫地址。
至于常用的S7-200庫,可以到以下網(wǎng)址進行下載。【跟著我一起來學(xué)習(xí)s7-200】35中斷
什么是中斷呢,中斷是一種工作方式,它是為了解決突發(fā)事件不能得到及時處理和響應(yīng)這種問題的。在我們的S7-200中,系統(tǒng)為每個中斷事件規(guī)定了一個中斷事件號,而響應(yīng)中斷事件而執(zhí)行的程序就叫中斷服務(wù)程序。
我們要注意的是多個中斷事件可以調(diào)用同個中斷程序,但是一個中斷事件不能連接多個中斷程序。還有中斷服務(wù)程序不能再被中斷,在中斷程序里面只能調(diào)用一層子程序,中斷程序調(diào)用的子程序也不能再被中斷。
S7-200CPU支持三類中斷事件,一種是通信口中斷、I/O中斷、定時中斷。這幾個中斷事件中通信中斷的優(yōu)先級是最高的,定時中斷的優(yōu)先級是最低的。我們要注意的是中斷程序執(zhí)行過程中,發(fā)生其他中斷事件是不會影響中斷的執(zhí)行的,它會按照優(yōu)先級和發(fā)生時序進行排隊,如果隊列溢出,相應(yīng)的系統(tǒng)標(biāo)志位會被置位。我們記住這個原則,優(yōu)先級高的中斷先處理,優(yōu)先級相同的中斷事件是先到的先處理的。下面就附上中斷事件號及其優(yōu)先級表,和中斷隊列的最多中斷數(shù)目及中斷隊列溢出標(biāo)志位表。
下面我們再看一下中斷指令,有中斷運行指令ENI、中斷禁止指令DISI、從中斷指令有條 件返回指令RETI、中斷連接指令A(yù)TCH、中斷分離指令DTCH和清除中斷事件指令CLR_EVENT。
中斷運行指令ENI是全局性允許所有中斷事件。中斷禁止指令DISI是全局性禁止所有中斷事件。從中斷指令有條件返回指令RETI是根據(jù)前面的邏輯操作條件,從中斷服務(wù)程序中返回, 編程軟件是會自動在中斷程序末尾添加RETI指令的。
中斷連接指令A(yù)TCH是將中斷事件(EVNT)與中斷服務(wù)程序號碼(INT)相聯(lián)系,并啟用中斷事件。中斷分離指令DTCH是取消中斷事件(EVNT)與所有中斷服務(wù)程序之間的關(guān)聯(lián),并禁用中斷事件。清除中斷事件指令CLR_EVENT會刪除中斷隊列中所有類型為EVNT的中斷事件,這個指令用于清除不必要的中斷。
以上這幾個中斷指令中,我們主要會用到的只有兩個指令,中斷連接指令A(yù)TCH和中斷運行指令ENI。
那么以上就是我們的中斷和中斷指令的一些基礎(chǔ)內(nèi)容,在學(xué)習(xí)怎么使用中斷指令之前首先做個了解,然后再來詳細學(xué)習(xí)中斷指令的使用等。
【跟著我一起來學(xué)習(xí)s7-200】36中斷的使用
我們要知道使用中斷的步驟是怎樣的,我們使用中斷的一般步驟是,第一,在首次掃描時要設(shè)置與所連接的中斷事件相關(guān)的系統(tǒng)存儲區(qū),第二,使用ATCH指令將中斷事件(EVENT)和中斷服務(wù)程序號(INT)相聯(lián),簡單的說就是建立起中斷連接,第三,使用ENI指令允許全局中斷,也可以說是激活中斷,第四,編寫中斷服務(wù)程序。
對于中斷程序,平時是禁止執(zhí)行的,而執(zhí)行時它是只執(zhí)行一個掃描周期的。我們還要注意的是,上升沿指令、下降沿指令、定時器、計數(shù)器是不能在中斷程序中使用的,但是加1指令和減1指令就可以在中斷程序中使用。
那么在編程軟件里面是在哪里編寫中斷程序呢,在我們的編程軟件,是默認提供了一個空的中斷程序INT_0的,我們可以在里面編寫中斷程序,我們還可以插入中斷程序,右鍵點擊“插入-中斷”就可以了。我們最多可以插入128個中斷,不過肯定是用不完的,用這么多中斷就不得了了,因為中斷會影響到掃描,所以一般中斷都是越少越好,中斷程序越短越好的,我們要注意一下。
對于中斷使用,還有一下注意事項是我們需要注意的,第一,在中斷程序中不能使用DISI、ENI、HDEF、LSCR、END指令;第二,知道程序只需要跟中斷事件連接一次,所以ATCH是用SM0.1來觸發(fā)的。
那么下面我們就具體的看一下中斷指令的使用吧。
以上的程序就是用到了I/O中斷,在網(wǎng)絡(luò)1中,SM0.1首次掃描,定義中斷事件1(I0.0的下降沿)中斷服務(wù)程序是INT_0,建立中斷連接,然后是ENI全局允許中斷。在網(wǎng)絡(luò)2中,SM5.0是如果出現(xiàn)任何I/O錯誤,置為1,這里用SM5.0來觸發(fā)DTCH指令,也就是當(dāng)檢測到I/O錯誤時,禁止事件1的中斷。在網(wǎng)絡(luò)3中,是用SM5.0來驅(qū)動DISI,也就是當(dāng)檢測到I/O錯誤時,禁止所有中斷。而后面的那個網(wǎng)絡(luò)1是屬于中斷程序,這條指令的意思是當(dāng)檢測到I/O錯誤時,從中斷服務(wù)程序中返回。
下面我們看一個定時中斷的程序。
以上的程序就是用到了定時中斷,在第一個網(wǎng)絡(luò)中,首先是SM0.1首次掃描,傳送200到特殊標(biāo)志位SMB34,因為定時中斷0的特殊標(biāo)志位是SBM34,然后是建立中斷號0和中斷事件10的中斷連接,這里也就是設(shè)置定時中斷0的時間間隔為200ms并連接INT_0到事件10,然后全局允許中斷。后面的這個網(wǎng)絡(luò)是中斷程序,對VW100進行加1操作,也就是說每100ms VW100加1。
那么以上就是對中斷的一些基本使用。
【跟著我一起來學(xué)習(xí)s7-200】37中斷的應(yīng)用
前面我們學(xué)習(xí)了中斷的基本概念以及中斷的使用,那么今天就做一些對中斷的應(yīng)用。下面就以例子的形式講一下應(yīng)用。
1、利用中斷做8燈的亮與滅
主程序:
INT_0:
INT_1:
以上程序中的事件號0和2分別代表的是I0.0上升沿中斷和I0.1的上升沿中斷,與0號事件建立的中斷是INT_0,與2號事件建立的中斷是INT_1,在INT_0中是傳送255到QB0中,而在INT_1中是傳送0到QB0中。這樣當(dāng)I0.0的上升沿接通時,那么8燈亮,當(dāng)I0.1的上升沿接通時,那么8燈滅。
2、利用定時器中斷制作高精度定時,顯示時分秒
主程序:
中斷程序:
以上的程序,在主程序中,首先是SM0.1首次掃描,傳送1到特殊標(biāo)志位SMB34,因為定時中斷0的特殊標(biāo)志位是SBM34,然后是建立中斷號INT_0和中斷事件10的中斷連接,這里也就是設(shè)置定時中斷0的時間間隔為1ms并連接INT_0到事件10,然后全局允許中斷,此外,還對VW0進行清零。在中斷程序中首先是進行VW0的加1操作,這里也就是每中斷一次加1進行累加。直到VW0大于等于1000,也就是1s時,做一個對VW2的加1操作,那么這里VW2計的就是秒,當(dāng)VW0大于等于1000時同時對VW0清零進行。直到累加到VW2大于等于60時,做一個對VW4的加1操作,那么這里VW4計的就是分,當(dāng)VW0大于等于60時同時對VW2清零,直到累加到VW4大于等于60時,做一個對VW6的加1操作,那么這里VW6計的就是時,當(dāng)VW0大于等于60時同時對VW4清零。那么這樣就實現(xiàn)了利用定時器中斷制作高精度定時,顯示時分秒的功能。
【跟著我一起來學(xué)習(xí)s7-200】38子程序
子程序,它是備用程序,是調(diào)用才執(zhí)行的,它的作用主要是優(yōu)化程序結(jié)構(gòu),節(jié)約PLC資源。
在我們的編程軟件里面,是默認提供了一個空的子程序SBR_0的,我們還可以創(chuàng)建子程序,在程序編輯區(qū)單擊右鍵,選擇“插入-子程序”就可以了。插入的此程序會從0開始遞增生成,我們要注意的是對于CPU226XM,為SBR_0-SBR_127,對于其余的CPU,為SBR_0-SBR_63。
說到調(diào)用子程序,我們的主程序、子程序、中斷程序都可以調(diào)用子程序。要調(diào)用子程序的時候,我們只需要在指令列表中的“調(diào)用子程序”文件夾里找到子程序,把它拖拽出來就可以了。如果子程序的局部變量表是有定義參數(shù)的,在調(diào)用了子程序后修改了局部變量表的話,那么調(diào)用指令是無效的,這樣只能重新調(diào)用子程序。
對于子程序的調(diào)用,我們可以分為帶參數(shù)的子程序調(diào)用和不帶參數(shù)的子程序調(diào)用這兩種。不帶參數(shù)的子程序調(diào)用的特點有幾個,第一是直接在子程序中利用絕對地址進行編程,第二是子程序功能塊是沒有接口的,第三是不帶參數(shù)的子程序只能調(diào)用一次,這個我們要注意一下,不然會出現(xiàn)雙線圈的錯誤,第四是當(dāng)跳出子程序時要對內(nèi)部狀態(tài)復(fù)位或清零。
以下就是不帶參數(shù)子程序調(diào)用的使用的例子。我們可以看到在子程序中利用的是絕對地址的,并且是沒有定義接口的。
而帶參數(shù)的子程序調(diào)用是要對局部變量表定義參數(shù)的,變量的地址也是有范圍的,為LB0-LB31、LW0-LW30、LD0-LD28。子程序的局部變量表中是有IN、OUT、IN_OUT接口的,IN是把外面的數(shù)據(jù)傳到內(nèi)部,OUT是把內(nèi)部的數(shù)據(jù)傳到外部,IN_OUT是把外部的數(shù)據(jù)傳到內(nèi)部,再經(jīng)過運算后再把數(shù)據(jù)傳到外部。還有TEMP臨時變量,TEMP是用于中間運算的,我們要注意的是它是要先賦值后使用的。子程序中凡是運算的中間過程我們都可以用累加器AC0-AC3,它的使用是沒有限制的。還有就是帶參數(shù)的子程序可以多次被調(diào)用,在每次調(diào)用時可以對不同的變量、數(shù)據(jù)進行相同的運算或操作。
以下就是帶參數(shù)子程序調(diào)用的使用的例子。我們可以看到我們在子程序的局部變量表里是有定義接口的,定義了3個變量DW1、DW2和SUM,這些變量就是子程序的參數(shù)。我們要注意的是子程序的參數(shù)是形式參數(shù),這些參數(shù)在調(diào)用子程序時是被實際的數(shù)據(jù)替代的。我們看到在變量符號前面有個“#”號,這就是表示這個變量是局部變量。
還有一個我們要注意的是,子程序在調(diào)用執(zhí)行中,調(diào)用條件突然斷開的話,所有狀態(tài)會保持當(dāng)前狀態(tài),100ms定時器會暫停計時,1ms和10ms定時器則不受掃描周期控制,會繼續(xù)計時。
【跟著我一起來學(xué)習(xí)s7-200】39子程序的應(yīng)用
1、不帶參數(shù)的子程序調(diào)用
主程序:
自動模式子程序:
手動模式子程序:
維護模式子程序:
以上的程序為不帶參數(shù)的子程序調(diào)用做手動自動維護模式控制的示例程序,I0.7為控制自動模式,I1.0為控制手動模式,I1.1為控制維護模式,三種模式都是設(shè)置了互鎖的,當(dāng)I0.7接通,則調(diào)用自動模式子程序,執(zhí)行自動模式的程序,在I0.7的下降沿將0傳送至QB0進行清零。同樣,對于手動模式和維護模式的控制也是同樣道理。注意在這里各個模式的子程序只是做了個起保停程序,里面的程序可以按自己的要求更改。
2、不帶參數(shù)的子程序調(diào)用
主程序:
自動模式子程序:
手動模式子程序:
以上的的程序為不帶參數(shù)的子程序調(diào)用做手動自動模式控制的程序,這里是用了單按鈕控制啟停的方法,單按鈕控制中用的是置位優(yōu)先SR,按一下I0.7,M0.0接通,從而進入自動模式,再按一下I0.7,M0.0斷開,在M0.0的下降沿對QB0和定時器T37進行清零和復(fù)位。當(dāng)M0.0斷開時,是進入手動模式的。
3、帶參數(shù)的子程序調(diào)用
主程序:
一號電機管理子程序:
起保停子程序:
以上的程序為帶參數(shù)的子程序調(diào)用的示例程序,首先做了一個起保停子程序,在子程序里是一個電動機運行,延時設(shè)定時間報警的程序,具有記錄當(dāng)前時間的功能,除此之外,還有個點動控制。我們看到在子程序的局部變量表里是定義了參數(shù)的,啟動L0.0、停止L0.1、運行L0.2、點動L0.3、點動運行L0.4、設(shè)定時間LW1、當(dāng)前時間LW3、報警L5.0。還做了一個一號電機管理子程序,子程序中是SM0.0調(diào)用起保停程序。最后是在主程序中SM0.0調(diào)用這個一號電機管理子程序。所以這個程序中就是主程序調(diào)用1號電機管理子程序,而1號電機管理子程序又調(diào)用了起保停程序,那么這就是子程序的嵌套調(diào)用。
【跟著我一起來學(xué)習(xí)s7-200】40高速計數(shù)器
高速計數(shù)器經(jīng)常被用于距離檢測,用于電機轉(zhuǎn)數(shù)檢測,高速計數(shù)器也是一個比較重要的內(nèi)容,也是比較常會用到的,我們要掌握一下的,那么今天就先對高速計數(shù)器的基本內(nèi)容做個了解。
高速計數(shù)器可以對CPU掃描速度無法控制的高速事件進行計數(shù),簡單的說就是對高速輸入輸出信號進行計數(shù)。S7-200 CPU內(nèi)置最多只有6個高速計數(shù)器HSC0~HSC5,其中PLC221及PLC222不支持HSC1及HSC2,這里我們要注意一下。高速計數(shù)器是有專用輸入的,具體的可以參考下表。我們要注意的是同一個輸入是不能用于不同的功能的,比如說I0.0,它既可以是普通輸入,也可以是中斷輸入,也可以是高速輸入,這三個功能只能選擇其中一個,也就是說要是I0.0作為了高速輸入用,就不能作為普通輸入或中斷輸入用。
高速計數(shù)器大體可以分為四種,第一種是帶內(nèi)部方向控制的單相計數(shù)器,這種計數(shù)器只有一個計數(shù)輸入端,其控制計數(shù)方向由內(nèi)部繼電器控制,工作模式為模式0、1、2。第二種是帶外部方向控制的單相計數(shù)器,這種計數(shù)器也是只有一個計數(shù)輸入端,但是是由外部輸入控制其計數(shù)方向的,工作模式為模式3、4、5。第三種計數(shù)器是具有兩個時鐘輸入的雙向計數(shù)器,這種計數(shù)器有兩個計數(shù)輸入端,一個增計數(shù)輸入端,一個減計數(shù)輸入端,工作模式為模式6、7、8。第四種計數(shù)器是A/B相正交計數(shù)器。這種計數(shù)器有兩個時鐘脈沖輸入端,一個輸入端叫A相,一個輸端叫B相。當(dāng)A相時鐘脈沖超前B相時鐘脈沖時,計數(shù)器進行增計數(shù)。當(dāng)A相時鐘脈沖滯后B相時鐘脈沖時,計數(shù)器進行減計數(shù)。這種計數(shù)器的工作模式為模式9、10、11。我們可以看到下表,里面的的HSC模式有0,-12,其中模式0-11是用于接收外部輸入信號的,模式12是用于Q0.0、Q0.1輸出計數(shù)的。
下面我們再看一這個表格應(yīng)該怎么去看,這里的HSC0的專用輸入為I0.0、 I0.1、I0.2,假如我們就用HSC0,并且選擇的是模式3,那么I0.0就是脈沖輸入端,I0.1就是方向控制端。這里的HSC1的專用輸入為I0.6、I0.7、I1.0、I1.1,假如我們就用HSC1,并且選擇的是模式11,那么I0.6就是A相脈沖輸入端,I0.7就是B相脈沖輸入斷,I1.0是復(fù)位端,I01.1是啟動端。
下面我們再看一下高速計數(shù)器的控制字節(jié),每一個高速計數(shù)器都有一個控制字節(jié),該字節(jié)的每一位都反映了這個計數(shù)器的工作狀態(tài),下表就是對應(yīng)的控制位表。HSC0、HSC1、HSC2、HSC4 這四個計數(shù)器的三個控制位bit0、bit1、bit2,是分別用來復(fù)原和啟動的控制和選擇1x或4x速率計數(shù)模式,我們要注意的是這三個位只在執(zhí)行HEDF指令中時才使用。
對于其他位,bit7位為使能,我們一般默認是啟用HSC,為1的,bit6位為是否更新當(dāng)前值,這里可以為1可以為0,bit5位為是否更新設(shè)定值,我們一般默認是更新設(shè)定值,為1的,bit4位為是否更新方向,我們一般也默認為更新方向,為1的,bit3位為計數(shù)方向控制,1是加計數(shù),0是減計數(shù),所以是可以為1可以為0的。
因為一般來說bit6和bit3是可以為1可以為0,其他位一般默認為1,那么這8個位就有四種組合,分別為11111000,11110000,10111000,10110000,那么把二進制數(shù)轉(zhuǎn)換成16進制數(shù)為16#F8、16#F0、16#B8、16#B0,16#F8為更新當(dāng)前值加計數(shù),16#F0為更新當(dāng)前值減計數(shù),16#B8為不更新當(dāng)前值加計數(shù),16#B0為不更新當(dāng)前值減計數(shù)。這樣我們在定義控制字節(jié)時可以直接利用16#F8、16#F0、16#B8、16#B0這四個值。
除了定義控制字節(jié),我們還要設(shè)置初始值和預(yù)設(shè)值。每個高速計數(shù)器都有一個32位初始值和一個32位預(yù)設(shè)值,如果我們要向高速計數(shù)器載入新初始值和預(yù)設(shè)值,我們必須設(shè)置初始值和預(yù)設(shè)值的特殊內(nèi)存字節(jié),然后執(zhí)行HSC指令,才能將新數(shù)值寫入到高速計數(shù)器中,這是我們要注意的。
那么我們使用高速計數(shù)器是有個流程的,第一,定義控制字節(jié);第二,是否有初始值,有要設(shè)置初始值的特殊內(nèi)存字節(jié);第三,是否有預(yù)設(shè)值,有要設(shè)置預(yù)設(shè)值的特殊內(nèi)存字節(jié);第四,定義高速計數(shù)模式和選擇高速計數(shù)器;第五,激活高速計數(shù)器。我們要注意的是我們在使用高速計數(shù)器時,只需要接通一個掃描周期就可以了。
【跟著我一起來學(xué)習(xí)s7-200】41高速計數(shù)器的使用
前面學(xué)習(xí)了高速計數(shù)器的基本內(nèi)容,包括了解高速計數(shù)器和使用高速計數(shù)器的流程,那么今天就繼續(xù)學(xué)習(xí)一下高速計數(shù)器的其他內(nèi)容。
我們把高速計數(shù)器和前面學(xué)習(xí)的中斷結(jié)合在一起來學(xué)習(xí),對于這個指定中斷,我們要知道幾個要點的內(nèi)容,第一,所有計數(shù)器模式都支持在HSC的當(dāng)前值等于預(yù)設(shè)值時產(chǎn)生一個中斷事件;第二,使用外部復(fù)位端的計數(shù)模式支持外部復(fù)位中斷;第三,除了模式0、1、2之外,所有計數(shù)器模式支持計數(shù)方向改變中斷。我們在使用時要注意的是當(dāng)使用外部復(fù)位中斷時,不要寫入初始值,或者是在該中斷服務(wù)程序中禁止再允許高速計數(shù)器。
我們再看一下高速計數(shù)器的狀態(tài)字節(jié)。我們要知道每一個高速計數(shù)器都有一個狀態(tài)字節(jié),該字節(jié)的每一位都反映了這個計數(shù)器的工作狀態(tài)。這些狀態(tài)位表示當(dāng)前計數(shù)方向以及當(dāng)前值是否大于或等于預(yù)設(shè)值。我們要注意的是只有在執(zhí)行中斷服務(wù)程序時,狀態(tài)位才有效。下面就附上高速計數(shù)器的狀態(tài)位表。
下面我們就看一下HSC指令的使用。
以上程序中,首次掃描首先傳送16#F8到SMB47定義控制字節(jié),然后執(zhí)行HEDF指令定義高速計數(shù)模式和選擇高速計數(shù)器,然后是寫入初始值和預(yù)設(shè)值,然后是ATCH連接中斷程序0和中斷事件號13,那么就是為計數(shù)器當(dāng)前值CV等于預(yù)設(shè)值PV連接中斷,然后是一個ATCH連接中斷程序1和中斷事件號14,那么就是連接計數(shù)器方向改變中斷,然后又是一個ATCH連接中斷程序2和中斷事件號15,那么就是連接計數(shù)器外部復(fù)位中斷,建立連接中斷后要允許全局中斷,執(zhí)行ENI指令,最后是激活高速計數(shù)器,執(zhí)行HSC指令。
那么以上是用HSC指令來編程這個高速計數(shù)器的程序,除此之外,我們還可以用向?qū)砩筛咚儆嫈?shù)器程序。
高速計數(shù)器向?qū)Э梢詮牟藛螜诘摹肮ぞ?指令向?qū)А崩锩娲蜷_,彈出指令向?qū)υ捒蚝?,我們選擇“HSC”再點擊下一步就可以了。
出現(xiàn)“HSC指令向?qū)А焙?,我們可以選擇配置哪個計數(shù)器和選擇哪個模式,這里我們選擇HC1和模式5,然后點擊下一步。
選擇計數(shù)器和模式之后,我們可以設(shè)置計數(shù)器的預(yù)置值、初始值和計數(shù)方向等,這里我們寫入預(yù)設(shè)值為100,其他保持默認,然后點擊下一步。
然后我們可以配置中斷事件和編程步數(shù),在這里配置的中斷事件不是必須的,我們可以根據(jù)自己的要求來選擇使用,我們要注意的是一個高速計數(shù)器最多只能有3個中斷事件。
對于當(dāng)前值等于預(yù)置值時產(chǎn)生的中斷,我們還可以寫入新的預(yù)置值和當(dāng)前值,我們可以定義高速計數(shù)器每一步的操作。定義好之后,點擊下一步,就會完成向?qū)梢粋€子程序HSC_INT。
使用時我們在主程序塊中使用SM0.1或邊沿觸發(fā)指令調(diào)用這個子程序就可以了。
主程序:
HSC_INIT子程序:
那么以上就是高速計數(shù)器的內(nèi)容,在后面我們再以程序案例的形式來學(xué)習(xí)一下高速計數(shù)器的應(yīng)用。
【跟著我一起來學(xué)習(xí)s7-200】42高速計數(shù)器的簡單應(yīng)用
前面我們學(xué)習(xí)了高速計數(shù)器的基本內(nèi)容和使用,那么今天我們就以幾個較簡單的程序案例來學(xué)習(xí)一下高速計數(shù)器的應(yīng)用。
1、當(dāng)高速計數(shù)器的計數(shù)值大于某設(shè)定值時輸出Q0.0
主程序:
子程序:
以上的程序中,我們做了一個高速計數(shù)器初始化的子程序,定義的是高速計數(shù)器HSC0和HSC模式1,同樣是前面學(xué)習(xí)高速計數(shù)器使用時的一般步驟,定義控制字節(jié),寫入初始值和預(yù)設(shè)值,定義高速計數(shù)模式和選擇高速計數(shù)器,激活高速計數(shù)器。這里我們用的是數(shù)據(jù)存儲區(qū)VB10、VD0、VD4,這樣就比較方便,我們在監(jiān)控時可以在狀態(tài)表里面進行修改數(shù)據(jù)。在主程序中,用I0.7的上升沿調(diào)用高速計數(shù)器初始化子程序,并編寫控制程序,用一個比較指令比較高速計數(shù)器計數(shù)值和設(shè)定值,然后輸出Q0.0。那么當(dāng)我們接通I0.7時就初始化高速計數(shù)器,因為HSC0和模式1對應(yīng)的脈沖輸入斷是I0.0,那么當(dāng)我們接通I0.0時就進行高速脈沖計數(shù),當(dāng)計數(shù)值大于等于設(shè)定值時,Q0.0就接通。
2、高速計數(shù)器中斷小程序
主程序:
子程序:
中斷程序:
以上的程序中,同樣也做了一個高速計數(shù)器初始化的子程序,定義的是高速計數(shù)器HSC0和HSC模式1,除了定義控制字節(jié),寫入初始值和預(yù)設(shè)值,定義高速計數(shù)模式和選擇高速計數(shù)器,激活高速計數(shù)器之外,還做了高速計數(shù)器中斷,連接了中斷程序0和中斷事件12,并全局允許中斷。在主程序中,用I0.7的上升沿調(diào)用高速計數(shù)器初始化子程序,那么當(dāng)我們接通I0.7時就初始化高速計數(shù)器,因為HSC0和模式1對應(yīng)的脈沖輸入斷是I0.0,那么當(dāng)我們接通I0.0時就進行高速脈沖計數(shù)。我們可以在VD里面寫入預(yù)設(shè)值,當(dāng)計數(shù)當(dāng)前值等于預(yù)設(shè)值時,就進入中斷程序0進行執(zhí)行,Q0.2就接通,然后又進行高速計數(shù)器初始化。
那么這就是較簡單的高速計數(shù)器的應(yīng)用,那么后面我們再做幾個復(fù)雜一些的應(yīng)用。
【跟著我一起來學(xué)習(xí)s7-200】43高速計數(shù)器的實際應(yīng)用
前面以幾個較簡單的程序案例學(xué)習(xí)了一下高速計數(shù)器的應(yīng)用,那么今天就做幾個較復(fù)雜一些的程序案例,提高一下對高速計數(shù)器的應(yīng)用。
1、用編碼器測量電機轉(zhuǎn)速與頻率
主程序:
子程序:
中斷程序:
以上的程序中,在主程序中,用I0.7的上升沿調(diào)用高速計數(shù)器初始化子程序,然后做一個高速計數(shù)器初始化的子程序,首先是定義控制字節(jié),送16#F8到SMB37,定義為加計數(shù)更新當(dāng)前值,這里沒有寫入初始值和預(yù)設(shè)值,定義的是高速計數(shù)器HSC0和HSC模式1,然后激活高速計數(shù)器,還做了高速計數(shù)器中斷,我們設(shè)置定時中斷0的時間間隔為100ms,因為SMB34的定時中斷0為中斷事件號10,我們建立中斷程序0和中斷事件10的中斷連接,并全局允許中斷。
然后再看一下中斷程序,因為是100ms的定時中斷,每100ms執(zhí)行一次中斷程序。我們就用100ms計算的脈沖個數(shù),再乘以600化成1分鐘的脈沖個數(shù),再除于分辨率就是等于轉(zhuǎn)速,程序中的500就是編碼器的分辨率。而對于編碼器的頻率的計算,我們有這樣一個公式,頻率/工頻50Hz=轉(zhuǎn)速/工頻下的轉(zhuǎn)速,所以頻率=(轉(zhuǎn)速/工頻下的轉(zhuǎn)速)*工頻50Hz,這里我們先把雙整數(shù)的轉(zhuǎn)速轉(zhuǎn)換成實數(shù),再除以工頻下的轉(zhuǎn)速1488.0,再乘以工頻50.0Hz,那么就得到了編碼器的頻率了。
2、用編碼器測量機床位置,不論機床朝正方向移動或朝反方向移動,都能知道機床的當(dāng)前位置,有一原點位置感應(yīng)開關(guān)I0.7,當(dāng)原點位置感應(yīng)開關(guān)接通時,機床的當(dāng)前位置為0。假設(shè)編碼器的分辨率為1024,絲桿的進給量即轉(zhuǎn)1圈移動的位置為10,計算公式是當(dāng)前值除以分辨率,再乘于進給量。
主程序:
子程序:
以上的程序中,首先做一個高速計數(shù)器初始化的子程序,首先是定義控制字節(jié),送16#F8到SMB37,定義為加計數(shù)更新當(dāng)前值,這里沒有寫入初始值和預(yù)設(shè)值,定義的是高速計數(shù)器HSC0和HSC模式1,然后激活高速計數(shù)器。
在主程序中,用I0.7的上升沿調(diào)用高速計數(shù)器初始化子程序。然后是做機床朝正方向移動的控制,做個起保停程序,當(dāng)I0.3接通時,Q0.0接通并自鎖,在Q0.0接通的上升沿傳送16#B8到SMB37(加計數(shù)不更新當(dāng)前值),同時激活高速計數(shù)器。然后是做機床朝反方向移動的控制,做個起保停程序,當(dāng)I0.4接通時,Q0.1接通并自鎖,在Q0.1接通的上升沿傳送16#B0到SMB37(減計數(shù)不更新當(dāng)前值),同時激活高速計數(shù)器。
后面還做了一個用SM0.1常閉觸點的上升沿來調(diào)用高速計數(shù)器初始化的子程序,并且用SM0.1的常開觸點來驅(qū)動傳送指令傳送VD1000的值到SMD38,用SM0.1的常閉觸點來驅(qū)動傳送指令傳送HC0的值到VD1000,這里是為了實現(xiàn)停電保持功能。PLC從STOP撥向RUN時,在第一個掃描周期之后會傳送HC0的計數(shù)值到VD1000里面進行存儲,當(dāng)PLC斷電后再從STOP撥向RUN時,SM0.1接通一個掃描周期,把VD1000存儲的計數(shù)器傳到到SMB38,那么當(dāng)前值就是存儲在VD1000里面的值。然后再做一個計算,把雙整數(shù)HC0的當(dāng)前值轉(zhuǎn)換成實數(shù),再進行HC0的當(dāng)前值除以分辨率1024.0,再乘于進給量10.0,這樣就可以測量出機床位置。
那么這就是一些復(fù)雜些的高速計數(shù)器的應(yīng)用,比較詳細的講了一下,可以理解嗎?
【跟著我一起來學(xué)習(xí)s7-200】44高速計數(shù)器的實際應(yīng)用2
前面做了好幾個高速計數(shù)器的實際應(yīng)用,那么今天再看一個程序案例應(yīng)用吧,對這個案例,我們以兩種方法來實現(xiàn)它。通過這些對高速計數(shù)器應(yīng)用的練習(xí),來更好的掌握高速計數(shù)器的內(nèi)容。
1、用比較指令來實現(xiàn)正反轉(zhuǎn)控制,按下啟動按鈕I0.3,Q0.0輸出,電機正轉(zhuǎn),高速計數(shù)器計到50個脈沖后電機停止,過5秒后Q0.1輸出,電機反轉(zhuǎn),計數(shù)器計到50個脈沖后電機停止,過5s后又開始電機的正轉(zhuǎn),如此循環(huán)。
主程序:
子程序:
以上的程序中,首先做一個高速計數(shù)器初始化的子程序,首先是定義控制字節(jié),送16#F8到SMB37,定義為加計數(shù)更新當(dāng)前值,這里寫入初始值為0和預(yù)設(shè)值為50,定義的是高速計數(shù)器HSC0和HSC模式1,然后激活高速計數(shù)器。
因為控制要求是按下啟動按鈕I0.3,Q0.0輸出,電機正轉(zhuǎn)。首先就做個起保停程序,I0.3啟動串聯(lián)I0.4停止,來驅(qū)動輸出Q0.0并做Q0.0的自鎖,同時做一個用I0.3的上升沿來調(diào)用高速計數(shù)器初始化子程序,注意這里的起保停是有做正反轉(zhuǎn)的互鎖的。然后再用Q0.0常開觸點串聯(lián)一個HC0大于等于SMD42的比較指令來輸出M0.0,并把M0.0的常閉觸點串聯(lián)在起保停程序中,作為高速計數(shù)器計到50個脈沖后電機停止。
電機停止過5秒后Q0.1輸出,電機反轉(zhuǎn),那么我們就用M0.0來置位M0.1,再用M0.1常開觸點來驅(qū)動來驅(qū)動定時器T37延時5秒,并用T37常開觸點來驅(qū)動復(fù)位M0.1,這里是為了讓定時器定時時間到時復(fù)位定時器。然后再用T37常開觸點來驅(qū)動輸出Q0.1并做Q0.1的自鎖,同時也用T37的上升沿來調(diào)用高速計數(shù)器初始子程序。然后再用Q0.1常開觸點串聯(lián)一個HC0大于等于SMD42的比較指令來輸出M0.2,并把M0.2的常閉觸點串聯(lián)在起保停程序中,作為高速計數(shù)器計到50個脈沖后電機停止。
電機停止過5s后又開始電機的正轉(zhuǎn),那么我們就用M0.2來置位M0.3,再用M0.3常開觸點來驅(qū)動來驅(qū)動定時器T38延時5秒,并用T38常開觸點來驅(qū)動復(fù)位M0.3,這里也是為了讓定時器定時時間到時復(fù)位定時器。同時我們用T38常開觸點并聯(lián)在電機正轉(zhuǎn)的控制程序上,這樣可以實現(xiàn)循環(huán)。
2、用中斷來實現(xiàn)正反轉(zhuǎn)控制,按下啟動按鈕I0.3,Q0.0輸出,電機正轉(zhuǎn),高速計數(shù)器計到50個脈沖后電機停止,過5秒后Q0.1輸出,電機反轉(zhuǎn),計數(shù)器計到50個脈沖后電機停止,過5s后又開始電機的正轉(zhuǎn),如此循環(huán)。
主程序:
子程序:
中斷程序:
以上的程序中,首先做一個高速計數(shù)器初始化的子程序,首先是定義控制字節(jié),送16#F8到SMB37,定義為加計數(shù)更新當(dāng)前值,這里寫入初始值為0和預(yù)設(shè)值為50,定義的是高速計數(shù)器HSC0和HSC模式1,然后激活高速計數(shù)器,還做了高速計數(shù)器中斷,建立中斷程序0和中斷事件12的中斷連接,并全局允許中斷。
在主程序中,用SM0.1的上升沿調(diào)用高速計數(shù)器初始化子程序,因為控制要求是按下啟動按鈕I0.3,Q0.0輸出,電機正轉(zhuǎn),就用I0.3常開觸點來置位Q0.0,并用I0.3的上升沿激活高速計數(shù)器??刂七€要求當(dāng)高速計數(shù)器計到50個脈沖后電機停止,那么當(dāng)計數(shù)當(dāng)前值等于預(yù)設(shè)值50時就進入中斷程序去執(zhí)行,我們就可以在中斷程序中編寫用Q0.0常開觸點串聯(lián)Q0.1常閉觸點來復(fù)位Q0.0并置位M0.0,那么當(dāng)當(dāng)前值等于預(yù)設(shè)值時復(fù)位Q0.0電機停止,并置位M0.0,然后又回到主程序進行執(zhí)行。
電機停止過5秒后Q0.1輸出,電機反轉(zhuǎn),在主程序中用M0.0常開觸點驅(qū)動定時器T37延時5秒,并用T37常開觸點來復(fù)位M0.0復(fù)位定時器和置位Q0.1,并用T37的上升沿激活高速計數(shù)器。當(dāng)高速計數(shù)器計到50個脈沖后電機停止,那么當(dāng)計數(shù)當(dāng)前值等于預(yù)設(shè)值50時就進入中斷程序去執(zhí)行,我們就可以在中斷程序中編寫用Q0.1常開觸點串聯(lián)Q0.0常閉觸點來復(fù)位Q0.1并置位M0.2,那么當(dāng)當(dāng)前值等于預(yù)設(shè)值時復(fù)位Q0.1電機停止,并置位M0.2,然后又回到主程序進行執(zhí)行。
電機停止過5s后又開始電機的正轉(zhuǎn),那么我們就用M0.2來驅(qū)動來驅(qū)動定時器T38延時5秒,并用T38常開觸點來驅(qū)動復(fù)位M0.2,這里也是為了讓定時器定時時間到時復(fù)位定時器。同時我們用T38常開觸點并聯(lián)在電機正轉(zhuǎn)的控制程序上,這樣可以實現(xiàn)循環(huán)。
那么以上就是用了兩種方法來實現(xiàn)正反轉(zhuǎn)的控制,利用中斷的方法可能會難理解一下,但是其實分析清楚執(zhí)行過程也是不難的,對嗎。
【跟著我一起來學(xué)習(xí)s7-200】45高速脈沖輸出
前面學(xué)習(xí)了高速計數(shù)器的內(nèi)容,緊接著我們就來學(xué)習(xí)一下高速脈沖輸出的內(nèi)容,高速脈沖輸出一般是用在運動控制里面,用來控制步進或伺服,高速脈沖輸出也是比較重要的一部分,我們必須得掌握好它。
在S7-200中有兩個PTO/PWM高速脈沖發(fā)生器,可以產(chǎn)生高速脈沖串(PTO)或脈寬調(diào)制信號波形(PWM)。在S7-200中有脈沖輸出指令PLS,它用來控制在高速脈沖輸出(Q0.0和Q0.1)中提供的高速脈沖串輸出(PTO)和脈寬調(diào)制(PWM)功能。
PTO/PWM與數(shù)字量輸出過程映像區(qū)共用輸出點Q0.0和Q0.1,當(dāng)在Q0.0或Q0.1上激活了PTO/PWM功能時,是會禁止普通輸出點功能的,這時Q0.0或Q0.1的輸出波形是不受過程映像區(qū)狀態(tài)、輸出點強制值或者立即輸出指令的影響的,我們使用狀態(tài)表或趨勢圖是監(jiān)控不了的。
要做高速脈沖輸出,我們應(yīng)該選用24VDC晶體管輸出的CPU,而不能選用繼電器輸出的CPU,這是我們要注意的。高速脈沖輸出一般是用在運動控制里面,用來控制步進或伺服。利用高速脈沖輸出實現(xiàn)運動控制,除了有PTO、PWM,還有EM253定位模塊,這三種方式都可以實現(xiàn)運動控制,不過要注意的是PTO和PWM可以使用脈沖輸出指令PLS和向?qū)韺崿F(xiàn),而且PTO方式的甚至還可以使用運動控制庫指令來實現(xiàn),而使用EM253定位模塊的話就只能通過向?qū)韺崿F(xiàn),而不能使用PLS指令或運動控制庫指令。
我們先看一下脈沖串操作PTO,PTO是按照給定的脈沖個數(shù)和周期輸出一串方波(占空比50%)。在使用時,我們要設(shè)定其脈沖個數(shù)和周期,我們要注意的是設(shè)定是周期數(shù)應(yīng)該是偶數(shù),如果設(shè)定的周期數(shù)為奇數(shù)的話,是會引起占空比失真的。
而脈寬調(diào)制PWM,它是產(chǎn)生一個占空比變化周期固定的脈沖輸出的,我們可以設(shè)定其周期和脈寬,我們要注意的是當(dāng)設(shè)定的脈寬等于周期時,輸出是一直為ON的,當(dāng)設(shè)定的脈寬等于0時,輸出是斷開的。
一般來說,使用脈沖串PTO會比較多,所以后面學(xué)習(xí)時也是重點學(xué)習(xí)脈沖串PTO的。
【跟著我一起來學(xué)習(xí)s7-200】46脈沖輸出指令
前面簡單的介紹了一下高速脈沖輸出的內(nèi)容,包括脈沖串PTO和脈寬調(diào)制PWM的內(nèi)容等,那么今天就學(xué)習(xí)一下脈沖輸出指令PLS以及指令的應(yīng)用,并且主要針對脈沖串PTO的學(xué)習(xí),這是脈沖輸出學(xué)習(xí)的重點,我們必須要掌握好它。
前面有說到脈沖輸出指令PLS用于控制在高速脈沖輸出(Q0.0和Q0.1)中提供的脈沖串輸出PTO和脈寬調(diào)制PWM功能。在S7-200中有兩個PTO/PWM發(fā)生器,而每臺PTO/PWM發(fā)生器都有一個控制字節(jié)的,SMB67控制的是Q0.0的PTO/PWM發(fā)生器,而SMB77控制的是Q0.1的PTO/PWM發(fā)生器,這個我們要知道的。
脈沖輸出指令是會從系統(tǒng)存儲器SM(包括控制字節(jié))中讀取數(shù)據(jù),從而控制PTO/PWM發(fā)生器,這樣我們就可以通過修改控制字節(jié),然后執(zhí)行PLS指令,來更改PTO或PWM信號波形。以下就附上PTO/PWM控制寄存器的SM標(biāo)志表和PTO/PWM控制字節(jié)參考表。
我們要注意的是,我們在使用PLS指令時一般是有步驟的。第一步,我們在使能PTO/PWM之前,要對Q0.0、Q0.1的過程映像區(qū)清零;第二步,定義控制字節(jié),Q0.0對應(yīng)SMB67,Q0.1對應(yīng)SMB77。第三步,寫入PTO/PWM相關(guān)寄存器的數(shù)據(jù),比如SMW68對應(yīng)的是PTO/PWM周期值(2-65525ms),SMD72對應(yīng)的是PTO脈沖計數(shù)值。第四步,就是連接中斷事件和中斷程序,并允許中斷這步是根據(jù)實際情況決定要還是不要的;第五步,執(zhí)行PLS指令,激活某個脈沖輸出,更新控制字節(jié)。
當(dāng)然我們也可以禁止PTO/PWM波形,我們將控制字節(jié)的使能位(SMB67.7/SMB77.7)清零,然后執(zhí)行PLS指令就可以了。我們也可以對周期值、脈寬值和脈沖數(shù)進行修改,我們把相應(yīng)的系統(tǒng)存儲器位置1,然后再把修改數(shù)據(jù)寫入到相應(yīng)的系統(tǒng)存儲器里,然后執(zhí)行PLS指令就可以。
下面就舉個PLS指令應(yīng)用的例子,來更好的掌握PLS指令的使用。
主程序:
高速脈沖輸出子程序:
高速計數(shù)器子程序:
以上的程序,在主程序的網(wǎng)絡(luò)一中,首先用SM0.1首次掃描驅(qū)動高速計數(shù)器子程序進行高速計數(shù)初始化,同時對Q0.0的過程映像區(qū)清零。在高速計數(shù)器子程序中,首先傳送16#F8到SMB47定義控制字節(jié)定義為更新當(dāng)前值加計數(shù),然后執(zhí)行HEDF指令定義高速計數(shù)模式12和選擇高速計數(shù)器0,最后是激活高速計數(shù)器,執(zhí)行HSC指令。
在主程序的網(wǎng)絡(luò)二中,用I0.2的上升沿才驅(qū)動高速脈沖輸出子程序,用I0.2的下降沿來驅(qū)動一個傳送指令,傳送0到SMB67,并同時驅(qū)動一個PLS指令。在高速脈沖輸出子程序中,首先傳送16#85到SMB67中定義控制字節(jié),這里選擇的是PTO模式、單段、1us/周期、裝入周期和脈沖數(shù)的情況(控制字節(jié)的定義可以參考PTO/PWM控制字節(jié)表),并傳送100到SMW68中寫入周期值,傳送100到SMD72中寫入脈沖數(shù),最后執(zhí)行PLS指令。
那么程序會在I0.2接通的上升沿執(zhí)行周期為100us,100個脈沖數(shù)的高速脈沖輸出,會在I0.2斷開的下降沿禁止PTO波形的輸出。
那么以這樣一個小例子來講脈沖輸出指令PLS指令的使用,是不是更容易理解一些呢,你可以對照著來學(xué)習(xí)。
【跟著我一起來學(xué)習(xí)s7-200】47脈沖輸出指令2
前面學(xué)習(xí)了脈沖輸出指令的使用,那么今天還是繼續(xù)學(xué)習(xí)一下脈沖輸出指令的使用與應(yīng)用。
通過上次的學(xué)習(xí),我們應(yīng)該已經(jīng)知道可以通過修改SM存儲區(qū)(包括控制字節(jié)),然后執(zhí)行PLS指令來改變PTO或PWM波形。除了前面學(xué)習(xí)的使用步驟和一些使用要點,我們還要知道的就是PTO狀態(tài)字節(jié)的空閑位(SM66.7或SM76.7),它標(biāo)志著脈沖輸出完成。另外,在脈沖輸出完成時,我們還可以利用脈沖發(fā)送完成中斷,使程序跳轉(zhuǎn)到中斷服務(wù)程序進行執(zhí)行。那么就補充這幾點內(nèi)容。
下面我們做利用一個脈沖輸出指令做電機正反轉(zhuǎn)控制的例子。
主程序:
高速計數(shù)器子程序:
高速脈沖輸出子程序:
中斷程序:
我們首先先做一個高速計數(shù)子程序和脈沖輸出子程序,在高速計數(shù)器子程序中,首先是定義控制字節(jié),送16#F8到SMB37,定義為加計數(shù)更新當(dāng)前值,傳送0到SMD38寫入初始值,定義的是高速計數(shù)器HSC0和HSC模式12,然后激活高速計數(shù)器,還做了高速計數(shù)器中斷,PTO0完成中斷的事件為中斷事件號19,我們建立中斷程序0和中斷事件19的中斷連接,并全局允許中斷。
而在高速脈沖輸出子程序里面,我們定義一下接口,定義周期io_time為LW0,為IN類型的,定義脈沖數(shù)io_NO為LD2,也是為IN類型的,然后寫子程序。首先傳送16#85到SMB67中定義控制字節(jié),這里選擇的是PTO模式、單段、1us/周期、裝入周期和脈沖數(shù)的情況(控制字節(jié)的定義可以參考PTO/PWM控制字節(jié)表),并傳送LW0到SMW68中寫入周期值,傳送LD2到SMD72中寫入脈沖數(shù),最后執(zhí)行PLS指令。那么這樣是做了一個帶功能參數(shù)的子程序,之后在主程序中可以對這個帶功能參數(shù)的子程序進行調(diào)用。
然后我們編寫主程序,在主程序的網(wǎng)絡(luò)一中,首先用SM0.1首次掃描驅(qū)動高速計數(shù)器子程序進行高速計數(shù)初始化,同時對Q0.0的過程映像區(qū)清零,同時也對高速脈沖輸出進行初始化。在網(wǎng)絡(luò)中,我們用I0.2的上升沿來驅(qū)動立即置位指令,立即置位Q0.2,同時調(diào)用高速脈沖輸出子程序,周期設(shè)為100us,脈沖為10000個,同時還要傳送16#F8到SMB37并執(zhí)行HSC指令進行加計數(shù)并更新當(dāng)前值。那么就就是說當(dāng)我們接通I0.2時,會在I0.2的上升沿立即置位Q0.2,電機正轉(zhuǎn),100us發(fā)10000個脈沖,同時高速計數(shù)器進行加計數(shù)。因為建立了脈沖完成中斷,那么當(dāng)脈沖發(fā)生完成時,會進入到中斷程序進行執(zhí)行。
那么我們就可以在中斷程序中編寫反轉(zhuǎn)的控制,因為原來是正轉(zhuǎn),那么Q0.2是接通的,那么我們就用Q0.2的常開觸點來驅(qū)動立即復(fù)位指令,立即復(fù)位Q0.2,同時調(diào)用高速脈沖輸出子程序,周期設(shè)為200us,脈沖為10000個,同時還要傳送16#B0到SMB67并執(zhí)行HSC指令進行減計數(shù)并不更新當(dāng)前值。那么就是說進入中斷時會立即復(fù)位Q0.2,電機反轉(zhuǎn),200us發(fā)10000個脈沖,同時高速計數(shù)器進行減計數(shù)。
那么對于這樣一個例子會不會比較難以理解呢,如果覺得有些模糊的話,可以回看一下前面中斷和高速計數(shù)器的內(nèi)容,這樣可以加深印象呢。