西門子模塊6ES7 215-1HG40-0XB0現(xiàn)貨供應(yīng)
西門子模塊6ES7 215-1HG40-0XB0
在S7-200編程中,,子程序想必大家都用過,,使用子程序可以更好地組織程序結(jié)構(gòu),,便于閱讀和調(diào)試,,也可以縮短程序代碼,。但是使用子程序也有一些需要注意的地方,,除了子程序在同一周期內(nèi)被多次調(diào)用時(shí),不能使用上升沿,、下降沿,、定時(shí)器和計(jì)數(shù)器之外,還有子程序中局部變量的特點(diǎn),,在編程多次調(diào)用帶參數(shù)子程序時(shí)要特別注意,。下面就是前些天熱線上遇到的一個(gè)Case,非常有代表性,,在這里跟大家分享,。
E:您好,西門子技術(shù)支持,。
C:您好,,我想問下,200子程序是不是多次調(diào)用時(shí)會(huì)不好使,?
E:不會(huì)啊,,您是不是在子程序里使用了沿指令或者定時(shí)器,?
C:沒有啊,我就編了一句很簡(jiǎn)單的開關(guān)程序,,開關(guān)閉合,,線圈導(dǎo)通,然后主程序里調(diào)用了兩次這個(gè)子程序,,結(jié)果第一個(gè)I點(diǎn)閉合了,,兩個(gè)Q點(diǎn)都導(dǎo)通了。
E:(心里活動(dòng):看來(lái)是和子程序的局部變量有關(guān)了,,估計(jì)客戶程序邏輯有問題)那請(qǐng)您描述一下您的子程序吧,,我?guī)湍纯础?/span>
于是客戶描述了一下自己的程序,大致了解了之后告知客戶我這邊測(cè)試下,,稍后回復(fù),。
客戶的程序是這樣的:
子程序:是個(gè)常見的自保持邏輯,接口參數(shù)如紅框所示,。
圖. 01
主程序:調(diào)用了兩次上面的子程序,,實(shí)現(xiàn)I0.0和I0.1控制Q0.0的閉合和斷開,I0.2和I0.3控制Q0.1的閉合和斷開,。
圖. 02
那么在線測(cè)試下程序執(zhí)行情況,,發(fā)現(xiàn)果然如客戶所描述的,I0.0為1后,,Q0.0和Q0.1都為1了,。見下圖.03所示。而如果閉合I0.2,,則Q0.0和Q0.1都斷開,。
圖. 03
為什么會(huì)這樣呢?首先我們先明確子程序局部變量的特點(diǎn),。局部變量的變量類型分為四種:IN,,IN_OUT,OUT和TEMP,,局部變量存儲(chǔ)區(qū)是在子程序調(diào)用時(shí)開辟的,,子程序調(diào)用完成,局部變量占用的存儲(chǔ)空間釋放,。
我們來(lái)分析下客戶的子程序,。
在主程序第一次調(diào)用子程序時(shí),如果I0.0為1,,I0.1為0,,它們將自身值分別傳給輸入局部變量#AA和#BB,子程序中程序邏輯執(zhí)行如下圖.04所示。此時(shí)局部變量#CC值為1,,子程序完成,,#CC將值傳送到輸出參數(shù)Q0.0上,使其置1,。根據(jù)局部變量的特點(diǎn),,子程序第一次調(diào)用完成后,局部變量存儲(chǔ)區(qū)釋放,。
圖.04
那么當(dāng)主程序第二次調(diào)用該子程序時(shí),,開辟臨時(shí)存儲(chǔ)空間,但是此時(shí)的存儲(chǔ)空間與第一次調(diào)用時(shí)開辟的不一定一致,??墒牵灿锌赡苡捎诔绦蚝?jiǎn)單,,仍然使用第一次調(diào)用時(shí)占用的存儲(chǔ)空間,。如果這種情況發(fā)生了,那么第一次調(diào)用時(shí)已經(jīng)將#CC的L0.2置了1,,而此值依舊存在,,那么第二次調(diào)用時(shí)雖然輸入?yún)?shù)I0.2和I0.3為0 ,但是#CC(L0.2)為1,,由于客戶的子程序邏輯有自保持部分,,所以最后L0.2的邏輯結(jié)果仍然是1。子程序完成后,,#CC將值傳送到輸出參數(shù)Q0.1上,,使其置1,。所以就會(huì)出現(xiàn)客戶反映的那種問題,。
那么該如何避免這種情況呢?
大家是否還記得剛剛介紹局部變量參數(shù)類型時(shí)除了IN, OUT類型外,,還有一種類型叫IN_OUT,,這種類型的參數(shù)是先讀入,然后再寫出,,這里我們就可以利用它的特點(diǎn)解決上面的問題,。
下面對(duì)子程序的參數(shù)進(jìn)行修改,將原先的#CC變量類型改為IN_OUT,。如下圖所示:
圖.05
主程序結(jié)構(gòu)不變,,如下所示,可以看到由于#CC的類型是IN-OUT,,它在子程序塊的接口位置也轉(zhuǎn)到了左側(cè)輸入側(cè),。
圖.06
下面再次將I0.0置1,其他輸入都為0,監(jiān)控程序狀態(tài),,如圖.07所示,,可以看到只有Q0.0為1,Q0.1狀態(tài)為0,。而如果將I0.1置1,, Q0.0被復(fù)位,Q0.1還是0,,這樣就符合客戶的控制要求了,。
圖.07
同樣,如果只給I0.2置1,,那么也只有Q0.1會(huì)亮,,不會(huì)再影響Q0.0。
了解了IN_OUT類型變量的特點(diǎn),,就不難分析以上的結(jié)果,。因?yàn)槊看握{(diào)用子程序時(shí),局部變量#CC都會(huì)先去讀取輸入?yún)?shù)Q0.0或Q0.1的狀態(tài),,所以即使兩次調(diào)用子程序時(shí),,#CC變量使用的同一區(qū)域,該區(qū)域的值也會(huì)在開始被Q點(diǎn)的狀態(tài)所修改,,就不存在兩次調(diào)用相互影響的情況了,。
另外,如果在子程序一開始就添加一條指令,,對(duì)局部變量#CC進(jìn)行賦初值(如圖.08),,也可以避免臨時(shí)變量區(qū)數(shù)值不定的問題,您可以嘗試測(cè)試下,。
圖.08
所以,,在編寫200子程序時(shí)要特別注意局部變量的特點(diǎn),一旦出現(xiàn)多次調(diào)用不正常的情況,,就可以從局部變量的特點(diǎn)出發(fā)分析,,看看是不是存在隱患。善加利用IN_OUT變量也許可以解決許多問題