子程序是整個(gè)程序的一個(gè)片段。根據(jù)編程者的需求,把一部分程序歸入到一個(gè)子程序里面,完成相關(guān)的功能。整個(gè)子程序可以根據(jù)用戶程序的邏輯選擇調(diào)用或者不調(diào)用。調(diào)用的話就按照掃描次序掃描一次子程序,然后回到調(diào)用處。不調(diào)用的話就等于程序沒有了這部分片段。在其他地方再次出現(xiàn)調(diào)用這個(gè)子程序的話,子程序又得到一次運(yùn)行。PLC并沒有限制用戶調(diào)用子程序的次數(shù),只不過(guò)調(diào)用一次就要增加一點(diǎn)掃描時(shí)間。必要時(shí)候就調(diào)用,沒必要的時(shí)候調(diào)用了也不產(chǎn)生什么效益。
偶爾會(huì)看見論壇上有人在問(wèn):有幾個(gè)數(shù)據(jù)需要求平均值。PLC有沒有求平均的指令???
不好意思,200 SMART PLC沒有計(jì)算平均指令。還是好好地編程寫吧。
下面我試試用兩種方式的子程序完成這個(gè)多個(gè)值的累加。至于除法求平均就不介紹了?,F(xiàn)以4個(gè)字變量計(jì)算總和為例介紹。
程序要求:VW0、VW2、VW4、VW6四個(gè)值求和,結(jié)果放在VW100中。
看看先用比較簡(jiǎn)單的方法,先完成要求的功能,如圖1所示。
?
?
?
圖1程序
在子程序里面就是幾個(gè)很簡(jiǎn)單的加法指令。而在主程序調(diào)用子程序的前后,加上了一些簡(jiǎn)單的傳送指令。
先看子程序。子程序中三個(gè)加法指令把四個(gè)MW累加到MW8中。前面四個(gè)MW中并沒有什么值。累加之后的結(jié)果MW8也沒有什么實(shí)際意義。
再看主程序。題目要求的四個(gè)已知值,在調(diào)用子程序之前就傳到了子程序使用的MW地址。此時(shí)調(diào)用子程序,這些MW就有了指定值。經(jīng)過(guò)子程序的運(yùn)算,結(jié)果就放置在MW8。然后回到調(diào)用處,再把子程序的值傳到題目要求的地方,完成題目的要求。
在這個(gè)例子中,主程序的這個(gè)網(wǎng)絡(luò)可以多次使用。在需要的地方就按照上面例子的方法使用子程序就可以再次實(shí)現(xiàn)求和的作用。子程序只是作為一個(gè)計(jì)算法則,而這個(gè)法則又是很簡(jiǎn)單的幾個(gè)計(jì)算。當(dāng)遇到比較復(fù)雜的算法的時(shí)候,并且又有機(jī)會(huì)多次調(diào)用。不妨可以試試這個(gè)程序結(jié)構(gòu)。這個(gè)結(jié)構(gòu)有一個(gè)優(yōu)勢(shì),就是任何品牌的PLC都可以互通。哪怕就是20年前的PLC也一樣可以用這個(gè)方法。不過(guò)當(dāng)今的200 SMART PLC顯然不推薦使用這樣的方式了。這個(gè)方式的編程,只是用于說(shuō)明帶參數(shù)子程序的一部分參數(shù)傳遞原理,將在日后詳細(xì)介紹。
這種調(diào)用方式存在一些問(wèn)題:
-
調(diào)用子程序的前后,需要把參數(shù)傳送到指定的地址,供子程序使用。
這些地址成為了這一個(gè)子程序的專用地址。
每次調(diào)用子程序都要做這個(gè)事情。
-
子程序占用了公共資源。
當(dāng)一個(gè)程序有很多個(gè)子程序的時(shí)候,消耗在這兩方面的工作和資源就會(huì)很多。當(dāng)一個(gè)子程序工作需要很多個(gè)參數(shù)的時(shí)候,要寫很多MOV指令,也要占用很多公共資源M地址。對(duì)于200 SMART PLC,M區(qū)只有32個(gè)字節(jié),如果需要32字節(jié)以上的區(qū)域,那就只能在比較大的V區(qū)找地方了。而當(dāng)子程序很多,或者子程序是不同編程者的話,就可能會(huì)有不同子程序使用到了相同的區(qū)域。這樣必然需要修改一些地址,使地址不發(fā)生重復(fù)。
假如有辦法解決上述兩個(gè)問(wèn)題,將是一個(gè)非常美滿的結(jié)果。辦法是有的。先不說(shuō)這個(gè)。
現(xiàn)在,再用現(xiàn)在的方式寫一個(gè)子程序完成求和的功能。四個(gè)步驟就可以創(chuàng)建一個(gè)帶參數(shù)的子程序。
步驟一
新建一個(gè)子程序。在子程序?qū)傩岳锩婢幒米映绦蛎Q和塊編號(hào)(子程序號(hào)),如圖2所示。這里要求不嚴(yán)格,主要是編程者自己容易分辨就好。當(dāng)然如果是要做成庫(kù),最好把塊編號(hào)設(shè)置大些,以便于調(diào)用時(shí)不會(huì)沖突。
?
圖2 設(shè)置塊屬性
第二步
如圖3所示,打開變量表。
?
圖3 變量表
第三步
向變量表填入需要的輸入輸出參數(shù),如圖4所示。
?
圖4 設(shè)置參數(shù)
變量表的各個(gè)列的意思是:
地址:變量對(duì)應(yīng)L區(qū)的絕對(duì)地址。這個(gè)地址由系統(tǒng)分配,不能由編程者輸入。每增加一個(gè)變量或者插入一行,地址自動(dòng)改變。并且如果編程當(dāng)前正在用符號(hào)名編程的時(shí)候,增刪行導(dǎo)致的地址變更,不會(huì)影響編程關(guān)系。相反,如果正在用地址編程,而你又增刪過(guò)行,那么程序地址將會(huì)混亂。
符號(hào):這個(gè)是變量的名字。如果正在用地址編程的時(shí)候,此時(shí)修改名字,不會(huì)影響已寫好的程序。相反,如果正在用符號(hào)編程,此時(shí)修改名字,那么程序符號(hào)立即紅色報(bào)錯(cuò),程序已找不到這個(gè)名字了。
變量類型:無(wú)法修改。輸入?yún)?shù)填寫在IN行。輸入/輸出參數(shù)填寫在IN_OUT行。輸出參數(shù)填寫在OUT行。臨時(shí)變量在最后TEMP。填寫完畢會(huì)自動(dòng)增加新行。
IN類型表示子程序運(yùn)行的數(shù)據(jù)來(lái)源,就像上述例子的4個(gè)加數(shù)。
OUT類型表示經(jīng)過(guò)子程序的運(yùn)算,得到的結(jié)果。輸出在這個(gè)位置。
IN/OUT類型,組合兩種類型,先輸入給子程序再運(yùn)算得到結(jié)果輸出到相同的位置。
TEMP類型,這個(gè)類型既不輸入也不輸出,僅僅在子程序中充當(dāng)過(guò)渡用的中間變量。
數(shù)據(jù)類型:這個(gè)參數(shù)是一個(gè)點(diǎn)位還是一個(gè)字節(jié)還是一個(gè)浮點(diǎn)數(shù)等等的性質(zhì)。這個(gè)下拉選擇將會(huì)影響地址欄的分配跨度。因?yàn)椴煌念愋驼加貌煌奈婚L(zhǎng)。
注釋:給自己看的一些關(guān)于本行變量的備忘信息。
到此,一個(gè)帶參數(shù)的子程序就已經(jīng)完成了。雖然并沒開始編寫子程序的內(nèi)容,但是你已經(jīng)可以觀察一下由主程序調(diào)用這個(gè)子程序的樣子。如圖5所示。
?
圖5 子程序調(diào)用
網(wǎng)絡(luò)1是當(dāng)子程序沒有填寫變量表的時(shí)候的樣子,它不帶任何參數(shù)。網(wǎng)絡(luò)2是剛才建立了變量表的求和子程序。此時(shí)的子程序未確定任何實(shí)質(zhì)性的參數(shù)地址。點(diǎn)擊每個(gè)問(wèn)號(hào)地方,按照題目要求左側(cè)輸入VW0;VW2;VW4;VW6,右側(cè)輸入VW100,調(diào)用基本就完成了。
子程序輸入輸出參數(shù)的排序會(huì)按照你剛才填寫變量表的先后順序布置。在實(shí)際程序中,你最好在向子程序編程之前先確認(rèn)一下這個(gè)外觀效果,每一個(gè)輸入輸出參數(shù)是否能夠按照使用的習(xí)慣排列所有參數(shù)。例如我們表達(dá)一個(gè)長(zhǎng)方體的尺寸的時(shí)候通常都說(shuō)“長(zhǎng)寬高”,沒有人會(huì)說(shuō)“高長(zhǎng)寬”的次序的。這個(gè)就是習(xí)慣。當(dāng)參數(shù)很多的時(shí)候,盡量按照有關(guān)習(xí)慣填寫變量表的順序。可以用插入刪除行的方法編輯次序。
第四步
對(duì)子程序編程。
子程序內(nèi)的加法過(guò)程的編程在此就省略了。其實(shí)就是圖1的子程序。只不過(guò)是將全部的MW改寫成LW就可以了。
好了,一個(gè)帶參數(shù)的子程序就完整建立完畢了。它將會(huì)出現(xiàn)在指令樹里面項(xiàng)目的程序塊里面。它因?yàn)楸旧砭褪且粋€(gè)子程序,所以也是顯示為一個(gè)子程序。
后面的內(nèi)容更精彩??赡懿皇悄阆胂蟮哪腔厥屡??!獛?shù)子程序的參數(shù)傳遞過(guò)程
?
?
?
編輯:黃飛
評(píng)論
查看更多