<object id="ir2le"></object>
  • 加入收藏 在線留言 聯系我們
    關注微信
    手機掃一掃 立刻聯系商家
    全國服務熱線15267534595
    公司新聞
    使用S7-200 SMART 編寫一個自己的指令-2
    發布時間: 2023-08-26 10:25 更新時間: 2024-12-26 09:10

    子程序是整個程序的一個片段。根據編程者的需求,把一部分程序歸入到一個子程序里面,完成相關的功能。整個子程序可以根據用戶程序的邏輯選擇調用或者不調用。調用的話就按照掃描次序掃描一次子程序,然后回到調用處。不調用的話就等于程序沒有了這部分片段。在其他地方再次出現調用這個子程序的話,子程序又得到一次運行。PLC并沒有限制用戶調用子程序的次數,只不過調用一次就要增加一點掃描時間。必要時候就調用,沒必要的時候調用了也不產生什么效益。

    偶爾會看見論壇上有人在問:有幾個數據需要求平均值。PLC有沒有求平均的指令啊?

    不好意思,200 SMART PLC沒有計算平均指令。還是好好地編程寫吧。

    下面我試試用兩種方式的子程序完成這個多個值的累加。至于除法求平均就不介紹了。現以4個字變量計算總和為例介紹。

    程序要求:VW0、VW2、VW4、VW6四個值求和,結果放在VW100中。

    看看先用比較簡單的方法,先完成要求的功能,如圖1所示。

     

     圖片 

    圖1程序

    在子程序里面就是幾個很簡單的加法指令。而在主程序調用子程序的前后,加上了一些簡單的傳送指令。

    先看子程序。子程序中三個加法指令把四個MW累加到MW8中。前面四個MW中并沒有什么值。累加之后的結果MW8也沒有什么實際意義。

    再看主程序。題目要求的四個已知值,在調用子程序之前就傳到了子程序使用的MW地址。此時調用子程序,這些MW就有了指定值。經過子程序的運算,結果就放置在MW8。然后回到調用處,再把子程序的值傳到題目要求的地方,完成題目的要求。

    在這個例子中,主程序的這個網絡可以多次使用。在需要的地方就按照上面例子的方法使用子程序就可以再次實現求和的作用。子程序只是作為一個計算法則,而這個法則又是很簡單的幾個計算。當遇到比較復雜的算法的時候,并且又有機會多次調用。不妨可以試試這個程序結構。這個結構有一個優勢,就是任何品牌的PLC都可以互通。哪怕就是20年前的PLC也一樣可以用這個方法。不過當今的200 SMART PLC顯然不推薦使用這樣的方式了。這個方式的編程,只是用于說明帶參數子程序的一部分參數傳遞原理,將在日后詳細介紹。

    這種調用方式存在一些問題:

    1. 調用子程序的前后,需要把參數傳送到指定的地址,供子程序使用。

      這些地址成為了這一個子程序的專用地址。

      每次調用子程序都要做這個事情。

    2. 子程序占用了公共資源。

    當一個程序有很多個子程序的時候,消耗在這兩方面的工作和資源就會很多。當一個子程序工作需要很多個參數的時候,要寫很多MOV指令,也要占用很多公共資源M地址。對于200 SMART PLC,M區只有32個字節,如果需要32字節以上的區域,那就只能在比較大的V區找地方了。而當子程序很多,或者子程序是不同編程者的話,就可能會有不同子程序使用到了相同的區域。這樣必然需要修改一些地址,使地址不發生重復。

    假如有辦法解決上述兩個問題,將是一個非常美滿的結果。辦法是有的。先不說這個。

    現在,再用現在的方式寫一個子程序完成求和的功能。四個步驟就可以創建一個帶參數的子程序。

    步驟一

    新建一個子程序。在子程序屬性里面編好子程序名稱和塊編號(子程序號),如圖2所示。這里要求不嚴格,主要是編程者自己容易分辨就好。當然如果是要做成庫,zuihao把塊編號設置大些,以便于調用時不會沖突。

     圖片

    圖2 設置塊屬性

    第二步

    如圖3所示,打開變量表。

    圖片 

    圖3 變量表

    第三步

    向變量表填入需要的輸入輸出參數,如圖4所示。

     圖片

    圖4 設置參數

    變量表的各個列的意思是:

    地址:變量對應L區的juedui地址。這個地址由系統分配,不能由編程者輸入。每增加一個變量或者插入一行,地址自動改變。并且如果編程當前正在用符號名編程的時候,增刪行導致的地址變更,不會影響編程關系。相反,如果正在用地址編程,而你又增刪過行,那么程序地址將會混亂。

    符號:這個是變量的名字。如果正在用地址編程的時候,此時修改名字,不會影響已寫好的程序。相反,如果正在用符號編程,此時修改名字,那么程序符號立即紅色報錯,程序已找不到這個名字了。

    變量類型:無法修改。輸入參數填寫在IN行。輸入/輸出參數填寫在IN_OUT行。輸出參數填寫在OUT行。臨時變量在Zui后TEMP。填寫完畢會自動增加新行。

    IN類型表示子程序運行的數據來源,就像上述例子的4個加數。

    OUT類型表示經過子程序的運算,得到的結果。輸出在這個位置。

    IN/OUT類型,組合兩種類型,先輸入給子程序再運算得到結果輸出到相同的位置。

    TEMP類型,這個類型既不輸入也不輸出,僅僅在子程序中充當過渡用的中間變量。

    數據類型:這個參數是一個點位還是一個字節還是一個浮點數等等的性質。這個下拉選擇將會影響地址欄的分配跨度。因為不同的類型占用不同的位長。

    注釋:給自己看的一些關于本行變量的備忘信息。

    到此,一個帶參數的子程序就已經完成了。雖然并沒開始編寫子程序的內容,但是你已經可以觀察一下由主程序調用這個子程序的樣子。如圖5所示。

    圖片 

    圖5 子程序調用

    網絡1是當子程序沒有填寫變量表的時候的樣子,它不帶任何參數。網絡2是剛才建立了變量表的求和子程序。此時的子程序未確定任何實質性的參數地址。點擊每個問號地方,按照題目要求左側輸入VW0;VW2;VW4;VW6,右側輸入VW100,調用基本就完成了。

    子程序輸入輸出參數的排序會按照你剛才填寫變量表的先后順序布置。在實際程序中,你zuihao在向子程序編程之前先確認一下這個外觀效果,每一個輸入輸出參數是否能夠按照使用的習慣排列所有參數。例如我們表達一個長方體的尺寸的時候通常都說“長寬高”,沒有人會說“高長寬”的次序的。這個就是習慣。當參數很多的時候,盡量按照有關習慣填寫變量表的順序。可以用插入刪除行的方法編輯次序。

    第四步

    對子程序編程。

    子程序內的加法過程的編程在此就省略了。其實就是圖1的子程序。只不過是將全部的MW改寫成LW就可以了。

    好了,一個帶參數的子程序就完整建立完畢了。它將會出現在指令樹里面項目的程序塊里面。它因為本身就是一個子程序,所以也是顯示為一個子程序。

    后面的內容更精彩。可能不是你想象的那回事哦。——帶參數子程序的參數傳遞過


    聯系方式

    • 電  話:18126392341
    • 聯系人:梁濤
    • 手  機:15267534595
    • 微  信:15267534595