這篇文章要探討的是多個連續暫存器資料讀取這個命令,雖說是讀取暫存器資料,但實際可讀取範圍很大,幾乎涵蓋了所有PLC可用接點和暫存器資料。其原因在於永宏PLC位址的編碼方式(如下圖紅框框住的部份):

20081026-13  

 

所有的單一輸出入或內部輔助接點皆可以每16或32點為1組讀出,且讀出的資料狀態沒有高低位元位置互換的問題,程式在處理上會比較簡單

 

 

多個連續暫存器資料讀取的命令說明如下:

20081026-12  

 

命令寫入字串的組成:起始碼+站號+命令碼+個數+起始暫存器號碼+偵誤碼+結束碼


個數如說明圖上所寫是2個16進制數值字串組成,超過指定範圍時會通訊錯誤,而PLC回應的字串會是空白


起始暫存器號碼就如上一張圖表的內容,16位元一定是6個字元,32位元一定是7個字元。而起始暫存器號碼有幾個字元是後續程式要判定讀到的資料是16或32位元的依據


PLC回應字串的組成:起始碼+站號+命令碼+錯誤碼+多個連續暫存器資料+偵誤碼+結束碼


多個連續暫存器資料是依起始暫存器號碼往後排列,16位元的資料是每4個字元1組,32位元的資料是每8個字元1組

 

 

程式控制面版的構成如下列圖面,要做成這樣是要讓其他程式可以使用:


面板上輸出部分分為16位元和32位元,再各分為數值陣列輸出和LED陣列輸出,數值陣列用來顯示暫存器資料,LED陣列用來顯示輸出入或內部輔助接點狀態

 

 

完成的程式面板讀取16位元接點資料時

20081026-01  

 

完成的程式面板讀取16位元暫存器資料時

20081026-03  

 

完成的程式面板讀取32位元接點資料時

20081026-02  

 

完成的程式面板讀取32位元暫存器資料時

20081026-04  

 

  

完成的程式結構如下圖:

20081026-05  

 

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

 

 

第1格寫入命令的部份

20081026-06  

 

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


個數的字串另外先轉成10進制數值,再拉一條線到第3格,作為分解讀取資料的依據


起始暫存器號碼的字串同樣另外拉一條線到第3格,作為分解讀取資料的依據

 

 

第2格延遲時間同樣設定在120~200ms即可,但讀取的資料非常多時,設定時間還要再增加,才能完整讀到PLC回應字串

20081026-07  

 

 

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


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

 


接下來要做的是把PLC回應字串依一定的方法還原成正確的資料


這裡先用1個Case Structure元件,把讀取的資料分成16位元和32位元2種類型。分類的方法是把第1格傳來的起始暫存器號碼的字串用String Length元件分析,是6個字組成的字串就是16位元,是7個字組成的字串就是32位元


先說明16位元資料的取出,這裡用Replace Substring元件從PLC回應字串的第6碼(資料開始位置)開頭取出整串資料,取出的數量是第1格傳來的個數數值乘4(每16位元為4個字組成)


再來要判定是暫存器資料或接點資料,這裡再用Replace Substring元件從第1格傳來的起始暫存器號碼的字串取出前2個字,再依據那2個字比對用Case Structure元件把資料分成暫存器或接點類型

 


再來是16位元暫存器資料的處理

20081026-08  

 

 

先把資料分成每4個1組再個別轉成10進制數值,10進制數值在和PLC能接受的最大正整數(16位元的話就是16進制數值7FFF)比大小。是小的話表示讀到的正整數,不用再經過程式換算。是大的話就表示是負數,這時將讀到的數值減掉PLC能接受的最大正整數,再減掉(PLC能接受的最大正整數加2),算出的結果就是正確的負數數值


※要這樣換算是因為LabVIEW的元件無法直接將4個字的16進制數值字串轉成有正負號的整數,轉出來的一定是正整數,和PLC內實際儲存的數值不同


※注意在換算中途要把所有算出的數值從U32格式用To Long Integer元件轉成I32格式,否則算出的仍會是沒有正負號的錯誤正整數

 

 

再來是16位元接點資料的處理

20081026-09  

 

一樣先把資料分成每4個1組再個別轉成10進制數值,10進制數值再用Number To Boolean Array元件轉成Boolean陣列,再用Delete From Array元件取出陣列的前16個資料輸出

 

※要這樣做是因為Number To Boolean Array元件轉出來的一定是32個資料的陣列,只有前16個是有效資料

 

 

接著說明32位元資料的取出,這裡同樣用Replace Substring元件從PLC回應字串的第6碼(資料開始位置)開頭取出整串資料,取出的數量是第1格傳來的個數數值乘8(每32位元為8個字組成)

 

再來要判定是暫存器資料或接點資料,這裡同樣再用Replace Substring元件從第1格傳來的起始暫存器號碼的字串取出前3個字,再依據那3個字比對用Case Structure元件把資料分成暫存器或接點類型

 

 

再來是32位元接點資料的處理

20081026-10  

 

一樣先把資料分成每8個1組再個別轉成10進制數值,10進制數值再用Number To Boolean Array元件轉成Boolean陣列直接輸出


※這裡就不需再用Delete From Array元件去取出資料,因為轉出的32個資料全部都是有效資料

 

 

再來是32位元暫存器資料的處理

20081026-11  

 

先把資料分成每8個1組再個別轉成10進制數值,10進制數值在和PLC能接受的最大正整數(32位元的話就是16進制數值7FFFFFFF)比大小。是小的話表示讀到的正整數,不用再經過程式換算。是大的話就表示是負數,這時將讀到的數值減掉PLC能接受的最大正整數,再減掉(PLC能接受的最大正整數加2),算出的結果就是正確的負數數值


※要這樣換算是因為LabVIEW的元件無法直接將8個字的16進制數值轉成有正負號的整數,轉出來的一定是正整數,和PLC內實際儲存的數值不同


※注意在換算中途要把所有算出的數值從U32格式用To Long Integer元件轉成I32格式,否則算出的仍會是沒有正負號的錯誤正整數

, ,

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