zs8823
級別: 家園?
精華主題: 0
發(fā)帖數(shù)量: 86 個
工控威望: 513 點
下載積分: 1361 分
在線時間: 29(小時)
注冊時間: 2008-06-21
最后登錄: 2024-08-23
查看zs8823的 主題 / 回貼
樓主  發(fā)表于: 2010-11-12 04:27
圖片:
圖片:
遇到一個問題,寫了一個如圖所示的子程序,在主程序中兩次調(diào)用,但只有第一個調(diào)用有輸入輸出,第二個調(diào)用的輸入好象未傳入子程序,但輸出完全與第一個輸出同值且同步變化.不知道錯在哪里,請高手指點,CPU226.
醉湮邃虞
醉湮邃虞話老黑
級別: 略有小成
精華主題: 0
發(fā)帖數(shù)量: 229 個
工控威望: 409 點
下載積分: 1577 分
在線時間: 209(小時)
注冊時間: 2009-01-16
最后登錄: 2015-03-18
查看醉湮邃虞的 主題 / 回貼
1樓  發(fā)表于: 2010-11-12 12:14
個人感覺,是對局部變量的理解問題,子程序每個網(wǎng)絡(luò)都有錯誤。

程序中大量使用了局部變量,你把所有的局部變量變?yōu)槿肿兞烤蛻?yīng)該會好。

網(wǎng)絡(luò)1:L20.0 開始執(zhí)行時,狀態(tài)并不確定
網(wǎng)絡(luò)2:大量的局部變量,除DQSL外,均未賦值就使用,幸虧你沒除法,否則會嚴重錯誤。
網(wǎng)絡(luò)3:輸出DQLS,在C100斷開時是無效輸出
       而此時對L20.0  賦值及LD16的清零,(截圖無后面)如果該子程序中沒有后續(xù)使用,則毫無意義。
[ 此帖被醉湮邃虞在2010-11-12 12:25重新編輯 ]
棋牌比賽免費得實物,閑暇好去處
http://www.jj.cn/indexTG.html?promoterid=108502812
醉湮邃虞
醉湮邃虞話老黑
級別: 略有小成
精華主題: 0
發(fā)帖數(shù)量: 229 個
工控威望: 409 點
下載積分: 1577 分
在線時間: 209(小時)
注冊時間: 2009-01-16
最后登錄: 2015-03-18
查看醉湮邃虞的 主題 / 回貼
2樓  發(fā)表于: 2010-11-15 10:53
PLC中為子程序開辟了60個字節(jié)的可用存貯區(qū)域,但這60個字節(jié)是所有子程序共享的空間,并不是每個子程序獨享。
也就是說,局部變量只保持一個掃描周期賦值的數(shù)據(jù),要保證局部變量有效,必須保證每個掃描周期都有賦值,特別
是OUT類型變量,OUT類型變量如果前面有條件,則當條件為假時,輸出的是無效值。而賦值之前對OUT類型變量的
讀取也是無效的。
故此若這樣寫程序,只有一個子程序,有可能能工作,若存在其他子程序,也用到了局部變量,則程序就會
不正常。
類似的變量還有 AC0 AC1 AC2 AC3 AC4 .....
這類變量使用前一定要賦值,一段程序結(jié)束后該變量應(yīng)該沒用才對。
你也可以把輸出變量和中間變量,用IN-OUT類型來定義,效果會大大改變。
給你個試驗程序:
子程序一:定義AA OUT WORD
1+AA  >  AA
子程序二:
MOVW 100 > LW0
在主程序中分別 調(diào)用這兩個子程序,你會發(fā)現(xiàn),程序一的輸出值,恒為101,而不是需要的每個掃描周期+1值(快速變化值)。


                
        
[ 此帖被醉湮邃虞在2010-11-15 11:19重新編輯 ]
棋牌比賽免費得實物,閑暇好去處
http://www.jj.cn/indexTG.html?promoterid=108502812