如果使用一個內(nèi)部變量調(diào)用另外一個內(nèi)部變量,以此,例如被調(diào)用的變量又去執(zhí)行一個腳本(比如,根據(jù)變量變化),此時一個安全機制會阻止這個功能被執(zhí)行。
此安全功能是為了阻止連續(xù)的執(zhí)行。
例如
在內(nèi)部變量 “HMI_Tag_01” 屬性下,“更改數(shù)值”事件去置位內(nèi)部變量 “HMI_Tag_02” 中的某一位。同時內(nèi)部變量 “HMI_Tag_02” 的“更改數(shù)值”事件下又調(diào)用一個腳本。結(jié)果:這個腳本不會被執(zhí)行。
解決辦法
使用和控制器通訊的外部變量。請注意,通過使用外部變量可以規(guī)避上述安全機制。在項目運行時可能會產(chǎn)生問題。
(2)如何在一個腳本中訪問數(shù)組中的元素?
對數(shù)組元素的訪問是通過數(shù)組的名稱和數(shù)組中由括號分隔的數(shù)組索引來實現(xiàn)的:“SmartTags("Array Name")(array index) ”
例如 訪問數(shù)組 "DB10_HMI_Data" 的第二個元素 :
Dim Tag_01 'Internal script tag
Tag_01 = SmartTags("DB10_HMI_Data")(2)
注意
使用下面語法訪問字符串類型數(shù)組中的元素:
Dim Tag_01 'Internal script tag
Tag_01 = SmartTags("DB10_HMI_Data[2]")
例如 通過一個循環(huán)描述數(shù)組 "DM10_HMI_Data" 的第一個元素至第十一個元素
Dim Tag_01
For Tag_01=0 to 10
SmartTags("DB10_HMI_Data")(Tag_01) = 5
Next
局部腳本的數(shù)組(該數(shù)組僅在此腳本中可用)可以使用同樣的方式查詢,對于多維數(shù)組,各個維度通過一個逗號分隔開。
例如 訪問二維數(shù)組變量 "HMI_Data" 沒有連接控制器。
Dim HMI_Data(10 ,10)
Dim Tag_01
Tag_01 = HMI_Data(0 , 5)
注意
當使用控制器連接的數(shù)組元素時,推薦在腳本開始前將他們賦值給腳本內(nèi)部變量,然后再使用內(nèi)部變量進行其他工作。結(jié)束腳本前,將內(nèi)部變量賦值給數(shù)組元素。
(3)如何在控制器和腳本之間有效的賦值過程變量數(shù)組?
從控制器到一個腳本賦值,過程變量數(shù)組需要在一個循環(huán)中將數(shù)組元素一個一個賦值,參考示例。然而,也可以通過一個簡單的指令把局部腳本的數(shù)組的值賦給過程變量數(shù)組。
例如 把控制器的數(shù)組 "CPU_Array" 的值賦給內(nèi)部數(shù)組 "local_array" 和 把內(nèi)部數(shù)組 "local_array" 的值賦給控制器的數(shù)組 "CPU_Array"
Dim local_array(10)
Dim i
...
' Copy from the CPU to the script:
For i = 0 To 9
local_array(i) = SmartTags("CPU_Array")(i)
Next
...
' Copy back to the CPU:
SmartTags("CPU_Array") = local_array
注意使用數(shù)組可能導(dǎo)致較高的通信負載和數(shù)據(jù)不一致。
(4)如何訪問動態(tài)庫 ( "動態(tài)鏈接庫 ",DLLs)?
WinCC Comfort 和 Advanced 不能訪問 DLLs。WinCC Professional在用戶定義的C函數(shù)里可以調(diào)用DLL函數(shù) (DLL = Dynamic Link Library) 。
DLL 位于“..\Common Files\Siemens\bin”文件夾中,或位于 PATH 系統(tǒng)變量所定義的文件夾中。此變量由操作系統(tǒng)的系統(tǒng)屬性指定。
步驟
按如下步驟執(zhí)行,以通過 DLL 調(diào)用函數(shù):
(1)打開要調(diào)用 DLL 函數(shù)的用戶自定義 C 函數(shù)。
(2)在用戶自定義 C 函數(shù)的開始位置添加以下代碼:
#pragma code(".dll")
//聲明在 DLL 中存儲的函數(shù):
(...);
(...);
...
(...);
#pragma code
結(jié)果
<名稱.dll> 中的函數(shù) <函數(shù)名稱 1=""> ... <函數(shù)名稱 n=""> 被聲明??稍谟脩糇远x C 函數(shù)中調(diào)用這些函數(shù)。
示例:
以下示例顯示如何集成“kernel32.dll”文件和調(diào)用“GetLocalTime”函數(shù):
#pragma code("kernel32.dll")
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
#pragma code()
SYSTEMTIME st;
GetLocalTime(&st);
(5)如何用VBS腳本確定鼠標當前的位置?
為了讀取當前鼠標的位置,需要訪問操作系統(tǒng)的 API (Application Programming Interface) 。VBS 不支持通過 DLLs 訪問操作系統(tǒng)的 API 。
(6)為什么不能在腳本里使用 “ MsgBox ” 命令?
“MsgBox” 命令不能用于 WinCC Comfort 和 WinCC Advanced 版本是由于安全的原因。 “MsgBox”的彈出顯示可能會覆蓋掉元素操作,比如:阻止設(shè)備的快速操作。此外,消息框可能會阻止腳本的進一步執(zhí)行。
解決辦法可以使用系統(tǒng)函數(shù) ShowSystemAlarm。
如何在一個腳本中使用十六進制符號給變量賦值?
在腳本編輯器中把字符組合 "&h" 作為個十六進制常數(shù)的標識。
例如
Dim Tag_01
Tag_01 = &h45E ' Corresponds to the decimal value "1118"
(7)如何在腳本里顯示或隱藏各個層級?
使用層是 WinCC (TIA Portal) 開發(fā)系統(tǒng)的一個功能。層只能在這里組態(tài)及顯示隱藏。
這個功能在操作面板或 PC 的運行系統(tǒng)中不可用。所以不能用腳本顯示或隱藏“層”。
解決辦法
在 “ 屬性>動畫>可見性 ” 組態(tài)變量,根據(jù)變量值控制相關(guān)對象的顯示或隱藏。
(8)如何在腳本中合并字符串?
可以使用 “ & ” 來合并字符串:
例如 將 "Tag_Text_01", "Tag_Text_02" 和 "Tag_Text_03" 合并成新字符串 "Tag_01"
Dim Tag_01, Tag_Text_01, Tag_Text_02, Tag_Text_03
Tag_01 = Tag_Text_01 & Tag_Text_02 & Tag_Text_03
注意VB函數(shù) CStr (Expression) 將相應(yīng)的表達式轉(zhuǎn)換為“字符串”類型。 這樣在連接字符串轉(zhuǎn)換之前可以避免運行時出現(xiàn)錯誤。
(9)在腳本中如何在單獨的字符串之間插入一個通配符(空格)?
為了在兩個文本之間插入任意數(shù)量的空格,可以使用兩個引號 " "?!翱崭瘛钡臄?shù)量取決于兩個引號間的距離" "。
連接下一個字符需要再次使用連接操作 "&"。
例如 將字符串 "Tag_Text_01", "Tag_Text_02" 和 "Tag_Text_03" 還有空格組合成一個新的字符串 "Tag_01"
Dim Tag_01, Tag_Text_01, Tag_Text_02, Tag_Text_03
Tag_01 = Tag_Text_01 & " " & Tag_Text_02 & " " & Tag_Text_03
(10)如何組態(tài)帶返回值和參數(shù)的腳本?
腳本類型必須是 “ Function ” 才可以有返回值。所以,請在TIA Portal 中添加新 VB 函數(shù)的 "Properties > General > Settings" 類型的下拉列表框中選擇 “Function” 。
在 “ Parameter ” 表格中您以創(chuàng)建腳本變量用來將內(nèi)部變量或控制器變量傳入在腳本需要的時候。組態(tài)函數(shù)返回值,在腳本中為腳本的名稱分配表達式。
例如
組態(tài)函數(shù)類型,。按下面所示,在TIA Portal 組態(tài)名稱為 “ VBFunction_1 ” 腳本函數(shù)的參數(shù)和返回值:
圖. 01
例如,腳本在按鈕的 “ Click ” 的事件中被使用。
圖. 02
在腳本中使用 "HMI_Tag_1" 的值賦給"Parameter_1" ,"HMI_Tag_2" 的值賦給"Parameter_2" ,必須有一行腳本定義了返回值。
下面的例子的返回值是兩個傳入?yún)?shù)的乘積:
VB_Function_1= Parameter_1 * Parameter_2
"VB_Function_1" 是這個函數(shù)的名字,在執(zhí)行這個腳本后,"HMI_Tag_3" 獲得這個函數(shù)的返回值是 "HMI_Tag_1" * "HMI_Tag_2" 。
注意
定義一個 "by reference" 的參數(shù) ,這意味著作為 "By_Ref " 參數(shù),僅對腳本中定義的和引用的變量產(chǎn)生影響,對 HMI 內(nèi)部變量或者控制器變量不起作用。
(11)如何在運行時改變對象的屬性(顏色,長度等)?
以下手冊中提供了對象的屬性和使用的信息:
SIMATIC WinCC WinCC Engineering V15 - 編程參考下 "VB腳本編寫 > VBS 對象模型 > 屬性"。(沒有該手冊的可以聯(lián)系主編)
(12)什么能導(dǎo)致“最大嵌套深度到達”消息被觸發(fā)?
如果太多的腳本在結(jié)束前調(diào)用自己或者調(diào)用其他腳本,會引起到達最大嵌套深度消息。
解決方法檢查腳本過程的處理,如有必要,減少腳本的嵌套。
(13)如何確定當前畫面的編號和畫面名稱?
通過預(yù)定義 VB 函數(shù) “HmiRuntime.BaseScreenName ” 的返回值提供了當前畫面的名字。
注意
不能使用腳本通過相關(guān)畫面的“屬性”直接讀取畫面名稱/編號。
也可以使用“畫面編號”區(qū)域指針。
(14)如何在腳本中使用多路復(fù)用變量?
多路復(fù)用變量不能用在腳本中。
(15)如何在腳本里使用 HMI UDT 變量?
可以使用“SmartTags” 訪問數(shù)據(jù)類型是HMI UDT的變量元素(用戶定義的數(shù)據(jù)類型)。
例如 訪問 UDT 變量 " Recipe " 的元素 "x"
SmartTags("Recipe.x")
注意
這適用于在項目中已創(chuàng)建庫類型 HMI UDT的實例。不能直接訪問庫類型。
(16)如何在腳本中保存變量值當他們在兩個腳本之間調(diào)用?
在兩個腳本間相互傳遞數(shù)據(jù)需要使用全局變量。全局變量可以是 HMI 或者 PLC 變量。
腳本中定義的變量總是在腳本結(jié)束時刪除。
(17)如何通過腳本修改文本域的內(nèi)容?
文本域的文本在運行時可以通過修改相應(yīng)的對象屬性而改變。
例如 在畫面 "MachineData" 中,將文本 "NewText" 分配給 文本域 "Text_Field_01" :
Dim obj
Set obj = HmiRuntime .Screens("MachineData") .ScreenItems("Text_Field_01")
obj .Text = "NewText"
注意
文本的變化只是“暫時”的。當屏幕更改后這個被修改后的文本將被組態(tài)的文本覆蓋。
(18)如何在腳本中從密碼列表或用戶視圖中讀取用戶密碼?
由于安全原因這個功能在 WinCC (TIA Portal) 中不能實現(xiàn)。
(19)如何通過腳本關(guān)閉 WinCC 運行系統(tǒng)和關(guān)閉PC和面板?
通過系統(tǒng)函數(shù) “StopRuntime” 可以關(guān)閉 WinCC 運行系統(tǒng)和操作系統(tǒng) 。
可以通過修改 "StopRuntime" 函數(shù)的參數(shù)方式選擇僅關(guān)閉運行系統(tǒng)或者將運行系統(tǒng)和操作系統(tǒng)都關(guān)閉。
Parameter
Meaning
0 = hmiStopRuntime
Ends on the Runtime
1 = hmiStopRuntimeAndOperationSystem
Ends both the Runtime and the OS
例如StopRuntime hmiStopRuntime
StopRuntime 1
注意 Windows-based 面板的操作系統(tǒng)不能通過這種方式關(guān)閉。
(20)如何在腳本中訪問一個畫面或者模板的對象?
組態(tài) “Runtime” 對象的屬性 “ ActiveScreen ”,可以找到畫面上組態(tài)對象的名字和修改相關(guān)的屬性。
例如 把激活屏幕中的對象 "Circle_01" 設(shè)置為不顯示
HmiRuntime .ActiveScreen .ScreenItems("Circle_01") .Visible=False
注意
在畫面中被組態(tài)對象必須有唯一的名字。對象的屬性修改僅是暫時的,當屏幕更改后視圖使用組態(tài)時的配置。
如何在運行時選擇一個畫面對象(例如輸入輸出域)?
獲得一個對象的焦點通過 "Activate" 功能,文本輸入會直接自動指向那個對象。
例如 獲得屏幕 "Screen_1" 的 輸入/輸出域 "IOField_1" 的焦點
HMIRuntime.Screens("Screen_1").ScreenItems("IOField_1").Activate