RM新时代注册|首入球时间

<div id="4aewj"></div>

    
    
      1. <rp id="4aewj"><nobr id="4aewj"><s id="4aewj"></s></nobr></rp>
        歡迎光臨大柏電子科技(上海)有限公司
        當前位置
        首頁 > 新聞中心
        西門子STL間接尋址常問問題集
        2020/11/23 21:47:36

        1.1如何獲得指針或者間接尋址有關的信息?
        指針的類型包括16位指針、32位指針、Pointer(6Byte)和Any(10Byte)。16位指針用于定時器、計數(shù)器、程序塊的尋址;32位指針用于I/Q/M/L/數(shù)據(jù)塊等存儲器中位、字節(jié)、字以及雙字的尋址,其中第0~2位表示位地址(0~7)、第3~18位為字節(jié)地址,其余位未定義;Pointer和Any一般應用在復雜數(shù)據(jù)類型(比如Date_and_Time /Array/String等)在FB、FC之間的傳遞。而Any可以看做是對Pointer的延伸,因為由10Byte組成的Any中Byte4~Byte9就是一個Pointer。
        了解指針的格式十分重要,為正確使用指針,應閱讀如下內(nèi)容:
        1、 "SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 參數(shù)類型
        2、文檔:1008用于S7-300 和S7-400 的語句表(STL)編程
        3、文檔:F0215,S7-300和S7-400尋址

        1.2為什么語句 LAR1 P##PointerInput 在一個函數(shù)(FC)中是無效的,然而,同樣的語句在一個功能塊(FB)中是有效的?
        在FC被調用時,復雜數(shù)據(jù)類型例如指針是被復制到調用者的臨時變量區(qū)中,在FC內(nèi)部對此V區(qū)地址直接取址放入到地址寄存器AR1或AR2是不被編譯器規(guī)則接受的(導致MC7寄存器信息過長),也就是說在FC內(nèi)部通過P#進行地址寄存器取址僅能支持Temp臨時變量。因此如果需要在FC中操作指針等復雜輸入輸出變量地址需要使用累加器進行中轉。
        考慮到程序的一致性、遵守編譯器規(guī)則和STL手冊中LAR1指令說明,建議用戶使用如下指令操作:
        L P##PointerInput
        LAR1

        1.3 STEP 7 中哪些操作會覆蓋DB/DI寄存器或者地址寄存器AR1/AR2的內(nèi)容?
        下面說明了可能引起DB/DI寄存器或者地址寄存器AR1/AR2內(nèi)容改變的一些操作:

        • DB寄存器和AR1受到影響的操作
          1. 使用完整的DB路徑(如L DB20.Val)或者調用FC/FB時使用DB塊完整地址作為其參數(shù),則DB寄存器內(nèi)容被覆蓋。
          例如在OB1中調用FC1后,DB寄存器變成20。
          OPN DB1
          Call FC1
          Input(bit):DB20.DBX0.2
          因此在編程的時候,OPN 指令打開數(shù)據(jù)塊,通過DBX x.y的方式訪問其中內(nèi)容, 但是如果在打開數(shù)據(jù)塊后DB寄存器的內(nèi)容被修改了,則DBX x.y的方式訪問變量則 會訪問到錯誤的地址??梢酝ㄟ^使用符號尋址的方式或者使用完整路徑編程避免,當 然重新使用 OPN指令也是可以的。
          2. 調用FC時使用string, array, structure ,UDT作為其形參或者調用FB時使用string, array, structure 或者UDT作為其in out形參,在FC/FB程序中訪問這些地址則AR1寄存器內(nèi)容被覆蓋,因此當使用AR1進行間接尋址時需要注意AR1內(nèi)容的正確性。
        • AR2地址寄存器和DI寄存器在FB中作為參數(shù)和靜態(tài)變量的基址尋址使用。AR2和DI如果被修改,會影響FB的參數(shù)訪問,如果希望在FB中使用DI寄存器或者地址寄存器AR2,必須預先保存它們中的內(nèi)容,并在使用后恢復它們,例如:
          TAR2 #AR2_SAVE; //AR2寄存器狀態(tài)保存到#AR2_SAVE
          L                     DINO;
          T                     #DB2_SAVE; //DI寄存器狀態(tài)保存到#DB2_SAVE

        User Program

        LAR2             #AR2_SAVE; //AR2寄存器恢復到使用前狀態(tài)
        OPN             DI [#DB2_SAVE]; //DI寄存器恢復到使用前狀態(tài)

        1.4 如何得到多重背景FB中的變量在背景DB里的絕對偏移量呢?
        可以用下面的方法處理:
        TAR2 (得到多重背景FB在背景DB里的偏移地址)
        AD DW#16#00FFFFFF (屏蔽掉存儲區(qū)ID,可參考32位指針格式)
        L P##Variable (得到變量在多重背景FB里的地址)
        +D (多重背景FB的偏移地址與變量在多重背景FB里地址相加,即得到實際絕對偏移量)
        LAR1
        上述語句就是就得到了變量在背景DB中的絕對偏移量,從而供后續(xù)程序處理。

        1.5如何在程序中使用ANY 型指針?

        簡要說明如下:
        L             P##Input                 //指向存儲地址指針I(yè)nput首地址
        //這個參數(shù)是一個Any類型,P##Input指向參數(shù)Input的值所在地址,這就是指針的指針
        LAR1                                                                 //裝載到地址寄存器AR1中。
        L                 W [AR1,P#4.0]             //打開DB塊
        // 由Any類型結構知道Any類型的Byte4、Byte5存放的數(shù)據(jù)塊號
        T                 #BLOCK_NO
        OPN             DB [#BLOCK_NO]                 //如果是DB塊,打開指定的DB塊。
        L                 W [AR1,P#2.0] //判斷ANY指針中數(shù)據(jù)長度
        // Any類型的Byte2、Byte3是重復系數(shù),如P#DB1.DBX0.0 Byte 8后面的Byte 8
        _001:T             #DATA_LEN                     //通常此處做loop循環(huán)!!
        L                 D [AR1,P#6.0]                         //找出需要計算數(shù)據(jù)區(qū)的開始地址
        // Any類型Byte6~Byte9是32位區(qū)域地址
        理解Pointer、Any的類型的數(shù)據(jù)結構,對于正確使用指針有很大幫助。
        為正確使用指針,應仔細閱讀如下內(nèi)容:
        "SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 參數(shù)類型

        如下的程序實現(xiàn)了SFC20的部分功能,可以作為Any使用的參考。
        FUNCTION FC 1 : VOID
        TITLE =
        VERSION : 0.1
        VAR_INPUT
        SRCBLK : ANY ;
        END_VAR
        VAR_OUTPUT
        RETVAL : INT ;
        DSTBLK : ANY ;
        END_VAR
        VAR_TEMP
        LOOP : INT ;
        BLOCK_NO_DB : WORD ;
        BLOCK_NO_DI : WORD ;
        SRC_ADD : DWORD ;
        DST_ADD : DWORD ;
        END_VAR
        BEGIN
        NETWORK
        TITLE =
        L P##SRCBLK; //讀取輸入any的首地址
        LAR1 ; //裝載到ar1
        L P##DSTBLK; //讀取輸出any的首地址
        LAR2 ; //裝載到ar2
        L W [AR1,P#4.0]; //打開DB塊
        T #BLOCK_NO_DB;
        L W [AR2,P#4.0]; //打開DI塊
        T #BLOCK_NO_DI;
        OPN DB [#BLOCK_NO_DB]; //打開DB塊
        OPN DI [#BLOCK_NO_DI]; //打開DI塊
        L D [AR1,P#6.0];
        T #SRC_ADD; //讀取地址
        L D [AR2,P#6.0];
        T #DST_ADD; //讀取地址

        L W [AR1,P#2.0]; //讀取循環(huán)次數(shù)
        _001: T #LOOP;
        L DBB [#SRC_ADD];
        T DIB [#DST_ADD]; //賦值
        //地址偏移1個字節(jié)
        L P#1.0;
        L #SRC_ADD;
        +D ;
        T #SRC_ADD;
        L P#1.0;
        L #DST_ADD;
        +D ;
        T #DST_ADD;
        L #LOOP; //循環(huán)
        LOOP _001;
        END_FUNCTION

        1.6 當FC 或FB的輸入?yún)?shù)類型為:BLOCK_DB, TIMER或者 COUNTER,如何確定其編號?
        例1 :FB 塊
        FB1 變量聲明中定義了“ Timer” 類型的變量“ Time_1” ,在 FB2 中調用 FB1,將定時器“T5”傳遞給變量“ Time_1”。如圖 01 所示程序代碼中數(shù)值 5 表示“T5”。


        圖 01 FB中確定定時器編號

        在使用多重實例時,需要在圖 01 所示程序中增加以下代碼:
        TAR2 //多重實例偏移地址
        LAR1 P##Time_1
        +AR1 //多重實例偏移地址與當前地址相加
        L W[AR1,P#0.0]
        T MW0
        例 2 FC
        FC1 變量聲明中定義了“ Timer” 類型的變量“ Time_1” ,在 FC2 中調用 FC1,將定時器“T8”傳遞給變量“ Time_1”。如圖 02 所示程序代碼中數(shù)值 8 表示“T8”。


        圖 02 FC中確定定時器編號

        “BLOCK_DB”類型參數(shù)在調用 FC 時不可以直接傳送給 FC 。如果在調用功能時試圖使用此參數(shù)類型,將產(chǎn)生如下的錯誤消息: “非法的參數(shù)傳輸<參數(shù)名>” ?!癇LOCK_DB”類型參數(shù)僅在 FB 被調用(從一個 FB 或 FC 中)時可被傳送。 “BLOCK_DB”類型參數(shù)不可以在 FC 被調用(從一個 FB 或 FC 中)時可被傳送。
        相關詳細信息可參考 STEP7 在線幫助中“合法的傳輸參數(shù)類型”。
        然而,如果希望將 BLOCK_DB 參數(shù)類型傳送給 FC, DB 塊的編號可以通過基本數(shù)據(jù)類型(例如 WORD)傳送。 在下面的例子中,F(xiàn)B100 擁有一個“BLOCK_DB” 的輸入?yún)?shù)類型。為了在調用 FC101 時將參數(shù)傳送給它,“BLOCK_DB”中的 DB 塊編號被傳送給 WORD 臨時變量(DB_No)。當 FC 被調用,數(shù)據(jù)塊序號以一個 WORD 參數(shù)類型替代 BLOCK_DB 參數(shù)類型。


        圖 03 FB中確定Block_DB編號

        如果 FB 的接口參數(shù)能被定義成 WORD 參數(shù)類型來傳送 DB 塊編號,當 FC 被調用時,此參數(shù)可以被直接傳送給 FC。


        圖 04 FC中確定DB編號

        1.7 參數(shù)傳遞有何限制?
        當分配實際參數(shù)給形式參數(shù)時,可以指定絕對地址、符號名稱或常數(shù)。STEP 7 限制不同參數(shù)的分配。例如,輸出和輸入/輸出參數(shù)不能被分配常數(shù)值(因為輸出或輸入/輸出參數(shù)的目的是改變其值)。這些限定尤其適用于具有復雜數(shù)據(jù)類型的參數(shù),這些參數(shù)既不能分配絕對地址也不能分配常數(shù)。下表關明涉及分配給形式參數(shù)的實際參數(shù)數(shù)據(jù)類型的限制(--)和允許的分配(由 符號顯示)。


        圖 05 允許的參數(shù)傳遞

        詳細信息請參考手冊中附錄27.3.4.8節(jié)內(nèi)容:45531107

         

        1.8 如何傳遞any參數(shù)到其他程序塊的參數(shù)中?
        下面的例子將說明如何為系統(tǒng)功能 SFC50 “RD_LGADR” (讀取模塊邏輯地址)參數(shù)化 ANY 指針。例如對于功能塊 FB1,按下述步驟編程:
        1. 聲明一個輸入變量“test”和一個臨時變量“test2”為 ANY 類型(圖05)。
        2. 例如,把 SFC50 的參數(shù)“PEADDR”傳遞給變量“test2”(圖06)。
        3. 通過判斷 ANY 指針“test”,能夠傳遞臨時變量“test2”的數(shù)據(jù)。


        圖 06 any的臨時變量傳遞

        語句 L P##test 先把地址加載到 Accu1,然后通過語句 LAR1 把地址加載到地址寄存器 AR1 (可簡寫為:LAR1 P##test)。每次讀取地址寄存器 AR1 并存儲數(shù)據(jù)(例如 T LW0)到臨時變量“test2”(ANY 指針)中。Network 1 中的語句復制數(shù)據(jù)傳送到功能塊 FB1 的 ANY 數(shù)據(jù)到臨時變量“test2”。


        圖 07 臨時變量的建立

        1.9 如何通過UC或CC指令調用FB?
        當使用UC,CC指令調用不帶參數(shù)的FB可以通過手動修改DI值的方式進行背景數(shù)據(jù)塊的動態(tài)分配,此操作相當于模仿系統(tǒng)調用FB的過程。
        例如: OPN DI[FB1_DI_Number]
        LAR2 P#DBX0.0
        UC FB1

        關鍵詞
        間接尋址,指針,地址寄存器

        聯(lián)系方式
        CONTACT US

        電話:15721373211

        郵箱:15721373211@139.com

        網(wǎng)址:http://openxml.net/

        地址:上海青浦區(qū)北青公路7171號111-112室

        用手機掃描二維碼關閉
        RM新时代注册|首入球时间
        <div id="4aewj"></div>

          
          
            1. <rp id="4aewj"><nobr id="4aewj"><s id="4aewj"></s></nobr></rp>
              <div id="4aewj"></div>

                
                
                  1. <rp id="4aewj"><nobr id="4aewj"><s id="4aewj"></s></nobr></rp>
                    RM新时代网站 新时代RM平台官网 新时代RM娱乐app软件 RM新时代平台 RM新时代平台网址