塊移動指令包括兩個:MOVE_BLK和MOVE_BLK_VARIANT,實際項目中都經常被用到。比如設備作業結果的存儲及顯示功能就需要用到塊移動指令。通常采用這種邏輯:首先創建一個數據塊,在其中創建一個定長數組(比如可存放100條記錄)。每次設備作業流程結束后,將流程結果的數據作為一條記錄存放到數組中。
當需要查看某次作業結果的數據時,從數組中讀取相關的數據拷貝到臨時變量或某個特定變量中即可。這類存儲功能一般使用MOVE_BLK_VARIANT指令,因為它可以拷貝結構體數據類型(設備流程結果一般內容比較多,比如包括壓力、溫度、時間等等,多數采用結構體變量存儲),而MOVE_BLK指令只能拷貝基礎數據類型(整數、實數等)。數據的寫入及讀取要設定相應的指針變量,實際應用中經常因為指針錯誤導致讀寫錯誤。今天這篇文章我們介紹一下MOVE_BLK_VARIANT指令在使用中應注意的問題。
MOVE_BLK_VARIANT指令位于【指令】任務卡的【基本指令】→【移動操作】中,使用梯形圖或功能塊圖編程時可以在這個位置將其拖放到函數或函數塊中。使用SCL語言編程時,可以直接輸入"MOVE"編輯器會自動提示,如下圖所示:
指令添加后的初始狀態如下圖所示:
指令參數含義如下:
SRC:可變(Variant)數據類型。源數據,可以是數組或結構體復雜數據類型;
COUNT:無符號雙整數(UDINT),要拷貝的記錄條數;
SRC_INDEX:雙整數(DINT),源數據的索引;
DEST_INDEX:雙整數(DINT),目標數據的索引;
DEST:可變(Variant)數據類型。目標數據,即源數據要拷貝到的目標區域;
說明:
無論數組的上、下限是如何定義,源數據和目標數據的索引都是從0開始計算的;
如果源數據或目標參數不是數組,則其相應的索引值應為0;
舉個例子:
假設存儲數組data的定義如下:
data[1..100] of typeResult //typeResult是用戶自定義數據類型
假設過程結果存放在變量tmpResult中。第一次將過程結果存放到存儲區數組中的代碼如下:
#return_value:=MOVE_BLK_VARIANT(SRC := #tmpResult, COUNT := 1, SRC_INDEX := 0, DEST_INDEX := 0, DEST => "db_storage".data);
注意這里“DEST_INDEX”的值為0,而數據則存放在數組的第一個元素中。由于該數組的下限為1,所以存放在data[1]中。假設定義的存放數據為data[10..110],則存放第一條記錄的“DEST_INDEX”的值仍然為0,由于該數組的下限為10,因此數據存放在data[10]中。
實際應用中需要定義寫指針變量,隨著存入次數的變化修改寫指針的值,從而存放到數組的不同位置中。為了防止數據重復寫入,存儲應在沿信號時進行。
基于上述描述我寫了一個簡單的數據寫入代碼,變量定義如下圖所示:
代碼如下圖所示:
這段代碼我已經測試過了,包括數據寫滿后的情況,如下圖所示:
這篇文章最核心的內容就是大家在使用MOVE_BLK_VARIANT指令時要記住其SRC_INDEX和DEST_INDEX的計算是從0開始的。感興趣的小伙伴可以把上述的代碼進行完善,然后完成數據讀取的代碼。
好吧,就先聊到這里。
-
SRC
+關注
關注
0文章
61瀏覽量
18052 -
SCL
+關注
關注
1文章
239瀏覽量
17178
原文標題:西門子SCL編程入門教程連載(22)——塊移動指令
文章出處:【微信號:方正智芯,微信公眾號:方正智芯】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
變頻器的基礎知識及在使用中應注意的問題
ATmega128在開發應用中應注意的問題
大型矩陣在工程使用中應注意的問題
Variant類型的變量指令說明
介紹幾個常用MOVE系列指令
西門子S7-1200PLC塊移動指令MOVE_BLK操作
SIMATIC S7-1500 PLC存儲區移動指令與交換指令簡述
![SIMATIC S7-1500 PLC存儲區移動<b class='flag-5'>指令</b>與交換<b class='flag-5'>指令</b>簡述](https://file1.elecfans.com/web2/M00/82/8D/wKgaomRYaaSASjowAAAu3aDkXLs677.png)
評論