題外話
近日,發現了一張有助於大家理解OA架構的圖,在此分享給大家
有關OA架構的文章大家可以參考 WinCC OA前言-透視OA軟件架構
Control 腳本執行流程
我們知道 control 腳本 作為OA系統里的粘合劑,幫助WinCC OA 實現了在線開發,在使用過程中難免對contrtol的執行步驟及流程有所困惑,比如全局變量該怎么設置,
今天就帶領大家仔細研究下control的啟動及加載流程.
流程圖
上圖總結了 control 運行的流程, 我們現在假設有一個string類型的變量tag1,需要在 Control Manager 及Panels 中訪問,
OK ,讓我們操練起來
1) 創建全局變量 tag1
我們在項目的Liraries文件夾下 創建了globalTest.ctl文件
2) Control Manager 引用並修改
我們在control manager 啟動文件里 添加了jiang.ctl
jiang.ctl 負責引入 剛剛創建的globalTest.ctl 庫文件 並修改tag1內容,
3) 創建第一個測試用panel
新建一個測試用panel script1.pnl 並在ScopeLib 里 引用“globalTest.ctl”,同時我們定義一個tag2
我們在initialize 事件里分別打印 tag1 及tag2
重啟Control Manager 及運行script1.pnl 注意觀察LogViewer
我們看到 全局變量 都打印出來了 但是在control manager 里面修改的內容 script1.pnl並沒有拿到
重點
前幾篇文章 我們說過 WinCC OA 里的Control Manager 與User Interface(本文的gedi),都是獨立的進程,
OA為了讓全局變量更加安全可控,並沒有采用全局共享內存的方法,而是在每個進程引用全局變量的時候,分別拷貝一份副本供自己使用
因此 自定義的庫文件jiang.ctl里面的tag1 才會出現上圖現象,但是相同進程里的操作是同一份全局變量,我們可以做個小實驗
4) 創建嵌入式panel並測試
1)讓我們新建一個script2.pnl,同樣在ScopeLib里使用#uses "globalTest.ctl"引用全局變量,之后在面板里面放置一個按鈕, 按鈕用來打印tag1並加上標記
2) 將script2.pnl 拖拽放入script1.pnl
3) 在script1.pnl內新增一個按鈕 打印tag1 並加上標記panel1 marked;
運行這個復合面板 script1.pnl 打印結果如下
三次點擊 分別都加上了各自的印記
思考?
如何在Control Manager 與 User Interface 里同時操作一個全局變量?
還記得我們說過 Control Manager 與User interface 都是通過EV 發送及接受消息的,結合之前說過的 定時器 ,相信大家一定會想到方法