主要內容
1、WinCC 腳本系統概述
2、ANSI - C 腳本概述
3、VBS 腳本概述
4、探討 WinCC 腳本( C 和 VBS )
5、VBA 應用解析
6、WinCC 腳本調試和診斷
1、WinCC 腳本系統概述
- 為何使用 WinCC 腳本系統?
- 使用 WinCC 腳本的優勢在於,雖然 WinCC 通過組態也可以實現部分圖形和過程的動態化,但是使用腳本更加靈活、功能更加豐富和強大。
- WinCC 腳本系統由哪些部分組成?
- 主要由以下三部分組成:C 腳本、VBS 腳本和 VBA 。
2、ANSI - C 腳本概述
- C 腳本使圖形和過程動態化是通過使用函數和動作實現的,如下圖所示:
- 函數是一段代碼,可在多處使用,但只能在一個地方定義。WinCC 包括許多函數。函數一般由特定的動作來調用。此外,用戶還可以編寫自己的函數和動作。
- 動作用於獨立於畫面的后台任務,例如打印日常報表、監控變量或執行計算等。動作由觸發器啟動。
- 觸發器類型如下圖所示:
• 項目函數、標准函數、內部函數在特征上的區別:
• WinCC 提供了一系列標准函數,標准函數主要提供了以下的功能:
- Alarm 組包含控制 WinCC 報警相關的函數。
- Graphics 組包含用於圖形系統編程的函數。
- Report 組包含用來啟動打印作業的打印預覽或打印輸出的函數。
- TagLog 組包含控制 WinCC 表格控件和 WinCC 趨勢控件的函數。
- WinCC 組包含WinCC 系統的函數。
- Windows 組僅包含 ProgramExecute 函數。
GMsgFunction函數
函數 GMsgFunction 的傳入參數提供了一系列消息數據,包括消息狀態、消息號、時間戳等,具體內容參見幫助文檔中結構體 MSG_RTDATA_STRUCT 的定義。
在“GMsgFunction()“ 函數中還可以獲取消息的文本(或過程值、消息類別等)。
以下代碼中使用了來自於 WinCC ODK 選件包中的函數“MSRTGetMsgCSData”,首先判斷如果消息的狀態為“到來”,根據消息號獲取消息的組態數據,具體內容參見結構體 MSG_CSDATA_STRUCT 的定義;再調用”MSRTGetMsgText” 函數根據文本庫中的文本 ID 得到消息文本的內容。
• WINCC 內部函數提供的主要功能如下:
- Allocate 組包含分配和釋放內存的函數。
- C_bib 組包含來自 C 庫的 C 函數。
- Graphics 組中的函數可以讀取或設置 WinCC 圖形對象的屬性。
- Tag 組的函數可以讀取或設置 WinCC 變量。
- WinCC 組的函數可以在運行系統中定義各種設置。
• 此外,C 腳本還提供豐富的擴展功能:
- 調用 Windows API 函數。例如,使用 GetOpenFileName 實現打開選擇文件對話框的功能。
- 調用 C 函數。例如,使用 SetXGinaValue() 鎖定/釋放 Windows 組合鍵。
- WinCC 還允許用戶使用自定義的 DLL,例如,使用自定義的 DLL 實現跟第三方設備通信。
注意:使用 VB 創建的 DLL 不能被加載。
調用動態鏈接庫時,在函數或動作前需要添加如下代碼:
3、VBS 腳本概述
- WinCC 集成了微軟基於 VB 的運行期腳本語言,使用微軟標准的工具編輯和調試,使用 VBS 能夠訪問 ActiveX 控件和其它 Windows 應用的屬性和方法。
- WinCC 使用 VBScript 可以實現如下功能:
1.在 WinCC 中實現圖形動態化。
2.讀寫變量、啟動報表。
3.連接數據庫。
4.通過 Microsoft Outlook 發送電子郵件。
5.集成 Microsoft Internet Explorer。
6.聯接 Office 應用 ( Excel, Word, Access )。
• VBS 腳本的過程(Procedures)、模塊(Modules)和動作(Atcion)
- 過程是一段代碼,類似於 C 語言中的函數。模塊是一個文件,存放着一個或多個過程。相互關聯的過程應該存放在同一模塊中。
- 在運行狀態下,如果通過動作調用某個過程時,包含此過程的模塊也會被加載。所以,我們要合理的組織模塊。
例如,可以把用於特定系統或畫面的過程組織在一個模塊中。我們也可以按照功能來構建模塊,例如,可以把具有計算功能的過程放在一個模塊中。
• WinCC 運行系統訪問數據庫的三種方法:
1、使用 WinCC OLE DB Provider 訪問 WinCC 過程值和消息歸檔(注意,如果是遠程訪問,Data Source 應為 “<計算機名稱>\WinCC”):
Set conn = CreateObject("ADODB.Connection")
conn.open "Provider=WinCCOLEDBProvider.1;Catalog=CC_OpenArch_03_05_27_14_11_46R;Data Source=.\WinCC"
2、使用 MS OLE DB Provider 訪問 WinCC 用戶歸檔:
Set conn = CreateObject("ADODB.Connection")
conn.open "Provider=SQLOLEDB.1; Integrated Security=SSPI; Persist Security Info=false; Initial
Catalog=CC_OpenArch_03_05_27_14_11_46R; Data Source=.\WinCC"
3、使用 VBS 腳本通過 ODBC 訪問 Access 數據庫:
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=MSDASQL;DSN=SampleDSN;UID=;PWD=;" conn.Open
4、探討 WinCC 腳本( C 和 VBS )
• WinCC 變量讀寫 - 異步讀
• C-function: GetTagXXX or VBS: read
第一次讀取變量時,需要向 AS 系統請求值,並且將該過程變量添加到映像區,此后,映像區中的變量周期地從 AS 系統請求數據。再次讀取變量時,直接將映像區中的數據返回。
關閉畫面時,映像區中的變量注銷;如果變量是在全局腳本動作中請求的,在 WinCC 運行期間,變量始終保留在映像區中注冊的狀態。
• WinCC 變量讀寫 -同步讀
• C-function: GetTagXXXWait or VBS read (1)
該方式直接從 AS 系統讀取當前值。使用同步方式讀取變量時,比異步方式讀取將花費更長的時間;所需的時間取決於具體的 AS 系統和通道。為了避免性能問題,在周期觸發的 C 動作中不要使用這種方式。
• 異步讀和同步讀的比較:
- 異步讀第一次讀取變量時,需要向 AS 系統請求值,並且將該過程變量添加到映像區,因此比同步讀的第一次讀取需要更長的時間。
- 異步讀要求映像區中的變量周期地從 AS 系統請求數據,這增加了系統的基本負載,使用同步讀不存在該問題。
- 再次讀取變量時,異步讀直接將映像區中的數據返回,變量讀取的時間不受 AS 系統和總線負載的影響。同步讀直接從 AS 系統讀取當前值,比異步讀方式讀取將花費更長的時間。
• WinCC 全局腳本和畫面腳本的隊列概覽:
- C 腳本包含如下三個腳本隊列,
- 1. 全局腳本的請求。
- 2. 畫面的由事件觸發的請求。
- 3. 畫面的循環請求。
- VBS 腳本包含如下三個腳本隊列,
- 1. 全局腳本的請求。
- 2. 畫面的由事件觸發的請求。
- 3. 畫面的循環請求。
WinCC 腳本線程的測試方法舉例(1):
實驗1 :全局腳本的阻塞問題
描述:全局腳本的各個動作同時運行在同一個線程中,其中一個動作發生阻塞,會影響另外一個動作。
動作1:設定每隔 2 秒鍾執行一次,變量1 加 1。
動作2:設定每隔 2 秒鍾執行一次,變量2 加 1,使用 Sleep 函數延遲 5 秒鍾。
結論:使用輸入\輸出域顯示兩個變量,兩個變量都是大約每隔 5 秒鍾加 1。
如果沒有 Sleep 函數,兩個變量都是大約每隔 2 秒鍾加 1。
因此,全局腳本的多個動作是互相影響的。
WinCC 腳本線程的測試方法舉例(2):
實驗2 :測試畫面中由事件觸發的腳本和全局動作是否在同一線程
步驟1:在畫面中加入按鈕1,設置某一內部變量的值,觸發一個全局動作,在全局動作中使用 Sleep 函數延遲 5 秒鍾。
步驟2:在畫面中加入按鈕2,實現某個內部變量加 1。
結論:點擊按鈕 1 觸發全局動作后(動作1),立刻點擊按鈕 2(動作2),內部變量可以立即加 1,說明畫面中由事件觸發的腳本線程和全局動作互不干擾,分別運行在不同的線程。
• 使用動態對話框、動態向導、 C 腳本、VBS 腳本分別實現動態改變對象的背景顏色。
方法一 :使用動態對話框。根據變量值設置矩形的背景顏色,並且可以根據該變量的狀態指定特定的顏色。
方法二 :使用動態向導 [標准動態] / [基於表格的顏色動態]。針對不同的顏色需要分別設定表達式或變量。
針對變量連接錯誤,單獨分配了一種顏色。使用掩碼篩選條件,例如,xxxxxx01 代表只要變量最末兩位是01 的即可滿足條件。缺點是第一次組態時不是很容易上手,需要理解各項的含義。
方法三 :使用 C 腳本。使用 C 腳本比較靈活,本例中使用動態向導生成的 C 腳本即可滿足要求(推薦)。
首先使用 GetTagDWordState 獲取指定變量的狀態,如果返回值是非 0(0=No error),返回錯誤時對應的顏色;否則,根據變量的值,返回相應的顏色。
方法四 :使用 VBS 腳本。可以根據不同的變量值設置矩形的背景顏色,使用質量代碼來判斷變量的狀態信息,代碼邏輯與 C 腳本類似。
• 畫面窗口與腳本相關的幾個問題(1):
1、畫面窗口隱藏時,畫面窗口中畫面的循環請求的腳本是否還在運行?
結論:當畫面窗口隱藏或關閉時,畫面窗口中畫面的循環請求的腳本將立即停止執行,畫面窗口再次顯示時繼續執行腳本。
2、對於畫面的循環請求的腳本,主畫面和畫面窗口中的腳本在同一個線程中嗎?
結論:它們位於同一個線程。在主畫面和畫面窗口中分別對兩變量執行加 1 的操作,在其中一段腳本中添加Sleep 函數延時,另一段腳本也會發生堵塞,所以兩腳本在同一線程中順序執行。
• 多用戶系統、分布式系統的腳本運行情況:
1. 局部動作和全局動作。局部動作保存在項目目錄的 “\<computer_name\Pas” 子目錄中,局部動作可指定給單獨的計算機, 因此可以確保只在服務器上打印報表。全局動作保存在 WinCC 項目的 “\Pas” 子目錄中,與局部動作相反,全局動作在客戶機-服務器項目的所有項目計算機上執行。
2.在分布式系統中,如果客戶使用腳本訪問服務器上的變量,需要在變量前添加服務器前綴或設置標准服務器,格式為<服務器前綴>::<變量名稱>。對於一對冗余服務器,只有一個服務器前綴。
新版本中:“@NOTP”取消變量前綴。“@NOSP”取消服務器前綴。“@NOP”取消變量前綴和服務器前綴。
3、在分布式系統中,只有當客戶機上有 C 動作、函數或 VBS 動作以及全局腳本的過程時,才可以在客戶機上運行它們。 全局 C 和 VBS 腳本都不是數據包的組成部分。
4、在多用戶項目中,腳本將集中存儲在服務器的項目文件夾中。 腳本在編輯期間,將阻止其它客戶機訪問文件(腳本或畫面)。
• WinCC 選件 Web Navigator 對腳本函數的支持
Web Navigator 客戶機只能支持一定數量的腳本函數,當 Web Navigator 畫面腳本中調用了不支持的腳本函數時,可能會發布不成功。此外,全局腳本不能在 Web 客戶機上運行。
• C 腳本和 VBS 腳本的交叉索引
WinCC 交叉索引助手是一個在腳本中搜索畫面名稱和變量腳本並補充相關腳本的工具,以便 WinCC 使用交叉索引查找畫面名稱和變量,並在交叉索引列表中列出它們。注意,交叉索引助手只針對 C 腳本。
WinCC 在創建交叉索引列表時,函數調用中的變量和畫面名稱能被正確識別,為搜索和替換在 C 動作中使用的變量和畫面名稱,必須如下編寫腳本,在腳本的開始處,必須分兩段聲明所有變量和畫面名,段的結構如下:
• 借助於 WinCC 交叉索引助手,在腳本管理器中已知的所有函數調用由以上描述的格式替換。 只有項目函數、畫面和動作被轉換。
5、VBA 應用解析
• VBA功能表
6、WinCC 腳本調試和診斷
• 如何調試 C 腳本?
1)變量監視
- 使用 printf 輸出變量值和提示信息到 GSC 診斷窗口。在 GSC 診斷窗口中,按調用的順序輸出 printf 指令。
2)錯誤診斷
- 通過 “OnErrorExecute()” 調試功能輸出診斷錯誤。當執行動作或函數發生錯誤時,操作系統自動調用
“OnErrorExecute()” 函數,並將錯誤信息輸出到診斷窗口中。
3)GSC 運行
- GSC 運行系統提供關於所有(全局腳本)動作的動態特性信息,使用它可以開始或結束單個動作,提供每個全局動作的狀態、何時啟動、激活時間間隔等一系列信息。
• 如何利用“OnErrorExecute()” 提供的信息進行診斷?
• 如何調試 VBS 腳本?
1)使用微軟的腳本調試器(Microsoft Script Debugger )可以實現如下功能:
- 使用 [ Running Documents ] 來察看需要調試的腳本源代碼;
- 腳本的斷點設置、單步運行調試等;
- 使用 [ Command Window ] 顯示或修改變量和對象的屬性; - 監控腳本的執行過程。
2) 使用 HMIRuntime.Trace 輸出變量值和提示信息到 GSC 診斷窗口。
3) 錯誤診斷
- 使用 LastError、ErrorDescription 和 QualityCode 等屬性進行錯誤診斷。
• Tips -- 在 WinCC 腳本編寫過程中的需要注意的問題:
- WinCC 腳本系統只提供有限的腳本線程,過多、過於復雜的腳本勢必造成線程隊列的堵塞,大量腳本在隊列里排隊等待,最終影響 WinCC 運行系統的性能。建議用戶盡量不要編寫耗時的容易造成堵塞的腳本。
- 內存泄漏也極易導致系統性能的下降。例如,WinCC 的 C 腳本中使用 SysMalloc 分配內存,使用 SysFree釋放內存,如果用戶忘記調用 SysFree 函數,會導致程序內存不斷上漲。因此,在腳本中的任何位置調用分配內存的函數后,務必要在使用后將內存釋放。
- 要善於運用腳本的診斷工具和調試方法。因為腳本通常在后台運行,一旦腳本發生錯誤,不容易被發現,診斷工具能夠及時地發現錯誤,調試工具能夠幫助客戶快速的發現問題所在。