寫在面前
原文內容:巧用InTouch 實現多級菜單管理及其核心代碼淺析
前面我們分享了西家,羅家,和施家組態軟件與SQL SERVER數據庫的通訊;
羅克韋爾FactoryTalk View Studio如何訪問SQL SERVER數據庫?
WinCC (TIA Portal) 和WinCC flexible 訪問 SQL SERVER數據庫
西家、羅家、施家組態軟件連接數據庫—Intouch利用SQL數據庫發郵件
今天我們來聊一聊如何用Intouch做出多級菜單管理~
“Intouch作爲一個非常開放的單機版上位機組態軟件,不僅能夠實現與幾乎所有工控設備的通訊,它其實還有很多隱藏的功能,可以作爲容器嵌入很多ActiveX控件(圖形、動畫、音視頻、攝像頭、曲線、報表等),第三方軟件可以開發出很多方法函數的功能封裝成dll文件以供Intouch內部腳本調用起到程序保密的作用。在這裏利用其擴展函數WWContext()區域定位以實現多級菜單的管理系統。”
步驟
功能設計(主菜單、子菜單、子子菜單)
計算各級菜單的定位
闡述菜單管理系統的用法
編寫腳本
01-菜單設計
一般將整個畫面系統分爲操作界面和配置界面。操作界面供操作人員監控、參數設置、查看曲線、報表報警查詢等;具有工程師權限的人纔可以進入到配置界面,可以對菜單命名先後排列順序進行調整,可以設置各級菜單的入口權限。
主菜單:以文本和方框疊加爲一組組成一個菜單,預先設定主菜單的數量上限假如爲10,則設計10組主菜單,從左到右依次排列開來,整個主菜單作爲操作人員的唯一界面入口。
子菜單:附屬在主菜單下面,經主菜單隨意調用以及分配入口權限。
子子菜單:附屬在子菜單下面,經子菜單隨意調用以及分配入口權限。
02-菜單定位
菜單定位涉及到每個文本、方框、窗口的(X,Y)座標值的動態改變,以及它們的寬度和高度的隨之相應的變化。
首先使用WWContext()函數獲取窗口的區域定位,這樣鼠標遊走在哪個區域就會觸發相應的動作,這個動作可以是使文本或方框填充變色,也可以觸發一個腳本給某個標記名賦值或者打開和關閉某些窗口。實際上這個WWContent()函數的就是省去了鼠標的點擊動作,節省了手指頭的力氣開支。
給不同區域命名以作條件判斷
WWContext(“分級菜單”,75,53,132,45,Tip_Name, “Menu01”);
WWContext(“分級菜單”,207,53,132,45,lTip_Name, “Menu02”);
WWContext(“分級菜單”,339,53,126,45,Tip_Name, “Menu03”);
WWContext(“分級菜單”,465,53,120,45,Tip_Name, “Menu04”);
WWContext(“分級菜單”,585,53,132,45,Tip_Name, “Menu05”);
WWContext(“分級菜單”,717,53,132,45,Tip_Name, “Menu06”);
WWContext(“分級菜單”,849,53,132,45,Tip_Name, “Menu07”);
WWContext(“分級菜單”,849,53,132,45,Tip_Name, “Menu08”);
WWContext(“分級菜單”,849,53,132,45,Tip_Name, “Menu09”);
WWContext(“分級菜單”,849,53,132,45,Tip_Name, “Menu10”);
比如:當鼠標進入Menu01區域時觸發某動作,進入Menu02區域時觸發某動作…後面就都是if…elseif…else…endif…的嵌套了,這是鼠標懸停下拉菜單的核心原理。
實際上,只要是具有“觸動按鈕”的動作屬性的控件都具有“鼠標懸停時”的功能,只是它倆的使用策略不同罷了。
若是要說鼠標精確定位哪個更好用,那當然就是非WWContext()莫屬了。原因是“鼠標懸停時”這個腳本功能只能寄託於控件元素這個對象之上,脫離了它就不起作用了。而WWContext()的作用對象是整個窗口界面,它比“鼠標懸停時”定位範圍更大,不受控件切換的影響,所以孰優孰劣十分明顯。
03-菜單用法
鼠標懸停下拉菜單管理是一個系統,因爲它牽一髮而動全身,後期維護便於管理,條理清晰,工程師和管理員之間可以完美交互,管理員只需要在配置界面修改若干參數即可。如下圖所示:
禁用菜單:選擇權限爲6000這個等級,管理員通過勾選對應主菜單、子菜單、子子菜單的CheckBox單選框來授權是否可以開通屬於6000這個等級的所有用戶的操作權限。若禁用,則用6000這個等級登陸的用戶會看到界面上菜單名稱均爲灰色並鼠標觸碰無效;若開通,則菜單名稱爲黑色,用戶鼠標可觸碰菜單名稱變爲白字藍底。
菜單名稱:管理員可以更改某個菜單名稱並且修改這個菜單名稱所鏈接的窗口腳本等。
隱藏/顯示:管理員可隱藏和顯示某些菜單來達到不該看的不讓看。
以上所有實現不需要具有修改工程內容即可完成。
而“中國式”工控工程師的開發習慣。一般我們開發一個畫面功能我們只做簡潔實現,比如我們點擊按鈕打開窗口代碼這樣寫:
show “窗口”;
禁用或開啓6000安全等級的按鈕或輸入框權限爲:
$Accesslevel > 6000
這樣完全分散開了,後期業主要求做個修改就必須再次修改工程內容,工作量非常大。
04-編寫腳本
爲了實現整個菜單系統的功能,一共寫了將近2000多行代碼(條件腳本、數據改變腳本、Function函數、窗口腳本),篇幅有限,只能展示主要的代碼結構如下所示:
IF ( menu_MainSelected.00 ) THEN
…
ShowTopLeftAt( menu_Name, menu_XPos1, menu_YPos );
ENDIF;
IF ( menu_MainSelected.01 ) THEN
…
ShowTopLeftAt( menu_Name, menu_XPos2, menu_YPos );
ENDIF;
IF ( menu_MainSelected.02 ) THEN
…
ShowTopLeftAt( menu_Name, menu_XPos3, menu_YPos );
ENDIF;
IF ( menu_MainSelected.03 ) THEN
…
ShowTopLeftAt( menu_Name, menu_XPos4, menu_YPos );
ENDIF;
IF ( menu_MainSelected.04 ) THEN
…
ShowTopLeftAt( menu_Name, menu_XPos5, menu_YPos );
ENDIF;
IF ( menu_MainSelected.05 ) THEN
…
ShowTopLeftAt( menu_Name, menu_XPos6, menu_YPos );
ENDIF;
IF ( menu_MainSelected.06 ) THEN
…
ShowTopLeftAt( menu_Name, menu_XPos7, menu_YPos );
ENDIF;
IF ( menu_MainSelected.07 ) THEN
…
ShowTopLeftAt( menu_Name, menu_XPos8, menu_YPos );
ENDIF;
IF ( menu_MainSelected.08 ) THEN
…
ShowTopLeftAt( menu_Name, menu_XPos9, menu_YPos );
ENDIF;
IF ( menu_MainSelected.09 ) THEN
…
ShowTopLeftAt( menu_Name, menu_XPos10, menu_YPos );
ENDIF;
以上是實際效果
注意
要協調好主菜單、子菜單、子子菜單的定位關係;各個菜單界面可以利用公共模板窗口給中間變量賦值的形式來動態切換菜單內容以及窗口鏈接;需要對子菜單超出窗口的邊界的情況加以判斷並調整子菜單的X座標位置;創建的標記名數需要幾百個,這其中有需要勾選保留值的標記名(用以存儲菜單名稱以及等級權限);
往期推薦
施耐德
施耐德Wonderware system platform介紹
施耐德SoMachine平臺Ethernet/IP通訊解決方案
西門子TIA Portal大魚吃小魚VS施耐德Intouch潛水艇小遊戲
網絡-通訊
淺談 MES、SCADA、PLC項目中的串口通信(232,485,422)及常見問題
Modus 的RTU、ASCII、TCP傻傻搞不清楚?這將是你見過的最全面分析
MES、SCADA下的數據採集— 西門子S7comm協議分析
[ 附labview下載 ]LabVIEW與RS232串口通信