這篇文章要探討的是多個任意單點狀態或暫存器資料混合讀取命令,這個命令因為有近乎無限多種的單點狀態或暫存器資料混合形式,實際上程式要兼顧各種可能組合形式是不可能的。但只要經過適當的安排,這個命令可以簡單的讀取大量混合資料,這一點和三菱PLC相比來說是最大的優點
多個任意單點狀態或暫存器資料混合讀取的命令說明如下:
命令寫入字串的組成:起始碼+站號+命令碼+個數+元件號碼1+...+元件號碼N+偵誤碼+結束碼
個數如說明圖上所寫是2個16進制數值字串組成,超過指定範圍時會通訊錯誤,而PLC回應的字串會是空白。而指定範圍01~40是參考值,若讀取的元件有大量的16或32位元資料範圍會減少
元件號碼如說明圖上所寫可以是單點也可以是16或32位元暫存器資料,實際使用時讀取單點沒有效率,常用的是讀取16或32位元暫存器資料
PLC回應字串的組成:起始碼+站號+命令碼+錯誤碼+元件資料1+...+元件資料N+偵誤碼+結束碼
讀到的元件資料若有經過適當安排,則程式處理可以較簡單
程式控制面版的構成如下列圖面:
程式的安排重點是以同類型的資料做順序編排,16位元的資料不要和32位元或單點資料交錯編排
這個範例是讀取接點X0~X15,Y0~Y15,16位元暫存器R0~R2。接點以LED陣列顯示,暫存器以數值顯示元件顯示
完成的程式結構如下圖:
同樣是3格流程控制,起始碼、結束碼、通訊參數和關閉通訊埠等不能更改的部份照慣例寫到格子外
第1格寫入命令的部份
同樣是把所有字串和已算好的偵誤碼組合寫入PLC內
讀取接點X0~X15,元件號碼使用WX0000,也就是把接點X0~X15當成16位元資料讀取
讀取接點Y0~Y15,元件號碼使用WY0000,同樣也是把接點Y0~Y15當成16位元資料讀取
R0~R2因為沒有便利的設定方式,則只能個別寫入連線
第2格因為要讀取的資料稍多,所以設為200ms
第3格同樣用Property Node元件設定為Bytes at Port接收判定PLC回應字串長度
同樣從PLC回應字串的錯誤碼中可以看出是否通訊成功
接下來要做的是把PLC回應字串依一定的方法把個別的資料還原成正確的資料
首先取出接點X0~X15的資料,這裡用Replace Substring元件從PLC回應字串的第6碼(資料開始位置)開頭取出4個字的字串(X0~X15的資料),再把字串轉成10進制數值,10進制數值再用Number To Boolean Array元件轉成Boolean陣列,再用Delete From Array元件取出陣列的前16個資料輸出
再來要取出接點Y0~Y15的資料,同樣用Replace Substring元件從PLC回應字串的第10碼開頭取出4個字的字串(Y0~Y15的資料),再把字串轉成10進制數值,10進制數值再用Number To Boolean Array元件轉成Boolean陣列,再用Delete From Array元件取出陣列的前16個資料輸出
※接點資料字串要這樣做是因為Number To Boolean Array元件轉出來的一定是32個資料的陣列,只有前16個是有效資料
再來是取出暫存器R0~R2的資料,同樣用Replace Substring元件從PLC回應字串的第14碼開頭取出12個字的字串(R0~R2的資料)。接下來用For Loop迴圈把資料分成每4個1組再個別轉成10進制數值,10進制數值在和PLC能接受的最大正整數(16位元的話就是16進制數值7FFF)比大小。是小的話表示讀到的正整數,不用再經過程式換算。是大的話就表示是負數,這時將讀到的數值減掉PLC能接受的最大正整數,再減掉(PLC能接受的最大正整數加2),算出的結果就是正確的負數數值
※要這樣換算是因為LabVIEW的元件無法直接將4個字的16進制數值字串轉成有正負號的整數,轉出來的一定是正整數,和PLC內實際儲存的數值不同
※注意在換算中途要把所有算出的數值從U32格式用To Long Integer元件轉成I32格式,否則算出的仍會是沒有正負號的錯誤正整數
留言列表