RM新时代专业团队

<del id="m9z9f"></del>

      <menuitem id="m9z9f"><option id="m9z9f"><progress id="m9z9f"></progress></option></menuitem>

      <tt id="m9z9f"><option id="m9z9f"><thead id="m9z9f"></thead></option></tt>
        <rt id="m9z9f"></rt>

        <rt id="m9z9f"></rt><menuitem id="m9z9f"></menuitem>
        1. <nav id="m9z9f"></nav>

              RM新时代专业团队

              歡迎光臨大柏電子科技(上海)有限公司
              當前位置
              首頁(yè) > 新聞中心
              西門(mén)子STL間接尋址常問(wèn)問(wèn)題集
              2020/11/23 21:47:36

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

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

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

              • DB寄存器和AR1受到影響的操作
                1. 使用完整的DB路徑(如L DB20.Val)或者調用FC/FB時(shí)使用DB塊完整地址作為其參數,則DB寄存器內容被覆蓋。
                例如在OB1中調用FC1后,DB寄存器變成20。
                OPN DB1
                Call FC1
                Input(bit):DB20.DBX0.2
                因此在編程的時(shí)候,OPN 指令打開(kāi)數據塊,通過(guò)DBX x.y的方式訪(fǎng)問(wèn)其中內容, 但是如果在打開(kāi)數據塊后DB寄存器的內容被修改了,則DBX x.y的方式訪(fǎng)問(wèn)變量則 會(huì )訪(fǎng)問(wèn)到錯誤的地址??梢酝ㄟ^(guò)使用符號尋址的方式或者使用完整路徑編程避免,當 然重新使用 OPN指令也是可以的。
                2. 調用FC時(shí)使用string, array, structure ,UDT作為其形參或者調用FB時(shí)使用string, array, structure 或者UDT作為其in out形參,在FC/FB程序中訪(fǎng)問(wèn)這些地址則AR1寄存器內容被覆蓋,因此當使用AR1進(jìn)行間接尋址時(shí)需要注意AR1內容的正確性。
              • AR2地址寄存器和DI寄存器在FB中作為參數和靜態(tài)變量的基址尋址使用。AR2和DI如果被修改,會(huì )影響FB的參數訪(fǎng)問(wèn),如果希望在FB中使用DI寄存器或者地址寄存器AR2,必須預先保存它們中的內容,并在使用后恢復它們,例如:
                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 (屏蔽掉存儲區ID,可參考32位指針格式)
              L P##Variable (得到變量在多重背景FB里的地址)
              +D (多重背景FB的偏移地址與變量在多重背景FB里地址相加,即得到實(shí)際絕對偏移量)
              LAR1
              上述語(yǔ)句就是就得到了變量在背景DB中的絕對偏移量,從而供后續程序處理。

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

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

              如下的程序實(shí)現了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]; //打開(kāi)DB塊
              T #BLOCK_NO_DB;
              L W [AR2,P#4.0]; //打開(kāi)DI塊
              T #BLOCK_NO_DI;
              OPN DB [#BLOCK_NO_DB]; //打開(kāi)DB塊
              OPN DI [#BLOCK_NO_DI]; //打開(kāi)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)次數
              _001: T #LOOP;
              L DBB [#SRC_ADD];
              T DIB [#DST_ADD]; //賦值
              //地址偏移1個(gè)字節
              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的輸入參數類(lèi)型為:BLOCK_DB, TIMER或者 COUNTER,如何確定其編號?
              例1 :FB 塊
              FB1 變量聲明中定義了“ Timer” 類(lèi)型的變量“ Time_1” ,在 FB2 中調用 FB1,將定時(shí)器“T5”傳遞給變量“ Time_1”。如圖 01 所示程序代碼中數值 5 表示“T5”。


              圖 01 FB中確定定時(shí)器編號

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


              圖 02 FC中確定定時(shí)器編號

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


              圖 03 FB中確定Block_DB編號

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


              圖 04 FC中確定DB編號

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


              圖 05 允許的參數傳遞

              詳細信息請參考手冊中附錄27.3.4.8節內容:45531107

               

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


              圖 06 any的臨時(shí)變量傳遞

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


              圖 07 臨時(shí)變量的建立

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

              關(guān)鍵詞
              間接尋址,指針,地址寄存器

              聯(lián)系方式
              CONTACT US

              電話(huà):13818569113

              郵箱:13818569113@139.com

              網(wǎng)址:http://m.youmiyou.cn/

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

              用手機掃描二維碼關(guān)閉
              RM新时代专业团队
              <del id="m9z9f"></del>

                  <menuitem id="m9z9f"><option id="m9z9f"><progress id="m9z9f"></progress></option></menuitem>

                  <tt id="m9z9f"><option id="m9z9f"><thead id="m9z9f"></thead></option></tt>
                    <rt id="m9z9f"></rt>

                    <rt id="m9z9f"></rt><menuitem id="m9z9f"></menuitem>
                    1. <nav id="m9z9f"></nav>
                          <del id="m9z9f"></del>

                              <menuitem id="m9z9f"><option id="m9z9f"><progress id="m9z9f"></progress></option></menuitem>

                              <tt id="m9z9f"><option id="m9z9f"><thead id="m9z9f"></thead></option></tt>
                                <rt id="m9z9f"></rt>

                                <rt id="m9z9f"></rt><menuitem id="m9z9f"></menuitem>
                                1. <nav id="m9z9f"></nav>
                                      新时代RM平台官网 新时代RM|登录网址 RM新时代网站 rm理财 rm新世界