<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> plc工業軟件使用 >> 正文

      西門子S7-200子程序,多次調用的“怪”現象

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2023/8/5

      西門子S7-200子程序,多次調用的“怪”現象

      在S7-200編程中,子程序想必大家都用過,使用子程序可以更好地組織程序結構,便于閱讀和調試,也可以縮短程序代碼。但是使用子程序也有一些需要注意的地方,除了子程序在同一周期內被多次調用時,不能使用上升沿、下降沿、定時器和計數器之外,還有子程序中局部變量的特點,在編程多次調用帶參數子程序時要特別注意。下面就是前些天熱線上遇到的一個Case,非常有代表性,在這里跟大家分享。

      E:您好,西門子技術支持。
      C:您好,我想問下,200子程序是不是多次調用時會不好使?
      E:不會啊,您是不是在子程序里使用了沿指令或者定時器?
      C:沒有啊,我就編了一句很簡單的開關程序,開關閉合,線圈導通,然后主程序里調用了兩次這個子程序,結果第一個I點閉合了,兩個Q點都導通了。
      E:(心里活動:看來是和子程序的局部變量有關了,估計客戶程序邏輯有問題)那請您描述一下您的子程序吧,我幫您看看。
      于是客戶描述了一下自己的程序,大致了解了之后告知客戶我這邊測試下,稍后回復。
      客戶的程序是這樣的:
      子程序:是個常見的自保持邏輯,接口參數如紅框所示。

       

      圖. 01

      主程序:調用了兩次上面的子程序,實現I0.0和I0.1控制Q0.0的閉合和斷開,I0.2和I0.3控制Q0.1的閉合和斷開。

       

      圖. 02

      那么在線測試下程序執行情況,發現果然如客戶所描述的,I0.0為1后,Q0.0和Q0.1都為1了。見下圖.03所示。而如果閉合I0.2,則Q0.0和Q0.1都斷開。
       

      圖. 03

      為什么會這樣呢?首先我們先明確子程序局部變量的特點。局部變量的變量類型分為四種:IN,IN_OUT,OUT和TEMP,局部變量存儲區是在子程序調用時開辟的,子程序調用完成,局部變量占用的存儲空間釋放。
      我們來分析下客戶的子程序。
      在主程序第一次調用子程序時,如果I0.0為1,I0.1為0,它們將自身值分別傳給輸入局部變量#AA和#BB,子程序中程序邏輯執行如下圖.04所示。此時局部變量#CC值為1,子程序完成,#CC將值傳送到輸出參數Q0.0上,使其置1。根據局部變量的特點,子程序第一次調用完成后,局部變量存儲區釋放。

       
      圖. 04
      那么當主程序第二次調用該子程序時,開辟臨時存儲空間,但是此時的存儲空間與第一次調用時開辟的不一定一致。可是,也有可能由于程序簡單,仍然使用第一次調用時占用的存儲空間。如果這種情況發生了,那么第一次調用時已經將#CC的L0.2置了1,而此值依舊存在,那么第二次調用時雖然輸入參數I0.2和I0.3為0 ,但是#CC(L0.2)為1,由于客戶的子程序邏輯有自保持部分,所以最后L0.2的邏輯結果仍然是1。子程序完成后,#CC將值傳送到輸出參數Q0.1上,使其置1。所以就會出現客戶反映的那種問題。
      那么該如何避免這種情況呢?
      大家是否還記得剛剛介紹局部變量參數類型時除了IN, OUT類型外,還有一種類型叫IN_OUT,這種類型的參數是先讀入,然后再寫出,這里我們就可以利用它的特點解決上面的問題。
      下面對子程序的參數進行修改,將原先的#CC變量類型改為IN_OUT。如下圖所示:

       
      圖. 05

      主程序結構不變,如下所示,可以看到由于#CC的類型是IN-OUT,它在子程序塊的接口位置也轉到了左側輸入側。

       

      圖. 06
      下面再次將I0.0置1,其他輸入都為0,監控程序狀態,如圖.07所示,可以看到只有Q0.0為1,Q0.1狀態為0。而如果將I0.1置1, Q0.0被復位,Q0.1還是0,這樣就符合客戶的控制要求了。

       

      圖. 07

      同樣,如果只給I0.2置1,那么也只有Q0.1會亮,不會再影響Q0.0。
      了解了IN_OUT類型變量的特點,就不難分析以上的結果。因為每次調用子程序時,局部變量#CC都會先去讀取輸入參數Q0.0或Q0.1的狀態,所以即使兩次調用子程序時,#CC變量使用的同一區域,該區域的值也會在開始被Q點的狀態所修改,就不存在兩次調用相互影響的情況了。
      另外,如果在子程序一開始就添加一條指令,對局部變量#CC進行賦初值(如圖.08),也可以避免臨時變量區數值不定的問題,您可以嘗試測試下

       
      圖. 08
      所以,在編寫200子程序時要特別注意局部變量的特點,一旦出現多次調用不正常的情況,就可以從局部變量的特點出發分析,看看是不是存在隱患。善加利用IN_OUT變量也許可以解決許多問題。
       


       

      Tags:子程序調用,子程序,step7,S7-200  
      責任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      最新推薦
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 伊人久久大香线蕉综合影| 丁香色欲久久久久久综合网 | 色婷婷五月综合丁香中文字幕| 97se亚洲综合在线| 好吊色青青青国产综合在线观看| 综合国产在线观看无码| 久久婷婷五月综合国产尤物app| 伊人久久大香线蕉综合网站 | 99久久国产综合精品2020| 色噜噜狠狠狠狠色综合久| 久久久久久久综合| 日日狠狠久久偷偷色综合96蜜桃| 亚洲欧洲自拍拍偷综合| 久久综合一区二区无码| 国产综合成人亚洲区| 伊人久久大香线蕉综合热线| 国产成人亚洲综合| 国产成人久久综合二区| 欧洲 亚洲 国产图片综合| 色欲人妻综合AAAAA网| 国产美女亚洲精品久久久综合| 国产精品综合视频| 亚洲国产精品综合久久网络| 狠狠综合亚洲综合亚洲色| 另类小说图片综合网| 色综合久久综合中文小说| 亚洲AV综合色区无码一二三区 | 一本一道色欲综合网中文字幕 | 久久精品水蜜桃av综合天堂| 一本一本久久aa综合精品| 国产亚洲欧洲Aⅴ综合一区| 婷婷五月六月激情综合色中文字幕| 91丁香亚洲综合社区| 狠狠色婷婷丁香综合久久韩国| 色综合小说久久综合图片| 亚洲国产成人久久综合一区77| 久久99亚洲综合精品首页| 情人伊人久久综合亚洲| 伊人情人综合成人久久网小说 | 一本一道色欲综合网中文字幕| 成人综合久久综合|