歡迎光臨
每天分享高質量文章

西門子S7-1200基本指令(6)——移動操作


點擊 《福利來了!PLC的資料(免費),你要嗎?

點擊第二波福利來了!PLC的資料(免費),你要嗎?

使用移動指令可將資料元素複製到新的儲存器地址並從一種資料型別轉換為另一種資料型別。 移動過程不會更改源資料。
● MOVE 指令用於將單個資料元素從引數 IN 指定的源地址複製到引數 OUT指定的標的地址。
● MOVE_BLK 和 UMOVE_BLK 指令具有附加的 COUNT 引數。 COUNT指定要複製的資料元素個數。 每個被覆制元素的位元組數取決於 PLC 變數表中分配給IN 和 OUT 引數變數名稱的資料型別。

MOVE 指令的資料型別:

  • 要添加 MOVE 輸出,請單擊“創建”(Create) 圖標,或右鍵單擊現有 OUT引數之一的輸出短線,並選擇“插入輸出”(Insert output) 命令。

  • 要刪除輸出,請在其中一個現有 OUT引數(多於兩個原始輸出時)的輸出短線處單擊右鍵,並選擇“刪除”(Delete) 命令。

MOVE_BLK 和 UMOVE_BLK 指令的資料型別:

MOVE_BLK_VARIANT 指令的資料型別:

說明:
資料複製操作規則
• 要複製 Bool 資料型別,請使用 SET_BF、RESET_BF、R、S 或輸出線圈(LAD)
• 要複製單個基本資料型別,請使用 MOVE
• 要複製基本資料型別陣列,請使用 MOVE_BLK 或 UMOVE_BLK
• 要複製結構,請使用 MOVE
• 要複製字串,請使用 S_MOVE
• 要複製字串中的單個字符,請使用 MOVE
• MOVE_BLK 和 UMOVE_BLK 指令不能用於將陣列或結構複製到 I、Q 或 M儲存區。

MOVE_BLK 和 UMOVE_BLK 指令在處理中斷的方式上有所不同:
● 在 MOVE_BLK 執行期間排隊並處理中斷事件。 在中斷 OB子程式中未使用移動標的地址的資料時,或者雖然使用了該資料,但標的資料不必一致時,使用MOVE_BLK 指令。 如果 MOVE_BLK操作被中斷,則最後移動的一個資料元素在標的地址中是完整並且一致的。MOVE_BLK 操作會在中斷 OB 執行完成後繼續執行。
● 在 UMOVE_BLK 完成執行前排隊但不處理中斷事件。 如果在執行中斷 OB子程式前移動操作必須完成且標的資料必須一致,則使用 UMOVE_BLK 指令。
執行 MOVE 指令之後,ENO 始終為真。

ENO說明:

MOVE_BLK_VARIANT 指令的條件代碼說明如下:

  • Deserialize取消序列化

可以使用“取消序列化”指令將 PLC 資料型別 (UDT) 塊的順序表示轉換回 PLC資料型別並填充所有內容。 如果比較結果為 TRUE,則功能框輸出為 TRUE。
按順序表達的 PLC 資料型別所對應的儲存區必須採用 Array of Byte資料型別,並且必須為資料塊宣告標準的訪問方式,而不是優化訪問方式。轉換前要確保有足夠的儲存空間。

該指令可以將多個按順序表示的已轉換 PLC 資料型別重新轉換回之前的原始資料型別。

DESERIALIZE 指令:

DESERIALIZE 指令的引數:

RET_VAL 引數說明:

示例: Deserialize 指令
以下舉例說明瞭該指令的工作原理:

“MOVE”指令將值“0”移動到“#BufferPos”資料塊變數。 然後 Deserialize指令將對“Buffer”資料塊中按順序表達的客戶資料進行反序列化,並將其寫入到“Target”資料塊中。 Deserialize指令計算已轉換的資料所占的位元組數,並將其儲存到“#BufferPos”資料塊變數。

“Deserialize”指令對“Buffer”所指向的按順序表達的資料流進行反序列化,並將相應字符寫入到“#Label”運算元中。 邏輯將使用比較指令“arti”和“Bill”來對字符進行比較。
如果“arti”的比較結果為TRUE,則資料為部件資料,將進行反序列化並寫入到“Target”資料塊的“article”資料結構中。 如果“Bill”的比較結果為TRUE,則資料為計費資料,將進行反序列化並寫入到“Target”資料塊的“Bill”資料結構中。

函式塊(或函式)接口:

自定義 PLC 資料型別:
以下為兩個 PLC 資料型別 (UDT) 的結構示例:

資料塊:
兩個資料塊示例如下:

  • Serialize指令

可以使用“Serialize”指令將多個 PLC 資料型別 (UDT)轉換成按順序表達的版本,並且不丟失結構。
可以使用此指令將程式中的多個結構化資料項暫時儲存到緩衝區中(例如,儲存到全域性資料塊中),併發送給另一 CPU。 儲存已轉換的 PLC 資料型別的儲存區必須採用 ARRAY of BYTE 資料型別,並且已宣告為標準訪問方式。 轉換前要確保有足夠的儲存空間。POS 引數包含有關已轉換的 PLC 資料型別所占位元組數的信息。

SERIALIZE 指令:

SERIALIZE 指令的引數:

RET_VAL 引數:

示例: Serialize 指令
以下舉例說明瞭該指令的工作原理:

“MOVE”指令將值“0”移動到“#BufferPos”引數。 Serialize指令將對“Source”資料塊中的客戶資料進行序列化,並以按順序表達的方式將其寫入到“Buffer”資料塊中。該指令會將按順序表達的版本中所用的位元組數儲存到“#BufferPos”引數中。

邏輯此時將插入一些分隔符文本,以便利以後對順序表達版本進行反序列化。“S_MOVE”指令將文本字串“arti”移動到“#Label”引數。“Serialize”指令將源客戶資料後的這些字符寫入到“Buffer”資料塊中。此指令將把文本字串“arti”所含的位元組數累加到“#BufferPos”引數的已存資料中。

“Serialize”指令將序列化“Source”資料塊中特定部件的資料(該資料在運行期間計算),並以按順序表達的方式寫入到“Buffer”資料塊的“arti”字符後面。

塊接口:

自定義 PLC 資料型別:
以下為兩個 PLC 資料型別 (UDT) 的結構示例:

資料塊:
兩個資料塊示例如下:

  • FILL_BLK(填充塊)和 UFILL_BLK(無中斷填充塊)指令

引數的資料型別:

說明
資料填充操作規則
• 要使用 BOOL 資料型別填充,請使用 SET_BF、RESET_BF、R、S 或輸出線圈(LAD)
• 要使用單個基本資料型別填充,請使用 MOVE
• 要使用基本資料型別填充陣列,請使用 FILL_BLK 或 UFILL_BLK
• 要填充字串中的單個字符,請使用 MOVE
• FILL_BLK 和 UFILL_BLK 指令不能用於將陣列填充到 I、Q 或 M 儲存區。


FILL_BLK 和 UFILL_BLK 指令可將源資料元素 IN 複製到通過引數 OUT指定初始地址的標的中。 複製過程不斷重覆並填充相鄰的一組地址,直到副本數等於COUNT 引數。
FILL_BLK 和 UFILL_BLK 指令在處理中斷的方式上有所不同:
● 在 FILL_BLK 執行期間排隊並處理中斷事件。 在中斷 OB子程式中未使用移動標的地址的資料時,或者雖然使用了該資料,但標的資料不必一致時,使用 FILL_BLK 指令。
● 在 UFILL_BLK 完成執行前排隊但不處理中斷事件。 如果在執行中斷 OB子程式前移動操作必須完成且標的資料必須一致,則使用 UFILL_BLK 指令。

ENO 狀態:

  • SWAP(交換位元組)指令

引數的資料型別:

  • 讀/寫儲存器指令

1、PEEK 和 POKE 指令(僅限 SCL)
SCL 提供 PEEK 和 POKE 指令,可用來從資料塊、I/O或儲存器中讀取內容或是向其中寫入內容。而您提供操作中具體位元組偏移量或位偏移量的引數。

對於 PEEK 和 POKE 指令,“area”、“area_src”和“area_dest”引數可以使用以下值。
對於資料塊以外的其它區域,dbNumber 引數必須為 0。

2、讀取和寫入大尾和小尾指令 (SCL)

S7-1200 CPU 提供用於以小尾格式和大尾格式讀取和寫入資料的 SCL 指令。
小尾格式是指最低有效位所在的位元組是儲存器的最低地址。
大尾格式是指最高有效位所在的位元組是儲存器的最低地址。
以小尾格式和大尾格式讀取和寫入資料的四個 SCL 指令如下所示:
● READ_LITTLE (以小尾格式讀取資料)
● WRITE_LITTLE (以小尾格式寫入資料)
● READ_BIG (以大尾格式讀取資料)
● WRITE_BIG (以大尾格式寫入資料)

READ_LITTLE and READ_BIG 指令的引數:

WRITE_LITTLE and WRITE_BIG 指令的引數:

RET_VAL 引數:

  • Variant 指令

1、VariantGet(讀取 VARIANT 變數值)
可以使用“讀取 Variant 變數值”指令讀取 SRC 引數的 Variant所指向的變數,並將其寫入到 DST 引數的變數中。
SRC 引數的資料型別為 Variant。 除了 Variant 之外,所有資料型別都可為DST引數指定。
DST 引數的變數所用的資料型別必須與 Variant 所指向的資料型別相匹配。

說明
想要複製結構和陣列,可以使用“MOVE_BLK_VARIANT: 移動塊”指令。

VariantGet 指令的引數:

ENO 狀態:

2、VariantPut(寫入 VARIANT 變數值)指令
可以使用“寫入 VARIANT 變數值”指令將 SRC 引數中變數的值寫入到 VARIANT所指向的DST 引數的變數中。
DST 引數的資料型別為 VARIANT。 除了 VARIANT 之外,所有資料型別都可為 SRC引數指定。
SRC 引數的變數所用的資料型別必須與 VARIANT 所指向的資料型別相匹配。

說明
想要複製結構和陣列,可以使用 “MOVE_BLK_VARIANT: 移動塊”指令。

VariantPut 指令的引數:

ENO 狀態:

3、CountOfElements(獲取 ARRAY 元素數目)指令
可以使用“獲取 ARRAY 元素數目”指令來查詢 Variant 指向的變數中所含有的Array元素數目。
如果是一維 ARRAY,指令將傳回上限和下限間之差 +1。 如果是多維ARRAY,指令傳回所有維度的結果。

說明
如果 Variant 指向 Array of Bool,指令的計數範圍將包含填充元素(至最接近的位元組邊界)。 例如,對 Array[0..1] of Bool 進行計數時,指令將傳回 8。

CountOfElements 指令的引數:

ENO 狀態:

  • 早期指令

1、FieldRead(讀取域)和 FieldWrite(寫入域)指令

引數的資料型別:

如果滿足下列條件之一,則使能輸出 ENO = 0:
● EN 輸入的信號狀態為“0”
● 在 MEMBER 引數取用的陣列中未定義 INDEX 引數指定的陣列元素
● 處理過程中發生上限溢位之類的錯誤

示例: 通過陣列索引訪問資料


尋找同路人

做自動化工業變革的踐行者


可通過選單查找自己喜歡的文章彙總:

現場儀錶DCS部分PLC部分SIS部分通訊標準數字化問題解答】此處列出部分鏈接,更多文章通過選單獲取。



赞(0)

分享創造快樂