經(jīng)常有人問(wèn),這個(gè)PLC有沒(méi)有某某指令,或者,有沒(méi)有指令可以實(shí)現(xiàn)這樣那樣的功能?
產(chǎn)生這樣的疑問(wèn),部分原因是不熟悉這款PLC的指令。部分原因是為了選型,想找到一種PLC能夠內(nèi)置一些功能,使得自己的編程得到簡(jiǎn)化。甚至有一些人認(rèn)為,PLC沒(méi)有這個(gè)指令就是沒(méi)有這個(gè)功能,不能完成某個(gè)任務(wù)。如果指令能自己做,那就沒(méi)有這個(gè)問(wèn)題了。那我們就試著自己做自己需要的指令。
本系列文章圍繞S7-200 SMART PLC為中心,講解如何編寫自己需要的指令,編程語(yǔ)言主要以梯形圖的方式為主。
第一篇 預(yù)備知識(shí)
一, 掃描
梯形圖的所有指令一般遵循掃描原則進(jìn)行執(zhí)行。執(zhí)行一個(gè)完整的程序,過(guò)程中由于掃描有先后次序,所以必然在一個(gè)瞬間只能執(zhí)行一個(gè)指令。那么當(dāng)掃描到程序中間的時(shí)候,程序前部分的程序先獲得掃描并執(zhí)行過(guò),執(zhí)行的結(jié)果將已經(jīng)產(chǎn)生影響。后面部分的程序未曾執(zhí)行,將來(lái)的執(zhí)行當(dāng)中所有條件將以最新的形態(tài)執(zhí)行。
首先來(lái)看一個(gè)例子。如圖1所示。
圖1程序
從I0.0 = False(0)之后的某個(gè)掃描周期開始看看掃描的過(guò)程。此時(shí),所有變量都沒(méi)有接通。
當(dāng)有一個(gè)掃描周期I0.0 = True(1)的時(shí)候,并且方框處的程序剛剛處理完的時(shí)刻,第一段的Q0.0顯然跟以前的掃描一樣,不接通。而此時(shí)此刻的M0.0已經(jīng)接通,它將開始影響以后程序的執(zhí)行。然后在這個(gè)掃描周期結(jié)束的時(shí)候Q0.1將接通了,但是Q0.0卻沒(méi)有接通。
下一個(gè)周期開始,掃描第一個(gè)M0.0觸點(diǎn)的時(shí)候,此時(shí)的M0.0才開始影響第一行程序。
所以,掃描到并執(zhí)行出的結(jié)果是影響往后的所有掃描的。并沒(méi)有掃描周期之分。所有執(zhí)行都基于掃描。
二, 能流
一行程序最左邊粗實(shí)線是能流的源,這里永遠(yuǎn)是True(1)。通過(guò)各種觸點(diǎn)的True(1)與False(0)組合,能流能到達(dá)右側(cè)的線圈指令的話,就可以使線圈置位(1)。能流不能到達(dá)右側(cè)線圈的話線圈就復(fù)位(0)。能掃描到的指令,基本能按照這種意愿執(zhí)行。
要正確理解能流True(1)與False(0)兩種狀態(tài)對(duì)程序的影響,如圖2所示。
圖2程序
當(dāng)I0.0 = True(1)的時(shí)候,兩個(gè)指令都得到了能流。計(jì)時(shí)器指令按照自己的屬性進(jìn)行計(jì)時(shí)。傳送指令把源地址數(shù)據(jù)傳送到目的地址,無(wú)論目的地址原來(lái)有什么值都執(zhí)行傳送更新目的地址。
當(dāng)I0.0 = False(0)的時(shí)候,兩個(gè)指令都沒(méi)有了能流。計(jì)時(shí)器在沒(méi)有能流的時(shí)候把當(dāng)前值寫成0,把計(jì)時(shí)器位寫成False(0)。值得注意的是,這個(gè)指令在False(0)的時(shí)候不是什么都不做的,而是在做False(0)時(shí)應(yīng)該做的事情。有這樣特點(diǎn)的指令還有輸出線圈指令等。傳送指令在沒(méi)有能流的時(shí)候不再傳送,不再理會(huì)目的地址。大量位于能流最右側(cè)的指令都有這個(gè)特點(diǎn)。
三, 雙線圈
不追究這個(gè)詞的歷史背景了。反正大家都知道在一個(gè)程序里面對(duì)同一個(gè)線圈出現(xiàn)過(guò)兩次輸出線圈就是雙線圈。
雙線圈不會(huì)當(dāng)作是一種錯(cuò)誤程序。它完全可以按照程序的行為作出解釋。也就是說(shuō)它沒(méi)有語(yǔ)法錯(cuò)誤,但是可能會(huì)導(dǎo)致邏輯執(zhí)行錯(cuò)誤。
如圖3所示的例子,可能作者希望自動(dòng)動(dòng)作時(shí)的三個(gè)步驟Q0.0得電。而且切換到點(diǎn)動(dòng)的時(shí)候又可以控制Q0.0。結(jié)果,由于出現(xiàn)了雙線圈,影響了期望的動(dòng)作。這是雙線圈最顯著的錯(cuò)誤使用。
圖3程序
對(duì)于輸出點(diǎn)Q,總是按照一個(gè)周期中最后一個(gè)輸出指令刷新輸出到物理點(diǎn)的。
下面舉一個(gè)案例,看看怎么處理比較好?
有一個(gè)輸出點(diǎn),根據(jù)工藝已經(jīng)做好了程序并且調(diào)試成功。程序片段如圖4所示。
圖4程序
突然甲方來(lái)了一個(gè)要求,要求Q0.0在原來(lái)的基礎(chǔ)上并聯(lián)一個(gè)現(xiàn)場(chǎng)按鈕,無(wú)論Q0.0是否動(dòng)作,現(xiàn)場(chǎng)按鈕按下時(shí),Q0.0都要為True(1)。現(xiàn)場(chǎng)按鈕松開時(shí),不影響原來(lái)的程序作用。同時(shí)要求,Q0.1不受現(xiàn)場(chǎng)按鈕影響。于是如圖5所示做了如下修改。
圖5程序
Ok。程序沒(méi)有問(wèn)題。要是改成如圖6所示的程序,結(jié)果會(huì)怎樣?同樣,這個(gè)程序也可以完成上述任務(wù)。
圖6程序
這是一個(gè)雙線圈的程序。第二個(gè)輸出線圈由于帶有第一個(gè)線圈的執(zhí)行結(jié)果,觸點(diǎn)先繼承了前面所有的邏輯,在此邏輯下增加了一個(gè)現(xiàn)場(chǎng)按鈕。解決了Q0.0的需求,但是又沒(méi)有對(duì)Q0.1有任何的影響。程序卻非常簡(jiǎn)單。
再看一個(gè)雙線圈使用的例子。如圖7所示。
圖7程序
先看網(wǎng)絡(luò)1 2 3。“報(bào)警”和“運(yùn)行中”兩個(gè)信號(hào)由于有公共相似的邏輯,所以用一個(gè)線圈把公共部分記錄下來(lái),再在下面的程序多次使用這樣的公共部分。為了使程序簡(jiǎn)單一點(diǎn),不用在報(bào)警和運(yùn)行的線圈前都把相同的公共部分重復(fù)寫一次。然而,網(wǎng)絡(luò)4才是Q輸出點(diǎn)最終要達(dá)成的控制邏輯目的。Q只是在前面的工作中臨時(shí)客串,義務(wù)送了一個(gè)人情。
臨時(shí)變量的影子也悄悄地在這個(gè)例子中流露出來(lái)。
四, 多重賦值
多重賦值是說(shuō)明一個(gè)地址,在程序多個(gè)地方都有出現(xiàn)對(duì)其寫入的操作。雙線圈是一種典型的多重賦值。執(zhí)行寫入的主動(dòng)操作者可以是用戶程序,可以是系統(tǒng)行為,可以是來(lái)自通訊端口改寫。還可以是其他。
在早先一些PLC還不允許出現(xiàn)雙線圈的時(shí)代,要繞過(guò)雙線圈的規(guī)則,有這樣的一種方法。程序開頭對(duì)線圈復(fù)位。后面的自動(dòng)程序需要什么步驟輸出線圈,就用置位指令代替線圈指令。最終掃描結(jié)束輸出物理信號(hào)的時(shí)候取決于是否對(duì)線圈置位,如圖8所示,程序在“步1”、“步2”、“步7”,這三個(gè)步驟時(shí)輸出。
圖8程序
如圖8這樣的程序結(jié)構(gòu),在多個(gè)地方都出現(xiàn)對(duì)Q0.0寫入值。當(dāng)然這樣各種的值都是不同的,相同的話就不必多重了。我們應(yīng)該小心處理邏輯關(guān)系,避免出現(xiàn)不希望的值。
再看一個(gè)例子,如圖9所示。
圖9程序
程序中把輸入量傳給輸出量。但是當(dāng)發(fā)現(xiàn)輸出量是負(fù)數(shù)的時(shí)候,把0傳給輸出量。也就是說(shuō)限制輸出量最小值是0,不可以再小了。
雙線圈和多重賦值都是自定義庫(kù)程序范圍中一個(gè)非常重要的思想。不能很好理解這兩個(gè)概念,將會(huì)對(duì)制作庫(kù)程序產(chǎn)生很大的障礙。
五, 間接尋址
在操作數(shù)引腳(實(shí)參)上直接使用常數(shù)、絕對(duì)地址、符號(hào)這三種方式是編程中使用最多寫法。另外,還有符號(hào)定義的常量和間接尋址兩種方式相對(duì)比較少去使用。如圖10所示。
圖10 程序
間接尋址包括制作指針和使用指針。
指針是指向目的區(qū)域目的地址的標(biāo)記。目前,CPU除了AC、HC、L區(qū)不能作為目的區(qū)域其他區(qū)域都可以間接尋址。
在后面的文章中,都只將V區(qū)作為間接尋址的目的地址做說(shuō)明或者做例子。這并不表示不能尋址到其余區(qū)域。
例子中的 ”T40” 的設(shè)定值填寫的是一個(gè)間接尋址。意思就是說(shuō)這個(gè)位置雖然不是一個(gè)具體的設(shè)定時(shí)間,但是,具體的值位于這個(gè)指針?biāo)傅牡胤健6@個(gè)地方當(dāng)時(shí)是什么值,那么計(jì)時(shí)器的設(shè)定值就是什么值。
簡(jiǎn)單講就是“你要的東西用紙(址)包著”和“你要的東西用紙(址)寫著”。
現(xiàn)在就圍繞這句話,聊一聊間接尋址。
首先說(shuō)說(shuō)這張包東西的紙(址),不是什么地方都可以做的。什么材料可以做這張紙?材料可以是全部V區(qū)、全部L區(qū)、AC區(qū)的AC1 AC2 AC3可以裝載指針。并且只能用連續(xù)的4個(gè)字節(jié)組成的雙字裝載指針。起始地址不介意是奇數(shù)還是偶數(shù)。
要用紙包著東西,必須把東西放進(jìn)去紙里面。MOVW 100 VW0 這里 ”100” 就是東西, ”VW0” 就是一張紙。小的東西就用一張紙包(一個(gè)字節(jié)),很大的東西就用四張紙拼成一張大紙包(一個(gè)雙字)。用這件東西的人只要找到這張紙直接就得到里面的東西。
你要的東西用紙寫著,那就是說(shuō)事前必然有人在紙上已經(jīng)寫了字,后面才能有人看見(jiàn)。MOVD &VB400 VD4 。這里 ”VB400” 就是寫在上面的字,”&” 符號(hào)是說(shuō)明寫著這幾個(gè)字是一個(gè)地址,不是普普通通的字。”VD4” 就是一張大紙。這就是制作指針。
手里拿著這張紙后,自然要根據(jù)這張紙的指引做一些事。如圖10程序最后一行指令。執(zhí)行一個(gè)計(jì)時(shí)器指令時(shí)使用了” *VD2” 這張紙 ……,如果只寫 ”VD2”,那么就好像是使用 ”VD2” 的值作為計(jì)時(shí)器設(shè)定值,但是事實(shí)并非如此。這里 ”VD2” 前面帶*號(hào)。星號(hào)表示 ”VD2” 里面的值是指引真正包含設(shè)定值的地址。由于 ”VD2” 里面先前一個(gè)指令寫入了 ”&VB0” ,所以這張紙其實(shí)是指引計(jì)時(shí)器到 ”VW0” 找尋設(shè)定值。這就是使用指針。當(dāng)然這是因?yàn)槭窃?a href="http://www.1cnz.cn/tags/定時(shí)器/" target="_blank">定時(shí)器的時(shí)間設(shè)置用到指針,而這個(gè)設(shè)置變量的類型是字。而如果在MOVB輸入用到相同指針 ”VD2”,那么輸入的就是 ”VB0” 而不是 ”VW0” 了,因?yàn)镸OVB指令需要的輸入變量的是字節(jié),也就是指針保存的是起始地址,具體使用的變量取決于指令需要。
使用間接尋址的好處在于通過(guò)計(jì)算改變指針的值,可以尋址到附近的任何地址。當(dāng)指針指向VB10的時(shí)候,把指針增加10,那么指針就會(huì)指向VB20。尋址就改變到VB20。指針再減少3,那么尋址就會(huì)找到VB17。對(duì)于一片連續(xù)的V空間只要知道第一個(gè)地址,就可以尋址到連續(xù)的第n個(gè)地址。
在以后的子程序使用中將會(huì)非常多地用到間接尋址的。
后面的內(nèi)容更精彩——帶參數(shù)子程序的制作。
編輯:黃飛
?
評(píng)論
查看更多