這次要說明的是這一系列文章最後的部份,多點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進制數值的寫法

 

 

首先說明多點控制動作和資料寫入的命令架構(如下圖):

20080830-09  

 

命令字串的組成為:起始碼+命令控制碼+元件群組位址+寫入組數+寫入資料+結束碼+偵誤碼


基本架構和單點ON/OFF的命令類似,只是多了寫入資料這部份,而寫入資料這部份是這篇文章的說明重點。因為寫入資料有既定的格式,所以程式要處理的就是把來源資料編譯成PLC能讀取的格式

 


程式的書寫部份,延續上一篇文章,上一篇文章程式控制面板寫在Tab Control元件的第1頁主畫面上,這次程式控制面板要寫在Tab Control元件第2頁設定頁上。Tab Control元件元件的使用可參考我寫的另一篇文章LabVIEW的換頁功能---Tab Control元件的應用研究

 

先說明這次程式控制面板的配置,共分為3個部份:

20080830-01  

 

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事件

 

 

主要程式架構如下圖:

20080830-02  

 

同樣通訊參數、起始碼、結束碼和通訊埠關閉元件都放在迴圈外


事件內的程式分成2大部分,左半邊是轉換寫入資料格式,右半邊是執行寫入PLC的部份

 

 

先從右邊較簡單的寫入PLC的程式開始說明,同樣是用Flat Sequence Structure元件來控制寫入流程:

20080830-03  

 

第1格把命令控制碼+元件群組位址+寫入組數+算出來的資料字串組成命令字串,然後算出偵誤碼,最後把起始碼+命令字串+結束碼+偵誤碼合成完整的命令字串,再寫入PLC中

 

有看過比較懶惰點的程式就到此結束,不過有沒有控制成功則要看PLC是否有動作來判定,要確定是否有成功寫入命令還是要把後面的程式完成

 

 

第2格一樣是延遲等待PLC回應的時間,注意寫入的組數很多時延遲時間要酌量增加,以免漏失通訊資料

 

 

第3格是接收PLC回應字串判斷是否控制成功,這裡用Property Node元件設定為Bytes at Port接收判定PLC回應字串長度

20080830-04  

 

然後讀取PLC回應字串數值在轉換為16進制文字,從回應的字串可以判定是否控制成功


若命令有控制成功,則PLC回應的字串內容為"6",若控制失敗,則PLC回應的字串內容為"15"

 

 

再來說明左邊轉換寫入資料格式部份,這部份幾乎沒有任何相關程式資料可參考,完全是靠通訊手冊去摸索出來的

因為有3個元件共用同一事件,程式一開始先要判定是哪一個事件被觸發。這裡只使用16位元寫入和32位元寫入的按鍵來判斷,不屬於這2個按鍵的全歸類到開關陣列的事件

 

判斷的結果用Case Structure元件來分類,-1頁用來轉換開關陣列資料,0頁用來轉換16位元數值資料,1頁用來轉換32位元數值資料

 

 

第-1頁:  

20080830-05  

 

用For Loop迴圈加上移位暫存器(用Add Shift Register)來編碼。For Loop迴圈的執行次數就是寫入組數字串轉成的數值


先將控制開關的2D陣列資料拆解為8個1組的1D陣列資料,拆解的資料轉換為2個16進制的數值字串,並將表示上下位元的2個字串交換位置


將重組過的字串在依組別順序串連成資料字串

 

 

如果開關陣列是做成1D陣列,也可以如下圖用Delete From Array元件搭配移位暫存器來拆解編碼

20080830-08  

 

 

第0頁:

20080830-06  

 

先將10進制數值的陣列轉換為每4個字元1組的16進制數值文字陣列,使用Array Size元件取得來源資料的總筆數


將總筆數乘2,再轉換為2個字元的16進制的數值文字,算出來的就是寫入命令用到的寫入組數


總筆數直接設定為For Loop迴圈的執行次數,用For Loop迴圈把陣列拆解為單一字串,再用Replace Substring元件把4個字元1組的字串拆解成每2個字元1組的2組字串,最後把代表上下位的資料字串交換位置重組成新字串


將重組過的字串依組別順序串連成資料字串

 

 

第1頁:

20080830-07  

 

先將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做出來的單一資料字串再依組別順序串連成資料字串

 



這一系列文章說明的是基本會用到的部份,實際使用時可依需求再組合修改 

, ,

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


留言列表 (2)

發表留言
  • 悄悄話
  • 悄悄話

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼

【 X 關閉 】

【PIXNET 痞客邦】國外旅遊調查
您是我們挑選到的讀者!

填完問卷將有機會獲得心動好禮哦(注意:關閉此視窗將不再出現)

立即填寫取消