這篇文章要探討的是多個任意單點狀態或暫存器資料混合讀取命令,這個命令因為有近乎無限多種的單點狀態或暫存器資料混合形式,實際上程式要兼顧各種可能組合形式是不可能的。但只要經過適當的安排,這個命令可以簡單的讀取大量混合資料,這一點和三菱PLC相比來說是最大的優點


多個任意單點狀態或暫存器資料混合讀取的命令說明如下:

20081101-06  

 

命令寫入字串的組成:起始碼+站號+命令碼+個數+元件號碼1+...+元件號碼N+偵誤碼+結束碼


個數如說明圖上所寫是2個16進制數值字串組成,超過指定範圍時會通訊錯誤,而PLC回應的字串會是空白。而指定範圍01~40是參考值,若讀取的元件有大量的16或32位元資料範圍會減少


元件號碼如說明圖上所寫可以是單點也可以是16或32位元暫存器資料,實際使用時讀取單點沒有效率,常用的是讀取16或32位元暫存器資料


PLC回應字串的組成:起始碼+站號+命令碼+錯誤碼+元件資料1+...+元件資料N+偵誤碼+結束碼


讀到的元件資料若有經過適當安排,則程式處理可以較簡單

 


程式控制面版的構成如下列圖面:

20081101-01  

 

程式的安排重點是以同類型的資料做順序編排,16位元的資料不要和32位元或單點資料交錯編排


這個範例是讀取接點X0~X15,Y0~Y15,16位元暫存器R0~R2。接點以LED陣列顯示,暫存器以數值顯示元件顯示

 


完成的程式結構如下圖:

20081101-02  

 

同樣是3格流程控制,起始碼、結束碼、通訊參數和關閉通訊埠等不能更改的部份照慣例寫到格子外

 


第1格寫入命令的部份

20081101-03  

 

同樣是把所有字串和已算好的偵誤碼組合寫入PLC內


讀取接點X0~X15,元件號碼使用WX0000,也就是把接點X0~X15當成16位元資料讀取


讀取接點Y0~Y15,元件號碼使用WY0000,同樣也是把接點Y0~Y15當成16位元資料讀取


R0~R2因為沒有便利的設定方式,則只能個別寫入連線

 


第2格因為要讀取的資料稍多,所以設為200ms

20081101-04  

 

 

第3格同樣用Property Node元件設定為Bytes at Port接收判定PLC回應字串長度


同樣從PLC回應字串的錯誤碼中可以看出是否通訊成功

20081101-05  

 

接下來要做的是把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格式,否則算出的仍會是沒有正負號的錯誤正整數

, ,

未出師的小工程師 發表在 痞客邦 PIXNET 留言(0) 人氣()