色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

帶參數子程序的參數傳遞過程

mingxiaoai ? 來源:從零學PLC ? 作者:從零學PLC ? 2022-10-17 09:50 ? 次閱讀

第三篇 帶參數子程序的參數傳遞過程

一份程序中建立多個子程序,每個子程序完成相對比較獨立的功能。而子程序也是圍繞主程序的要求,并且還根據主程序給出的條件完成這個要求。此時主程序和子程序之間或者說子程序和它下級的子程序之間,就必然有一些數據的交流。下面將介紹一下這種參數的傳遞。

再提一下變量表,子程序里面的變量表,這是最重要的上下級程序之間數據傳遞的方式,但不是唯一的方式。主程序把將要給子程序的數值擺放在一個或一片約定的全局地址,然后子程序讀取這些全局的地址……這種做法作為傳遞參數,最簡單不過。但是,這里不討論這樣的傳遞方式。

現在隨便做一個子程序,觀察一下在主程序中調用時候的外觀。

62893bb2-4d44-11ed-a3b6-dac502259ad0.png

圖1

62a8b578-4d44-11ed-a3b6-dac502259ad0.png

圖2

如圖1所示是在主程序里面調用SBR_0的情況,還有一個常見的計數器指令。如圖2所示是SBR_0中變量表所填入的變量設置。

圖1中一個標注SBR_0的指令塊跟計數器指令外觀很相似。但是各自的接口和參數都不同。它們都有觸點接口和數據接口。現在看看子程序的調用,主程序通過什么渠道把參數傳遞到子程序。

SBR_0左邊上方開始有兩個連接著開關觸點的接口。

【EN】有能流表示執行這個子程序。沒有能流的話將從子程序門口經過,不進入子程序。一個子程序就算沒有任何參數都會有這個接口的。

【點輸入1】下邊也是一個能流型的接口,表示這里有一個開關量的能流輸入。

當鼠標指向這個指令塊的時候,會彈出一個框,如圖3所示。這里說明了所有參數的變量類型(in;in/out;out)和數據類型(b;B;W;D)。

62cef97c-4d44-11ed-a3b6-dac502259ad0.png

圖 3

【字輸入】從彈框得知這是一個字型的輸入參數。這里接口必須填寫一個字型的變量或者常數。

【點輸入2】這也是一個布爾量的輸入參數,但是因為有其余類型的參數分割,導致沒有從開始處連續排列布爾量的輸入參數,所以這個布爾量輸入也顯示為數據接口形式。

【字節入出】從彈框得知這是一個輸入輸出雙向的參數,需要填入一個字節型的變量。

【字輸出】這個參數在右側,位置上已經表明這是一個輸出型的參數。

綜上所述,輸入型的參數將安排在左側的最上方,并且如果上方有連續的開關量,都會以能流的形式連接這個參數。接下來是數據型的輸入參數接口。然后下方是雙向的參數接口。右邊一律是數據接口形式連接所有輸出參數。

上級程序就是通過這樣的接口把子程序所需的參數傳入到子程序的,再進入到子程序里面。接下來看看子程序方面,得到的參數將會是如何出現的。

觀察上面圖2這個變量表。自從建立了這個變量表開始,子程序里面的L地址的前面部分就已經成為了子程序參數的載體。L地址從第一個字節開始,往后安排IN參數;IN/OUT參數;OUT參數。按照字節為最小占用單位來安排能流接口的參數,從L0.0開始向更高位連續安排,EN不占用地址。對于布爾量,一個布爾量點占用整個字節,八個以內的連續布爾量點也占用一個字節。下一個非布爾量參數或者不同類型變量(IN、IN/OUT、OUT)從下一個字節開始安排。所以【點輸入1】參數分配到L0.0,【字輸入】參數分配到LW1。【字節入出】參數分配到LB4。然后子程序使用上級傳遞的參數就只要讀取這些L地址就可以得到。

外面的情況了解了,里面的情況也了解了,參數傳遞……沒說完,還有最不為人知的一部分。

——中間的過程。

中間過程就像一份快遞的工作,在上級下級程序之間搬運數據。只要子程序被調用,那么快遞就會把指定的數據傳送到子程序內。子程序結束后,快遞又會把指定的參數傳送到上級程序的接口。要是沒有接口參數自然沒有這個崗位。

作為用戶程序,只要上級程序把參數放置到位,又在子程序里面存取對應的L地址,中間怎么從上級傳達到下級是無需做任何事情的。這個過程由系統代勞了。但不等于不用理解這個過程。你不知道的事情可能恰恰就在這里。做以下的程序實驗一下。

6339119a-4d44-11ed-a3b6-dac502259ad0.png

圖4

建立三個子程序,各自就只有變量表填寫了一行參數,如圖4所示。子程序里面無任何用戶程序。主程序編輯這樣的調用邏輯。把程序下載到PLC,看看執行會怎樣?

PLC運行后,由于程序存在QB0和M0.0,沒有任何用到的其他地址了,所以我們的焦點就關注著這兩個地方,而QB0更是最容易看見。此時輸出點還是熄滅的。用狀態表把M0.0寫入1,與此同時QB0也顯示2#10010000(注意硬件的燈高位在右側,書寫二進制高位在左側。)然后把M0.0寫入0,此時QB0變成顯示2#11001100。我們再次把M0.0寫入1之后QB0再次顯示2#10010000 。

為什么輸出點會有這樣的三種狀態呢?用戶程序完全沒有對輸出點做過邏輯和賦值,而子程序里面也沒有任何程序。能夠有動作的只能是系統的動作了。究竟會是什么時候使輸出點得到了一些值?程序里面唯一跟QB0有點關系的就是SBR2子程序了。為什么SBR0、SBR1兩個子程序的值會到了SBR2子程序里面去的?那么就要理一理參數傳遞的中間過程了。

運行初期,網絡1不接通,網絡2沒產生邊沿信號。前兩個子程序都沒有調用。唯獨第三個子程序SBR2一直在調用。

接通M0.0,SBR0得到了執行。在進入子程序后,運行子程序用戶指令之前,系統把引腳上的IN參數值復制到了LB0。然后執行子程序的用戶程序,由于沒有程序可運行,退出了子程序。

網絡2沒有執行子程序。網絡3一直在執行。SBR2子程序沒有輸入參數,沒有子程序內容,離開子程序之前,系統必須要給一個值到輸出參數。系統的這個動作不會因為程序中有沒有內容或者說程序執行的怎么樣,而不去做這個傳送,它是必然會做這個動作的。那么這個時候,LB0到底是一個什么值呢?我們就要追溯到這個LB0最后賦值的是什么地方。之前由于執行SBR0輸入參數使LB0曾經有過2#10010000這個值。這個值由于遵從多重賦值的原因,這個值在當時產生,一直擱置到現在,被SBR2撈上來了,然后就給了QB0。當M0.0恢復到0時,SBR1前的上升沿發生了,調用了一次。就這一次,把LB0寫入了2#11001100。在沒有什么地方再給LB0寫入值的情況下,LB0將不會改變。(當一個子程序不調用的時候,并不會由此使得某些線圈、某些地址自動復位為零,但是仍有不少的人有這樣的錯覺。)大家也可以參考M0.0,編程軟件寫入了的值可以一直保持住的。你沒有去更改它,還有誰去修改它?所以把一個值寫入到某地址之后,就可以一直保持住,SBR2也就可以輸出2#11001100這個值。

手冊并沒有說明局部儲存區的值是從何而來,手冊上面有一段話,如圖5所示。

637894fa-4d44-11ed-a3b6-dac502259ad0.png

圖 5

我有一個觀點,當手冊沒有清楚說明的情況下,我會假設一種較為合理的假設,然后在日后的編程中一直證實這個假設,并使用這種假設,同時一直關注著這個問題。假如一直使用都沒有明確顯示這種假設不成立,將認為這是真的,繼續使用。我總覺得PLC只會按照有限的法則以固定的方法實施一些運算。既然一個假設一直沒有被推翻,那么這個假設可能永遠也不會被推翻。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7002

    瀏覽量

    88943
  • 參數
    +關注

    關注

    11

    文章

    1829

    瀏覽量

    32195
  • 程序
    +關注

    關注

    117

    文章

    3785

    瀏覽量

    81004

原文標題:使用S7-200 SMART 編寫一個自己的指令-3

文章出處:【微信號:從零學PLC,微信公眾號:從零學PLC】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    linux驅動模塊參數傳遞方式

    在嵌入式linux應用開發中,可以給main()函數傳遞參數,這樣應用程序就能知道最初的控制參數是什么,當然也可以選擇不向應用程序
    發表于 08-09 09:10 ?670次閱讀
    linux驅動模塊<b class='flag-5'>參數</b><b class='flag-5'>傳遞</b>方式

    在C函數中的傳遞參數過程是怎樣實現的

    在C函數中的傳遞參數過程是怎樣實現的?求解
    發表于 10-19 06:25

    如何實現參數子程序的設計?

    while語句怎么用?如何實現參數子程序的設計?
    發表于 01-18 06:48

    匯編的子程序函數參數和返回值怎么判斷?

    怎么知道一個子程序有沒有函數參數,有幾個函數參數,函數參數的數據類型是什么
    發表于 10-19 07:21

    匯編語言學習課件_子程序與宏指令設計

    第六章 子程序與宏指令設計 6.1 子程序結構及設計方法 6.2 子程序參數傳遞 6.3 嵌套與遞歸
    發表于 12-31 10:41 ?0次下載

    子程序(函數)傳遞

    易語言是一門以中文作為程序代碼編程語言學習例程:子程序(函數)傳遞
    發表于 06-07 10:41 ?3次下載

    伺服定位子程序接線圖

    伺服定位子程序接線圖(M2J2S.1PG)[詳細注釋]
    發表于 12-10 12:57 ?17次下載

    函數參數傳遞的原理

    參數傳遞,是在程序運行過程中,實際參數就會將參數傳遞
    的頭像 發表于 03-02 11:41 ?7334次閱讀
    函數<b class='flag-5'>參數</b><b class='flag-5'>傳遞</b>的原理

    程序開發如何跳轉頁面和實現參數傳遞與視圖層顯示

    最近在研究小程序開發,看了一些官網文檔,我們今天就來學習一下如何跳轉,順便把跳轉過程中的參數傳遞,以及接收賦值到模板中顯示學習了。
    的頭像 發表于 02-18 12:15 ?2661次閱讀

    PLC創建庫文件與參數子程序功能該如何使用

    在S7-200SMART系列PLC的子程序中,子程序可以分為兩類,一類為不帶參數子程序,另一類為參數
    的頭像 發表于 10-28 11:06 ?3975次閱讀

    KUKA機器人將參數傳遞子程序的步驟

    建議:始終將一個參數傳遞到相同數據類型的變量中。可以將參數傳遞到另一個數據類型中,但是有特定的限制。
    的頭像 發表于 01-08 16:07 ?3682次閱讀

    KUKA機器人:將參數傳遞子程序或函數中V1.28版

    從一個主程序中可以將參數傳遞到局部或全局子程序和函數中。
    的頭像 發表于 01-31 13:43 ?2635次閱讀

    KUKA機器人:將參數傳遞子程序或函數中V1版

    這種傳遞方式也稱為 “Call by Reference”。建議:始終將一個參數傳遞到相同數據類型的變量中。可以將參數傳遞到另一個數據類型中
    的頭像 發表于 03-02 09:33 ?908次閱讀

    KUKA機器人將參數傳遞子程序或函數中V1.28版

    建議:始終將一個參數傳遞到相同數據類型的變量中。可以將參數傳遞到另一個數據類型中,但是有特定的限制。
    的頭像 發表于 03-02 11:09 ?932次閱讀

    如何才能獲取LabVIEW程序中的傳遞參數呢?

    有些場景下,我們用LabVIEW開發的應用程序,需要通過命令行來調用,并向該應用程序傳遞參數,那么在程序中如何才能獲取這些
    的頭像 發表于 10-11 09:26 ?1236次閱讀
    如何才能獲取LabVIEW<b class='flag-5'>程序</b>中的<b class='flag-5'>傳遞</b><b class='flag-5'>參數</b>呢?
    主站蜘蛛池模板: 久久精品观看| 菠萝视频高清版在线观看| 精品视频网站| 中文字幕在线免费观看视频| 免费人成在线观看视频不卡| 99久久久久精品国产免费麻豆 | 中文字幕欧美日韩VA免费视频| 免费的好黄的漫画| 国产精品97久久AV麻豆| 亚洲欧美日韩精品自拍 | 久久综合电影| 最近中文字幕2018MV高清在线| 亚洲 欧美 制服 视频二区| 久久婷婷国产五月综合色啪最新| 草久久久久| 办公室沙发口爆12P| 亚洲色图激情文学| 日韩久久影院| 精品无人区麻豆乱码1区2| 饥渴的40岁熟妇完整版在线| 护士们的母狗| jk白丝袜美女被男人桶| 亚洲乱色视频在线观看| 日本电影护士| 老师紧窄粉嫩| 精品福利一区| 久久麻豆国产国产AV| 么公在浴室了我的奶| 黑人干肥婆| 久久亚洲国产成人影院| 男女免费观看在线爽爽爽视频| 欧美成人3d动漫专区| 久久久无码精品一区二区三区| 国产麻豆91网在线看| xxxxhdvideos动漫| 97在线观看免费视频| 一二三四韩国免费观看| 久久精品在现线观看免费15| 国产 日韩 欧美 高清 亚洲| 伊人久久伊人| 亚洲精品免播放器在线观看|