這篇文章要探討的是多個連續暫存器資料寫入這個命令,這個命令實際可寫入範圍很大,幾乎涵蓋了所有PLC可用接點和暫存器資料。除了可以寫入資料外,還可以做多點ON/OFF的控制
所有的單一輸出入或內部輔助接點皆可以每16或32點為1組寫入,且寫入的資料狀態沒有高低位元位置互換的問題,程式在處理上會比較簡單
多個連續暫存器資料寫入的命令說明如下:
命令寫入字串的組成:起始碼+站號+命令碼+個數+起始暫存器號碼+多個連續暫存器資料+偵誤碼+結束碼
個數如說明圖上所寫是2個16進制數值字串組成,超過指定範圍時會通訊錯誤,而PLC回應的字串會是空白
起始暫存器號碼就如前一篇文章圖表的內容,16位元一定是6個字元,32位元一定是7個字元。而起始暫存器號碼有幾個字元是程式要判定寫入的資料是16或32位元的依據
多個連續暫存器資料是依起始暫存器號碼往後排列,16位元的資料是每4個字元1組,32位元的資料是每8個字元1組
PLC回應字串的組成:起始碼+站號+命令碼+錯誤碼+偵誤碼+結束碼
程式控制面版的構成如下面圖面,要做成這樣是要讓其他程式可以使用:
面板上輸入部分分為數值陣列輸入和開關陣列輸入,數值陣列用來寫入暫存器資料,開關陣列用來寫入輸出入或內部輔助接點狀態
數值陣列是I32格式資料,這點很重要,若設定錯誤會影響到程式處理的結果
開關陣列是依16位元的方式排列成2D陣列,要這樣做是因為32位元開關陣列畫面會擠不下
完成的程式結構如下圖:
照例是3格流程控制,起始碼、結束碼、通訊參數和關閉通訊埠等不能更改的部份一樣寫到格子外
第1格寫入命令的部份
同樣是把所有字串和已算好的偵誤碼組合寫入PLC內
個數的字串另外先轉成10進制數值,作為分解寫入資料的依據
接下來要做的是把來源資料依一定的方法編寫成PLC能接受的正確資料
這裡先用1個Case Structure元件,把要寫入的資料分成16位元和32位元2種類型。分類的方法是把起始暫存器號碼的字串用String Length元件分析,是6個字組成的字串就是16位元,是7個字組成的字串就是32位元
先說明16位元資料的編寫
先要要判定是暫存器資料或接點資料,這裡用Replace Substring元件從起始暫存器號碼的字串取出前2個字,再依據那2個字比對用Case Structure元件把資料分成暫存器或接點類型
再來是16位元暫存器資料的處理
先把資料數值轉成I16格式,用For Loop迴圈來分離每筆資料,再用Number To Hexadecimal String元件轉成4個字1組的16進制數值字串,然後依順序串連成單一字串
※注意在編碼要把所有的數值從I32格式用To Word Integer元件轉成I16格式,否則編排出的會是8個字1組的字串
再來是16位元接點資料的處理
一樣先把資料個別分成16筆資料1組的1D陣列,然後用Boolean Array To Number元件轉成10進制數值,再用Number To Hexadecimal String元件轉成4個字1組的16進制數值字串,然後依順序串連成單一字串
再來說明32位元資料的編寫
同樣先要判定是暫存器資料或接點資料,同樣用Replace Substring元件從起始暫存器號碼的字串取出前3個字,再依據那3個字比對用Case Structure元件把資料分成暫存器或接點類型
再來是32位元暫存器資料的處理
先用For Loop迴圈來分離每筆資料,再用Number To Hexadecimal String元件轉成8個字1組的16進制數值字串,然後依順序串連成單一字串
再來是接點資料的處理
先從接點資料用Delete From Array元件分出2組共32筆資料的2D陣列,再用Index Array元件分成16筆資料1組的1D陣列共2組,接著用Build Array元件串連成32筆資料的1D陣列,然後用Boolean Array To Number元件轉成10進制數值,再用Number To Hexadecimal String元件轉成8個字1組的16進制數值字串,然後依順序串連成單一字串
※Build Array元件一定要設定成Concatenate Inputs狀態,不然串連出來的會是2D陣列
第2格延遲時間同樣設定在120~200ms即可,但寫入的資料非常多時,設定時間還要再增加,才能完整讀到PLC回應字串
第3格同樣用Property Node元件設定為Bytes at Port接收判定PLC回應字串長度
同樣從PLC回應字串的錯誤碼中可以看出是否通訊成功