例程包括這兩種情況的SCL代碼。以下是程序中使用的數據塊,。 通過數據塊號訪問: FUNCTION FC601 : VOID VAR_INPUT DB_NO : BLOCK_DB; // Number of the Data-Block STRT_ADD : INT; // Start address in the DB END_VAR VAR_OUTPUT Q_DB : INT; Q_INT1 : INT; Q_REAL1 : REAL; Q_WORD1 : WORD; Q_BOOL1 : BOOL; END_VAR Q_DB := WORD_TO_INT (BLOCK_DB_TO_WORD (DB_NO)); // absolute addressing from start address Q_INT1 := WORD_TO_INT (DB_NO.DW[STRT_ADD + 0]); Q_REAL1 := DINT_TO_REAL (DWORD_TO_DINT (DB_NO.DD[STRT_ADD + 2])); Q_WORD1 := DB_NO.DW[STRT_ADD + 6]; Q_BOOL1 := DB_No.DX[STRT_ADD + 8, 0]; END_FUNCTION 請注意,,BLOCK_DB數據類型僅針對于輸入參數。如果要使用輸出參數或者輸入輸出參數,,必須使用不同的數據類型,, 并通過轉換功能塊后再訪問數據。(比如 INT_TO_BLOCK_DB),。 過ANY指針訪問: ANY指針格式在STEP 7在線幫助中有具體說明(標題: "Format of the ANY parameter type"),。 FUNCTION_BLOCK FB602 VAR_INPUT DB_ANY : ANY; // Any-Pointer of the Data-Block AnyPointer AT DB_ANY : STRUCT BYTE0 :BYTE; // Byte 0 TYP :BYTE; // Byte 1 Data-/Parametertype ANZ :WORD; // Byte 2+3 Lenth of data DBNO :WORD; // Byte 4+5 DB-Number BZ :DWORD; // Byte 6 to 10 Pointer END_STRUCT; tmpAnyPointer AT DB_ANY : ARRAY [0..9] OF BYTE; END_VAR VAR_OUTPUT Q_DB : INT; Q_INT1 : INT; Q_REAL1 : REAL; Q_WORD1 : WORD; Q_BOOL1 : BOOL; END_VAR VAR_TEMP MEM_AREA : BYTE; Offset : INT; END_VAR MEM_AREA := tmpAnyPointer[6]; // this Byte contains the memory area IF (MEM_AREA <> 16#84) THEN RETURN; // quit block in case the area isn't DB END_IF; Offset := DWORD_TO_INT(SHR (IN:=AnyPointer.BZ, N:=3)); // Offset address Q_DB := WORD_TO_INT (AnyPointer.DBNO); // absolute addressing from Offset address Q_INT1 := WORD_TO_INT (WORD_TO_BLOCK_DB (AnyPointer.DBNO).DW[Offset + 0]); Q_REAL1 := DINT_TO_REAL (DWORD_TO_DINT(WORD_TO_BLOCK_DB (AnyPointer.DBNO).DD[Offset + 2])); Q_WORD1 := WORD_TO_BLOCK_DB (AnyPointer.DBNO).DW[Offset + 6]; Q_BOOL1 := WORD_TO_BLOCK_DB (AnyPointer.DBNO).DX[Offset + 8,0]; END_FUNCTION_BLOCK 下圖是CFC圖表中的功能塊。
數據塊與第二個功能塊相連接,。STRT_ADD參數定義了第二個結構變量作為起始地址,。在第三個塊中,ANY指針直接和第二個結構變量的起始地址相連,。 注意 使用ANY指針時,,注意檢查程序中所需數據源是否正確,,因為在CFC中如果連接ANY指針,不會檢查數據類型,。 ,、、,、,、、,、,、、、,、,、、,、,、、,、,、,、,、、,、,、、,、,、、,、,、、,、,、、,、,、、,、,、、,、,、、,、,、、,、,、、、,、,、、,、,、、,、,、、,、,、、,、,、、,、 編程過程中,,可以使用參數類型BLOCK_DB (圖. 01). 在編譯時,具體的數據塊是不確定的,,所以S7-SCL編譯器通過符號表和DB的變量聲明不能找到對應的數據類型,。如果使用絕對地址訪問DB,S7-SCL假定該數據類型為BOOL, BYTE, WORD或DWORD,。 下面的例子,,通過絕對地址尋址,可以訪問DB數據中的變量。在FB中,,沒有確定DB塊(db_test)的數據DD0此時被讀,。 圖. 01 該DB的數據DD0為DINT數據格式。DD0被轉化為TIME類型變量,。 注意: 語句"WORD_TO_BLOCK_DB(Code_2).dw[Byte_Index]...;" 允許直接訪問 DB,。必須定義WORD類型的"Code_2"變量用于DB號和整型類型的變量"Byte_Index"用作DB數據索引。 如果DB號是"BLOCK_DB"類型的一個輸入變量類型,,可以間接地使用"dbnumber.dw0"變量訪問DB,。 更多的信息請參考S7-SCL在線幫助 Absolute access to data blocks Indexed access to data blocks Class B conversion functions word_to_bolck_db(db_no).dw[dbb_no] 問題: 在S7-SCL中可以編程ANY指針嗎?使用該指針可以在指向的數據區(qū)設置任何位,。 解答: 可以,。下面的條目講述了如何在S7-SCL中編程或設定一個ANY指針: 如何使用AT函數在S7-SCL中構造一個ANY指針?-條目號:21946854 當調用SFC14/15時,,在SCL中支持ANY參數-條目號:10625180 關于ANY指針格式的更多信息和ANY數據類型,,可從STEP 7和S7-SCL的在線幫助中找到: “參數類型ANY的格式”(在STEP 7的在線幫助中) “數據類型ANY”和“數據類型ANY實例” (在S7-SCL的在線幫助中),。 該條目包含帶有“SetBit”功能的S7-SCL程序。使用該“SetBit”功能,,可以在數據區(qū)中將由ANY指針標記的位設置為“1”> e > > ,,該數據區(qū)中的其它位都設置為“0”。 可以在OB1中調用“SetBit”,,該OB1也是用S7-SCL語言編寫的,。然而,用戶也可以在LAD,、F BD或STL編程語言中使用該功能,。 圖1:在梯形圖編程中調用“SetBit”功能(FC1)的實例 在“SetBit”功能中聲明了下列輸入變量,使用這些變量在定義的數據區(qū)中設置位: 名稱 數據類型 說明 值 整數在數據區(qū)中要設置的位的數目,。 在本例中:位12 起始位和范圍 ANY指針 指向數據區(qū)的已定義好的ANY指針,。 在本例中:在DB 1中,數據區(qū)DBX2.2到DBX5.1 (23個位) 表1:“SetBit”功能(FC1)的輸入變量 功能說明: 定義ANY指針的第一步是在S7-SCL程序中創(chuàng)建UDT1 (符號:AnyPoint),,該 S7-SCL程序包含要為ANY指針定義的數據類型,。 使用聲明“Data: ARRAY[1..10] OF BYTE”定義用于存儲數據的數據塊DB1,。 正如上文提到的條目中所描述的一樣,,通過使用臨時變量和AT功能,可以從S7-SCL訪問與聲明的ANY指針“ StartBitAndRange”相關的數據(本例中:UDT1),。 示例: TempAny AT Buffer:ANY,;//臨時變量“TempAny”和“Buffer” (Buffer是類型AnyPoint = UDT1的) TempAny:= StartBitAndRange; 在本例中,,“TempAny”變量是用于調用“SetBit”功能的已計算的ANY指針: RetVal:= SetBit(Value:= BitNumber,,StartBitAndRange:= TempAny);& amp; amp; lt; /li> 在DB1中,,數據區(qū)中DBX2.2和DBX5.1之間的第12個位現(xiàn)在設置為“1”,,此情況下為位DB1.DBX3.6。該 數據區(qū)中的其它位都設置為“0”,。位號12是第13個位,,因為位號是從位號0開始計算的。 為在“Monitor/control variable”中測試程序,,要 定義用于識別指針P#DBx.DBX(MW8).(MB6) DataType(MB7) MW4的下列標志字節(jié)或標志字,。& amp; amp; lt; /p> 操作數 符號 意義 MW8 OffsetInByte 記錄字節(jié)偏移量的存儲字 MB6 OffsetInBit 記錄位偏移量的存儲字節(jié) MB7 DataType 記錄所選數據類型的存儲字節(jié) MW4 DataCount 記錄數據類型數目或重復因子的存儲字 MW2 BitToSetInRange 記錄變量“Value”的存儲字 表2:用于以“Monitor/control variable”測試的指針結構 因而,對于ANY指針P#DB1.DBX2.2 BOOL 23,,例如,, 以“Monitor/control variable”測試時,顯示:P#DB1.DBX(MW8).(MB6)DataTyp MB7 MW4,。 圖2:“Monitor/control variable”功能 通過MW8 (OffsetInByte=2)和MB6 (OffsetInBits=2),,定義數據區(qū)的起始位置,,并使用MW4 (DataCount=23)定義數據區(qū)的長度。 使用MB7 (DataType=1 表示BOOL類型),,可以定義數據類型,。這對應于ANY指針P#DB1.DBX2.2 BOOL 23。i i i i 要設置的位通過MW2 (BitToSetInRange=12)定義,。 本例中,,數據區(qū)從DB1.DBB2中的第2位開始。要設置的位是加上12位(0 ... 12)后的結果,即直到DB1.DBB3中的第6位結束,。 圖3:要置位的位地址用數據區(qū)起點的偏移量的方式表示 通過RET_VAL (返回值),,如果功能沒有執(zhí)行,將輸出下列代碼: W#16#0000 執(zhí)行了功能且沒有出錯,,并且設置了相關位,。 W#16#8001 指定了已定義的ANY指針不支持的數據類型。 W#16#8010 要設置的位大于數據區(qū),。 W#16#8011 要設置的位小于數據區(qū),。 更多示例: 圖4:帶ANY指針:P#DB1.DBX0.0 BYTE 4 的“Monitor/control variable”功能 在圖 4 顯示的示例中,數據類型為“BYTE” (MB7=2),,長為4個字節(jié)(MW4=4),,字 節(jié)和位偏移量為0(MB6=0和MW8=0)-DBX0.0 BYTE 4.MW2存儲的值2,因此第2位的DB1.DBX0.2就被置位了,。& amp; amp; lt; /p> 圖5:帶ANY指針:P#DB1.DBX0.0 BOOL4 的“Monitor/control variable”功能 在圖 5 顯示的示例中,,位和字節(jié)偏移量為0,數據類型為BOOL,,長度為4個位,。然而,為DB1.DBX0.7 (MW2=7)設置的位已經輸入,,并且大于標志的數據區(qū)(僅4位),。于是在RetVal中輸出故障代碼8010(MW10)。 圖6:帶ANY指針:P#DB1.DBX0.1 WORD 2 的“Monitor/control variable”功能 在圖 6 顯示的示例中,,DBX0.4在DB1中置位為“1”,。 下載: 附上的下載鏈接包含帶有上述塊的STEP 7項目以及在S7-SCL中調用的功能。在項目中有兩個獨立的站,,分 別用德語和英語進行了注釋,。< /p> SetBit_SCL.exe ( 176 KB ) 將“SetBit_scl.exe”文件復制到一個單獨的文件夾中,雙擊啟動該文件,。STEP 7 V5.2項目連帶相關的子目錄一起自動解壓縮后,,可以使用SIMATIC管理器打開和處理該項目。 可運行性和測試環(huán)境 本示例適用于SIMATIC S7-300和S7-400系列的所有類型CPU,。 下表列出了用于創(chuàng)建該條目并校驗所述功能的組件: 測試環(huán)境 版本 PC平臺 PG 740 Pentium 3 PC操作系統(tǒng) Microsoft Windows 2000 SP3 STEP 7 STEP 7 Professional Edition 12/2002 (STEP 7 V5.2 SP1,,S7-SCL V5.1) S7-CPU CPU314C-2PtP或S7-PLCSIM V5.2 http://support.automation./CN/llisapi.dll?func=cslib.csinfo&lang=zh&siteid=cseus&objid=19362106 |
|