zs8823
級(jí)別: 家園常客
![]() |
圖片:
![]()
圖片:
![]() 遇到一個(gè)問(wèn)題,寫(xiě)了一個(gè)如圖所示的子程序,在主程序中兩次調(diào)用,但只有第一個(gè)調(diào)用有輸入輸出,第二個(gè)調(diào)用的輸入好象未傳入子程序,但輸出完全與第一個(gè)輸出同值且同步變化.不知道錯(cuò)在哪里,請(qǐng)高手指點(diǎn),CPU226. |
---|---|
|
wjmdtt
級(jí)別: 略有小成
![]() |
我覺(jué)得像是一個(gè)掃描周期內(nèi)調(diào)用子程序并不一定能完成6次計(jì)數(shù)運(yùn)行.因此第二次調(diào)用后返回值一樣,因你返回值用的是: LD C100........也即必須C100計(jì)數(shù)到后才輸出.因此就只有第一次起作用. |
---|---|
|
wjmdtt
級(jí)別: 略有小成
![]() |
你可將程序修改下.如設(shè)計(jì)為讓子程序?qū)崟r(shí)返回在主程序中處理6次問(wèn)題試試. 同時(shí)你這個(gè)子程序計(jì)算我沒(méi)看出有任何意義.網(wǎng)絡(luò)2中都是原值過(guò)去過(guò)來(lái)不知你要實(shí)現(xiàn)個(gè)啥功能. [ 此帖被wjmdtt在2010-11-12 11:34重新編輯 ] |
---|---|
|
醉湮邃虞
醉湮邃虞話老黑
級(jí)別: 略有小成
![]() |
個(gè)人感覺(jué),是對(duì)局部變量的理解問(wèn)題,子程序每個(gè)網(wǎng)絡(luò)都有錯(cuò)誤。 程序中大量使用了局部變量,你把所有的局部變量變?yōu)槿肿兞烤蛻?yīng)該會(huì)好。 網(wǎng)絡(luò)1:L20.0 開(kāi)始執(zhí)行時(shí),狀態(tài)并不確定 網(wǎng)絡(luò)2:大量的局部變量,除DQSL外,均未賦值就使用,幸虧你沒(méi)除法,否則會(huì)嚴(yán)重錯(cuò)誤。 網(wǎng)絡(luò)3:輸出DQLS,在C100斷開(kāi)時(shí)是無(wú)效輸出 而此時(shí)對(duì)L20.0 賦值及LD16的清零,(截圖無(wú)后面)如果該子程序中沒(méi)有后續(xù)使用,則毫無(wú)意義。 [ 此帖被醉湮邃虞在2010-11-12 12:25重新編輯 ] |
|
---|---|---|
|
cgyu5892483
級(jí)別: 探索解密
![]() |
反復(fù)調(diào)用子程序時(shí),調(diào)用計(jì)數(shù),系統(tǒng)時(shí)鐘,系統(tǒng)脈沖等指令需要慎重。 程序掃描是從左至右,從上至下,看主程序:執(zhí)行第一個(gè)調(diào)用子程序后,立馬進(jìn)入下一個(gè)子程序調(diào)用,那問(wèn)題就來(lái)了: LD4是輸出,并且在掃描到C100為ON時(shí)才輸出,下一步是L20.0為ON,下一步跳出第一個(gè)子程序并進(jìn)入第二個(gè)子程序,此時(shí)L20.0在掃描周期內(nèi)被置位為ON,C100復(fù)位。也就是說(shuō)主程序沒(méi)進(jìn)入第二個(gè)周期,C100就被復(fù)位了。所以第二個(gè)子程序永遠(yuǎn)只能讀到第一個(gè)子程序的塊輸出。 |
---|---|
|
zs8823
級(jí)別: 家園?
![]() |
寫(xiě)這個(gè)子程序的原因是工程中現(xiàn)有程序步數(shù)已經(jīng)快到上限,為了避免超上限只能用子程序調(diào)用.這個(gè)程序是將壓墊稱(chēng)每秒鐘的數(shù)量變化累計(jì)到一個(gè)臨時(shí)變量里,到6秒鐘時(shí)乘以10送到輸出變量,供上位機(jī)界面中動(dòng)態(tài)顯示每分鐘流向稱(chēng)體的物料的流量,因結(jié)果僅供參考調(diào)整下料閘板,故算法不要求特別精確. |
---|---|
|
zs8823
級(jí)別: 家園?
![]() |
多謝各位指點(diǎn)!! 但還是想不明白. 如4樓所言C100是個(gè)全局變量,第6秒時(shí)在第一個(gè)子程序中被置ON使第一個(gè)子程序輸出,但第一個(gè)子程序和第二個(gè)子程序中的L20.0因?yàn)槭蔷植孔兞繎?yīng)該是兩個(gè)不同的值,所以我覺(jué)得C100在第二個(gè)子程序中應(yīng)該是又被+1了,但未被復(fù)位直到下個(gè)周期在前一個(gè)子程序中被復(fù)位后,進(jìn)入第二個(gè)子程序中直接+1,想到這里就有問(wèn)題了:C100在一個(gè)周期中被加了兩次是不是?如果是,那么最后結(jié)果乘10就應(yīng)該改為乘20了,但是調(diào)試中發(fā)現(xiàn)第一個(gè)子程序輸出的值按乘10計(jì)算與實(shí)際接近.... 不知道就這個(gè)思路有沒(méi)有更好的解決辦法? |
---|---|
|
zs8823
級(jí)別: 家園?
![]() |
因輸出值僅供顯示參考所有沒(méi)用準(zhǔn)確算法,但第二個(gè)周期開(kāi)始就是準(zhǔn)確值了.LD16是個(gè)臨時(shí)變量,用于累計(jì)輸入值的變化量,清零的目的是在下個(gè)周期中重新累計(jì). |
---|---|
|
醉湮邃虞
醉湮邃虞話老黑
級(jí)別: 略有小成
![]() |
PLC中為子程序開(kāi)辟了60個(gè)字節(jié)的可用存貯區(qū)域,但這60個(gè)字節(jié)是所有子程序共享的空間,并不是每個(gè)子程序獨(dú)享。 也就是說(shuō),局部變量只保持一個(gè)掃描周期賦值的數(shù)據(jù),要保證局部變量有效,必須保證每個(gè)掃描周期都有賦值,特別 是OUT類(lèi)型變量,OUT類(lèi)型變量如果前面有條件,則當(dāng)條件為假時(shí),輸出的是無(wú)效值。而賦值之前對(duì)OUT類(lèi)型變量的 讀取也是無(wú)效的。 故此若這樣寫(xiě)程序,只有一個(gè)子程序,有可能能工作,若存在其他子程序,也用到了局部變量,則程序就會(huì) 不正常。 類(lèi)似的變量還有 AC0 AC1 AC2 AC3 AC4 ..... 這類(lèi)變量使用前一定要賦值,一段程序結(jié)束后該變量應(yīng)該沒(méi)用才對(duì)。 你也可以把輸出變量和中間變量,用IN-OUT類(lèi)型來(lái)定義,效果會(huì)大大改變。 給你個(gè)試驗(yàn)程序: 子程序一:定義AA OUT WORD 1+AA > AA 子程序二: MOVW 100 > LW0 在主程序中分別 調(diào)用這兩個(gè)子程序,你會(huì)發(fā)現(xiàn),程序一的輸出值,恒為101,而不是需要的每個(gè)掃描周期+1值(快速變化值)。 [ 此帖被醉湮邃虞在2010-11-15 11:19重新編輯 ] |
|
---|---|---|
|