這篇文章要探討的是多個連續暫存器資料讀取這個命令,雖說是讀取暫存器資料,但實際可讀取範圍很大,幾乎涵蓋了所有PLC可用接點和暫存器資料。其原因在於永宏PLC位址的編碼方式(如下圖紅框框住的部份):
所有的單一輸出入或內部輔助接點皆可以每16或32點為1組讀出,且讀出的資料狀態沒有高低位元位置互換的問題,程式在處理上會比較簡單
多個連續暫存器資料讀取的命令說明如下:
命令寫入字串的組成:起始碼+站號+命令碼+個數+起始暫存器號碼+偵誤碼+結束碼
個數如說明圖上所寫是2個16進制數值字串組成,超過指定範圍時會通訊錯誤,而PLC回應的字串會是空白
起始暫存器號碼就如上一張圖表的內容,16位元一定是6個字元,32位元一定是7個字元。而起始暫存器號碼有幾個字元是後續程式要判定讀到的資料是16或32位元的依據
PLC回應字串的組成:起始碼+站號+命令碼+錯誤碼+多個連續暫存器資料+偵誤碼+結束碼
多個連續暫存器資料是依起始暫存器號碼往後排列,16位元的資料是每4個字元1組,32位元的資料是每8個字元1組
程式控制面版的構成如下列圖面,要做成這樣是要讓其他程式可以使用:
面板上輸出部分分為16位元和32位元,再各分為數值陣列輸出和LED陣列輸出,數值陣列用來顯示暫存器資料,LED陣列用來顯示輸出入或內部輔助接點狀態
完成的程式面板讀取16位元接點資料時
完成的程式面板讀取16位元暫存器資料時
完成的程式面板讀取32位元接點資料時
完成的程式面板讀取32位元暫存器資料時
完成的程式結構如下圖:
照例是3格流程控制,起始碼、結束碼、通訊參數和關閉通訊埠等不能更改的部份一樣寫到格子外
第1格寫入命令的部份
同樣是把所有字串和已算好的偵誤碼組合寫入PLC內
個數的字串另外先轉成10進制數值,再拉一條線到第3格,作為分解讀取資料的依據
起始暫存器號碼的字串同樣另外拉一條線到第3格,作為分解讀取資料的依據
第2格延遲時間同樣設定在120~200ms即可,但讀取的資料非常多時,設定時間還要再增加,才能完整讀到PLC回應字串
第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位元暫存器資料的處理
先把資料分成每4個1組再個別轉成10進制數值,10進制數值在和PLC能接受的最大正整數(16位元的話就是16進制數值7FFF)比大小。是小的話表示讀到的正整數,不用再經過程式換算。是大的話就表示是負數,這時將讀到的數值減掉PLC能接受的最大正整數,再減掉(PLC能接受的最大正整數加2),算出的結果就是正確的負數數值
※要這樣換算是因為LabVIEW的元件無法直接將4個字的16進制數值字串轉成有正負號的整數,轉出來的一定是正整數,和PLC內實際儲存的數值不同
※注意在換算中途要把所有算出的數值從U32格式用To Long Integer元件轉成I32格式,否則算出的仍會是沒有正負號的錯誤正整數
再來是16位元接點資料的處理
一樣先把資料分成每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位元接點資料的處理
一樣先把資料分成每8個1組再個別轉成10進制數值,10進制數值再用Number To Boolean Array元件轉成Boolean陣列直接輸出
※這裡就不需再用Delete From Array元件去取出資料,因為轉出的32個資料全部都是有效資料
再來是32位元暫存器資料的處理
先把資料分成每8個1組再個別轉成10進制數值,10進制數值在和PLC能接受的最大正整數(32位元的話就是16進制數值7FFFFFFF)比大小。是小的話表示讀到的正整數,不用再經過程式換算。是大的話就表示是負數,這時將讀到的數值減掉PLC能接受的最大正整數,再減掉(PLC能接受的最大正整數加2),算出的結果就是正確的負數數值
※要這樣換算是因為LabVIEW的元件無法直接將8個字的16進制數值轉成有正負號的整數,轉出來的一定是正整數,和PLC內實際儲存的數值不同
※注意在換算中途要把所有算出的數值從U32格式用To Long Integer元件轉成I32格式,否則算出的仍會是沒有正負號的錯誤正整數
留言列表