主程序与子程序不在同一程序模块中_深度解析S7200系列PLC带参数子程序用法
一、導(dǎo)讀
當(dāng)控制要求相同或具有相同的算法時(shí),(如對(duì)電機(jī)的控制,若需要對(duì)多臺(tái)電機(jī)進(jìn)行控制,且每臺(tái)電機(jī)具有相同的控制方式)此時(shí)可考慮根據(jù)該控要求,編寫一個(gè)功能塊,然后重復(fù)調(diào)用該功能塊,然后賦予不同的實(shí)參來實(shí)現(xiàn)該控制,如同所示:
?
但往往有些人做完后發(fā)現(xiàn)一臺(tái)電機(jī)啟動(dòng)后,其他的電機(jī)本來不該啟動(dòng)的也跟隨著啟動(dòng)了,這是什么原因呢?
本篇文章就是為大家分析為什么會(huì)出現(xiàn)這種情況,其實(shí)這主要還是對(duì)子程序中變量類型的使用不正確造成的,在S7-200系列的子程序中有四種變量類型,分別為IN(傳入)、IN/OUT(傳入/傳出)、OUT(傳出參數(shù))、TEMP(臨時(shí)變量),下面就為大家詳細(xì)介紹下子程序中的這幾種變量類型的含義和在應(yīng)用時(shí)應(yīng)如何選擇。
二、變量類型IN
變量類型IN稱為輸入類型,是“只讀”變量,用于把外圍的數(shù)據(jù)或狀態(tài)傳入到子程序中進(jìn)行運(yùn)算,若把子程序看作成一個(gè)指令(如一個(gè)加法指令),那么輸入?yún)?shù)就相當(dāng)于指令的IN的管腳。該變量建立后,在調(diào)用子程序時(shí)位于子程序的左側(cè)。由于是把數(shù)據(jù)傳入子程序中,所以該形式參數(shù)在賦實(shí)參時(shí)可使用常數(shù)、存儲(chǔ)器或指針。
變量建立時(shí)只需要建立符號(hào)名稱和選擇對(duì)應(yīng)的數(shù)據(jù)類型即可,至于該變量的地址,系統(tǒng)會(huì)自動(dòng)分配一個(gè)局部存儲(chǔ)器的地址,注意該地址不可修改,如下圖所示,第一個(gè)地址的符號(hào)命名為“Start_Motor”,選擇數(shù)據(jù)類型為“BOOL”后,系統(tǒng)自動(dòng)給其分配了一個(gè)L0.1的局部存儲(chǔ)器地址。
三、變量類型OUT
變量類型OUT稱為輸出變量類型,是一個(gè)可寫的變量,主要用于把子程序運(yùn)算完的結(jié)果傳遞出來,類似于指令中的OUT管腳(如一個(gè)加法指令)。該變量建立后,在調(diào)用子程序時(shí)位于子程序的右側(cè)。由于該變量類型用于存儲(chǔ)運(yùn)行的結(jié)果,所以在使用時(shí)該變量類型的形參在賦實(shí)參時(shí)只能使用存儲(chǔ)器,不能使用常數(shù)或是指針。
由于輸出參數(shù)并不保留子程序最后一次執(zhí)行時(shí)分配給它的數(shù)值,所以必須在每次調(diào)用子程序時(shí)將數(shù)值分配給輸出參數(shù)。注意:在電源上電時(shí),SET和RESET指令只影響布爾量操作數(shù)的值,建立OUT的變量類型與建立IN的類型方法一樣,也會(huì)根據(jù)選擇的數(shù)據(jù)類型系統(tǒng)自動(dòng)分配地址。
四、變量類型IN_OUT
變量類型IN_OUT稱為輸入輸出變量類型,是一個(gè)可讀可寫的變量即可讀取他的值傳遞給子程序內(nèi)部的運(yùn)算,也可把運(yùn)算完的結(jié)果輸出放入到該變量中,比如說我們用到的自加1指令或是啟保停電路中用于輸出和自保持的變量就需要用到該變量。該變量建立后,在調(diào)用子程序時(shí)位于子程序的左側(cè),由于該地址需要存儲(chǔ)子程序運(yùn)算完的結(jié)果,所以在賦予實(shí)參時(shí)不允許使用常數(shù)和指針作。
五、變量類型TEMP
變量類型TEMP稱為臨時(shí)變量,該變量與前面所介紹的三種變量的最大區(qū)別就是不參與對(duì)子程序數(shù)據(jù)傳遞,即不把外圍的數(shù)據(jù)傳入到子程序,也不把子程序的運(yùn)算結(jié)果傳遞出子程序,該變量主要用于子程序的內(nèi)部暫存中間運(yùn)算結(jié)果使用,所以該變量類型無需賦實(shí)參。
Temp變量在運(yùn)算前一定需要有一個(gè)確定的值,若沒有確定值不能參與運(yùn)算,否則會(huì)出現(xiàn)運(yùn)算結(jié)果數(shù)據(jù)的混亂,如同下圖所示:
?
圖中有兩個(gè)臨時(shí)變量,分別為Temp1和Temp2.從程序中可發(fā)現(xiàn),對(duì)于Temp1在用于后面的運(yùn)算時(shí),可知道他的值是由兩個(gè)輸入變量相加后的結(jié)果,它時(shí)一個(gè)確定的指。而對(duì)于Temp2這個(gè)臨時(shí)變量,在進(jìn)行加法運(yùn)算時(shí),并不知道他的值時(shí)多少,所以它不是一個(gè)確定的值,那么在程序執(zhí)行后,Result1可得到一個(gè)正確的結(jié)果,而Result2得不到一個(gè)正確的結(jié)果。六、如何選擇變量類型
下面以一個(gè)簡(jiǎn)單的例子為例來說明如何選擇變量類型,如:假設(shè)有多臺(tái)空壓機(jī),要求當(dāng)壓力小于下限設(shè)定壓力時(shí),啟動(dòng)空壓機(jī)電機(jī),當(dāng)壓力高于上限壓力設(shè)定時(shí),關(guān)閉空壓機(jī)電機(jī)。壓力通過壓力傳感器進(jìn)行檢測(cè)。
分析:(1)由于空壓機(jī)的啟動(dòng)方式是相同的,但上下限壓力設(shè)定以及傳感器的輸出信號(hào)和檢測(cè)范圍都不同,所以在編寫程序是,可考慮建立一個(gè)帶參數(shù)的功能塊,然后把這些參數(shù)作為實(shí)參賦值到該子程序的形參上。(2)當(dāng)前壓力的計(jì)算,當(dāng)前壓力的計(jì)算可使用西門子提供的模擬量轉(zhuǎn)換庫,也可自己根據(jù)公式編寫,這里我們自己編寫一個(gè)這個(gè)功能塊的程序。
模擬量采集換算的計(jì)算公式如所示,其中ISl和ISH分布表示的是轉(zhuǎn)換后的數(shù)字量范圍,OSH和OSl表示的是傳感器檢測(cè)范圍。
程序編寫時(shí),必須全部轉(zhuǎn)換為同一數(shù)據(jù)類型進(jìn)行使用,在該公式中不同變量的數(shù)據(jù)類型如下:
Ov:Real
? ? Osh/Osl:Real
Iv:INT
? ? Ish/Isl:INT
從這個(gè)公式中我們可以O(shè)SL和OSH,ISL和OISL以及IV都是我們需要從外圍給入到這個(gè)計(jì)算的子程序中,所以這些變量在建立的時(shí)候建立為IN的類型。
公式中的“OSH-OSL”、“IV-ISL”和“ISH-ISL”以及把整數(shù)的數(shù)據(jù)類型轉(zhuǎn)換為實(shí)數(shù)的數(shù)據(jù)類型等,這些計(jì)算結(jié)果都需要進(jìn)行暫存,所以可建立TEMP的變量來存儲(chǔ)。
對(duì)于輸出結(jié)果OV,在這個(gè)公式中是一個(gè)輸出的結(jié)果,是一個(gè)可寫的變量,但后續(xù)還需要用于與設(shè)定的上下限值做比較,因此還需要去讀取他的值,那么該變量也是一個(gè)可讀的變量,所以建立時(shí)可建立為IN_OUT變量。
對(duì)于電機(jī)的運(yùn)行標(biāo)志位,在低壓下限設(shè)定值時(shí)啟動(dòng),高于上限設(shè)定值時(shí)停止,在兩個(gè)限制值之間時(shí)需要進(jìn)行自保持,所以需要用到他的觸點(diǎn)進(jìn)行自鎖,這也是一個(gè)可讀可寫的變量,同樣建為IN_OUT的變量類型。
對(duì)于空壓機(jī)電機(jī)的啟動(dòng)信號(hào),電機(jī)運(yùn)行標(biāo)志位為1就輸出,為0就斷開,程序中只需要用到該變量的輸出線圈即可,所以在建立時(shí)建立OUT類型的變量。
七、編寫帶參數(shù)的子程序
(1)程序編寫及變量表的建立,按照上述分析對(duì)該程序中需要用到的變量表進(jìn)行建立,并對(duì)每個(gè)變量,分配好對(duì)應(yīng)的數(shù)據(jù)類型,變量表的建立和變量數(shù)據(jù)類型的分配入下圖所示:
(2)限制值程序的編寫,對(duì)采集到的數(shù)值進(jìn)行范圍的限制,保證該參加值的范圍是在采集值的上下限之間的數(shù)值。
(3)根據(jù)計(jì)算公式的要求進(jìn)行計(jì)算程序的編寫,同時(shí)把不同的數(shù)據(jù)類型轉(zhuǎn)換為相同的數(shù)據(jù)類型做運(yùn)算,然后根據(jù)計(jì)算的采集值的大小與設(shè)定的上下限制做比較實(shí)現(xiàn)對(duì)電機(jī)的啟停控制。
八、帶參數(shù)子程序的調(diào)用
多次調(diào)用帶參數(shù)的子程序,給其賦予不同的實(shí)參,這樣可是實(shí)現(xiàn)對(duì)多臺(tái)電機(jī)的啟停控制,如下圖所示,假設(shè)第一臺(tái)空壓機(jī)的上下限設(shè)置頻率為0.2MP和0.8MP,傳感器的檢測(cè)輸出信號(hào)為4到20mA,檢測(cè)范圍為0到1MP,第二臺(tái)電機(jī)的上下限設(shè)置頻率為0.5MP和1.2MP,傳感器的檢測(cè)輸出信號(hào)為0到10V,檢測(cè)范圍為0到1.5MP,程序的調(diào)用及實(shí)參的分配如下圖所示:
九、總結(jié)和注意事項(xiàng)
(1)變量類型的選擇,可根據(jù)在程序的應(yīng)用中是對(duì)該變量需要執(zhí)行寫的操作還是讀的操作來決定該變量的類型的選擇,另外對(duì)于臨時(shí)變量在子程序中不出現(xiàn)地址,所以在用于暫存中間結(jié)果的時(shí)候,可建立TEMP的變量類型
(2)由于該子程序的調(diào)用條件用SM 0.0去調(diào)用,所以當(dāng)子程序在一個(gè)掃描周期內(nèi)多次調(diào)用時(shí),子程序中不能用到沿脈沖指令,因?yàn)樵?00系列的PLC中,沿的狀態(tài)時(shí)由系統(tǒng)自行存儲(chǔ)的,對(duì)此調(diào)用時(shí)九會(huì)出現(xiàn)混亂的情況
(3)定時(shí)器和計(jì)數(shù)器指令不存在對(duì)定時(shí)器或計(jì)數(shù)器地址的變量尋址,所以當(dāng)子程序在一個(gè)掃描周期內(nèi)多次調(diào)用時(shí),子程序內(nèi)部也不能使用定時(shí)器和計(jì)數(shù)器。作者:曾鑫
本文來自技成培訓(xùn)網(wǎng)原創(chuàng)文章;未經(jīng)許可,盜取必究!
總結(jié)
以上是生活随笔為你收集整理的主程序与子程序不在同一程序模块中_深度解析S7200系列PLC带参数子程序用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python列表下表_Python 列
- 下一篇: redis 启动_Redis介绍amp;