這次要說明的是這一系列文章最後的部份,多點ON/OFF及資料寫入技術
同樣PLC_LabVIEW圖形監控這本書關於這部份有很多細節沒有交代清楚,多點ON/OFF及資料寫入技術只寫入1組位元和單一16位元暫存器。上過的幾堂課根本是完全不提多點的監控和寫入,一切成果完全是在失敗多次摸索出來的
一樣工具書先準備好,或是參考我以前另2篇文章用LabVIEW計算三菱PLC FX-2N元件群組通訊用位址和用LabVIEW計算三菱PLC FX-2N字元群組通訊用位址來查詢通訊位址
重要事項:
※硬體的控制命令優先於PLC的程式,PLC的程式優先於電腦的控制命令
※要控制的元件一定要連號,要寫入的D資料暫存器也要連號
※16位元和32位元資料要分開寫入,絕對不要混合。一方面可以簡化程式,另外還可避免出錯
※因為硬體的控制命令優先,所以X接點群組的寫入是無意義的。要控制PLC內的程式要使用M輔助接點,所有的人機觸控螢幕程式也是依循這個法則去寫
※Y接點習慣上不由電腦下命令控制,而是由電腦透過M接點間接控制
※S接點雖然也可控制,但習慣上不使用
※T和C接點的SET和RST有不同的元件位址,要控制只有寫入ON的資料才會動作。這2種接點的特性是一寫入狀態會保持住,寫入SET動作狀態的T和C接點只能用寫入RST的方式去解除動作。T和C接點較少由電腦直接下命令控制
※T和C元件的設定值必需在PLC內用D暫存器接間設定,電腦對T和C元件的設定值是透過D暫存器寫入
※16位元和32位元數值的輸入以10進制為準,10進制換算成16進制由程式處理。不是每個用戶都懂16進制數值的寫法
首先說明多點控制動作和資料寫入的命令架構(如下圖):
命令字串的組成為:起始碼+命令控制碼+元件群組位址+寫入組數+寫入資料+結束碼+偵誤碼
基本架構和單點ON/OFF的命令類似,只是多了寫入資料這部份,而寫入資料這部份是這篇文章的說明重點。因為寫入資料有既定的格式,所以程式要處理的就是把來源資料編譯成PLC能讀取的格式
程式的書寫部份,延續上一篇文章,上一篇文章程式控制面板寫在Tab Control元件的第1頁主畫面上,這次程式控制面板要寫在Tab Control元件第2頁設定頁上。Tab Control元件元件的使用可參考我寫的另一篇文章LabVIEW的換頁功能---Tab Control元件的應用研究
先說明這次程式控制面板的配置,共分為3個部份:
1.畫面左邊由開關元件組成的2D陣列,陣列設定為8×n個,會這樣設定是因為寫入資料是以8位元(8個1組)為單位。當然也可以設定為1D陣列,只是要控制的元件很多時畫面會擠不下
陣列下方放上2個文字輸入元件,分別輸入元件群組位址和寫入組數,輸入的規則請參照上一篇文章不再重複說明
在下面有開關換算字串和PLC回應字串這2個文字顯示元件,實際應用時可以省略,在此放上去是為了方便觀察
※沒有設定寫入按鍵是因為開關控制是即時的,陣列中只要任一開關有動作就會啟動寫入PLC的程式
2.畫面中央是由數值輸入元件組成的1D陣列,因為要輸入的是16位元資料所以數值輸入元件必需設定為I16格式,這樣的設定可避免使用者輸入超過數值範圍
陣列下方放上輸入元件群組位址的文字輸入元件
底下寫入組數和換算字串的文字顯示元件同樣是為了方便觀察,實際應用時可以省略
最下方有設定寫入按鍵是因為資料寫入是非即時的,所以等資料全輸入完畢再由這按鍵啟動寫入PLC的程式
※因為這部份的寫入組數容易出錯,所以由程式依來源資料自動算出
3.畫面右邊同樣是由數值輸入元件組成的1D陣列,用來輸入32位元資料,主要設定和中央的16位元資料輸入相同。不同的是數值輸入元件必需設定為I32格式
※同樣寫入組數由程式依來源資料自動算出
再來說明程式部份:
上一篇程式因為要連續讀取,所以是放在Timeout事件中。這一次是由使用者去觸發才會執行寫入動作,所以全部寫到按鍵觸發的Value Change事件中
在上一篇程式的事件中用Add Event Case...在新增一個事件,設定為"控制開關"、"16位元寫入"、"32位元寫入"共用的Value Change事件
主要程式架構如下圖:
同樣通訊參數、起始碼、結束碼和通訊埠關閉元件都放在迴圈外
事件內的程式分成2大部分,左半邊是轉換寫入資料格式,右半邊是執行寫入PLC的部份
先從右邊較簡單的寫入PLC的程式開始說明,同樣是用Flat Sequence Structure元件來控制寫入流程:
第1格把命令控制碼+元件群組位址+寫入組數+算出來的資料字串組成命令字串,然後算出偵誤碼,最後把起始碼+命令字串+結束碼+偵誤碼合成完整的命令字串,再寫入PLC中
有看過比較懶惰點的程式就到此結束,不過有沒有控制成功則要看PLC是否有動作來判定,要確定是否有成功寫入命令還是要把後面的程式完成
第2格一樣是延遲等待PLC回應的時間,注意寫入的組數很多時延遲時間要酌量增加,以免漏失通訊資料
第3格是接收PLC回應字串判斷是否控制成功,這裡用Property Node元件設定為Bytes at Port接收判定PLC回應字串長度
然後讀取PLC回應字串數值在轉換為16進制文字,從回應的字串可以判定是否控制成功
若命令有控制成功,則PLC回應的字串內容為"6",若控制失敗,則PLC回應的字串內容為"15"
再來說明左邊轉換寫入資料格式部份,這部份幾乎沒有任何相關程式資料可參考,完全是靠通訊手冊去摸索出來的
因為有3個元件共用同一事件,程式一開始先要判定是哪一個事件被觸發。這裡只使用16位元寫入和32位元寫入的按鍵來判斷,不屬於這2個按鍵的全歸類到開關陣列的事件
判斷的結果用Case Structure元件來分類,-1頁用來轉換開關陣列資料,0頁用來轉換16位元數值資料,1頁用來轉換32位元數值資料
第-1頁:
用For Loop迴圈加上移位暫存器(用Add Shift Register)來編碼。For Loop迴圈的執行次數就是寫入組數字串轉成的數值
先將控制開關的2D陣列資料拆解為8個1組的1D陣列資料,拆解的資料轉換為2個16進制的數值字串,並將表示上下位元的2個字串交換位置
將重組過的字串在依組別順序串連成資料字串
如果開關陣列是做成1D陣列,也可以如下圖用Delete From Array元件搭配移位暫存器來拆解編碼
第0頁:
先將10進制數值的陣列轉換為每4個字元1組的16進制數值文字陣列,使用Array Size元件取得來源資料的總筆數
將總筆數乘2,再轉換為2個字元的16進制的數值文字,算出來的就是寫入命令用到的寫入組數
總筆數直接設定為For Loop迴圈的執行次數,用For Loop迴圈把陣列拆解為單一字串,再用Replace Substring元件把4個字元1組的字串拆解成每2個字元1組的2組字串,最後把代表上下位的資料字串交換位置重組成新字串
將重組過的字串依組別順序串連成資料字串
第1頁:
先將10進制數值的陣列轉換為每8個字元1組的32進制數值文字陣列,使用Array Size元件取得來源資料的總筆數
將總筆數乘4,再轉換為2個字元的16進制的數值文字,算出來的就是寫入命令用到的寫入組數
32位元編碼的部份較複雜,這裡用內外2層的For Loop迴圈來操作
外層For Loop用總筆數設定執行次數,把文字陣列拆解為單一字串
內層For Loop執行次數設定為2次,先用Replace Substring元件把8個字元1組的字串拆解成每4個字元1組的字串,同樣再用Replace Substring元件把4個字元1組的字串再拆解成每2個字元1組的2組字串,最後把代表上下位的資料字串交換位置重組成共2組的新字串。最後把代表高低位的2組新字串交換位置重組成單一資料字串,到此內層For Loop的工作完畢
把內層For Loop做出來的單一資料字串再依組別順序串連成資料字串
這一系列文章說明的是基本會用到的部份,實際使用時可依需求再組合修改
留言列表