在工程實際應用中,我們可能遇到一些交互式功能用到組合框、單選框、復選框控件,而這些控件的內容不是固定的,可能是來自數據庫的某個字段,我們還希望在畫面切換回來后,選擇項不要發生變化回到初始狀態。經過測試,可以按照以下步驟實現這樣的功能。
一 SQL Server的准備工作
開放sa用戶,默認是禁用的,開放后使用windows和SQL混合授權的模式,如果使用sa連接數據庫報錯,那么就打開sql configuration manager,把幾個協議都啟用。啟用協議后需要停止sql服務,再重啟,然后就可以使用sql用戶方式登陸了,這個對后面wincc連接數據庫腳本很重要。
二 建立數據表
假設三個控件的內容分別來自數據庫MyDB的三張表myList、MyOption、MyCheck,三張表都只有一個字段,分別是List、OptionList、CheckList。
三 建立Wincc內部變量,用於存儲用戶選擇。
在Wincc中新建三個無符號32位數,名字分別是ComBoxSelIndex、OptionListSelIndex、CheckListSelIndex,默認值均是1(默認三個控件選擇第一項)。
四 了解三個控件主要屬性
1. 組合框的主要屬性
.NUMBERLINES 表示組合框有多少個選項
.INDEX 表示組合框的索引,從1開始
.TEXT 表示組合框某個索引時的顯示文本是啥
.SELINDEX 操作人員選中的是第幾項,從1開始
.SELTEXT 操作人員選中了什么文本
2. 單選框的主要屬性
.BOXCOUNT 表示單選框有多少個選項
.INDEX 表示單選框的索引,從1開始
.TEXT 表示單選框某個索引時的顯示文本是啥
.PROCESS 操作人員選中的是第幾項,從1開始
3. 復選框的主要屬性
.BOXCOUNT 表示復選框有多少個選項
.INDEX 表示復選框的索引,從1開始
.TEXT 表示復選框某個索引時的顯示文本是啥
.PROCESS 操作人員選中的是哪幾項,從1開始
五 畫面准備工作
為了測試畫面切換,選項不變的功能,新建三個畫面存放三個控件,畫面名稱分別是ComBox.pdl,Option.pdl,Check.pdl。 組合框的名稱修改為Combox,單選框的名稱修改為OptionList,復選框的名字修改為ObjCheck。
六 組合框頁面的腳本
1. 頁面打開的腳本
實現頁面一打開,就從數據表MyList中把字段List每個記錄寫入控件,同時讀取用戶上一次選擇的項目編號。腳本如下:
Sub OnOpen()
Dim combox
Dim conn,ssql,ors,scon,ocom,i
Dim PCName
PCName=HMIRuntime.Tags("@LocalMachineName").Read
scon="Provider = SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog =MyDB;Data Source = " &PCName & "\WINCC"
ssql="select List from Mylist"
Set conn=CreateObject("ADODB.Connection")
conn.ConnectionString=scon
conn.Cursorlocation=3
conn.open
Set ors=CreateObject("ADODB.RecordSet")
Set ocom=CreateObject("ADODB.Command")
ocom.commandtype=1
Set ocom.ActiveConnection=conn
ocom.CommandText=ssql
Set ors=ocom.Execute
ors.movefirst
Set Combox=ScreenItems("Combox")
combox.NumberLines = ors.recordcount '讓組合框的可選項數量與數據表記錄數一樣
For i=1 To ors.recordcount
Combox.Index =i
Combox.Text =ors.fields(0).value
ors.movenext
Next
Set ors=Nothing
conn.close
Set conn=Nothing
'讀取操作人員上一次選擇
combox.selindex=hmiruntime.Tags("ComBoxSelIndex").Read
End Sub
2. 操作人員修改選項時的腳本
操作人員修改了選擇,那么需要及時把修改情況記錄下來,一邊下一次畫面切換回來仍然保持原選擇。我們在組合框的事件-“屬性主題-其他-選擇框-更改”寫入以下腳本:
Sub SelIndex_OnPropertyChanged(ByVal Item, ByVal value)
HMIRuntime.Tags("ComBoxSelIndex").Write value
End Sub
3. 其他腳本
擴展一下,有時我們可能需要讀取一下控件其他的屬性,下面給出幾個例子參考一下。
計算組合框有多少個可選條目
Sub OnClick(ByVal Item)
Dim combox
Set combox=ScreenItems("Combox")
Msgbox combox.NumberLines
End Sub
刪除組合框條目只保留一條
Sub OnClick(ByVal Item)
Dim combox,i
Set combox=ScreenItems("combox")
combox.numberlines=1
combox.index=1
combox.text=""
End Sub
顯示當前操作人員選中的是第幾項
Sub OnClick(ByVal Item)
Dim combox
Set combox=screenitems("combox")
Msgbox combox.selindex
End Sub
顯示用戶當選選擇的項目內容
Sub OnClick(ByVal Item)
Dim combox
Set combox=screenitems("combox")
Msgbox combox.seltext
End Sub
七 單選框的腳本
1. 頁面打開的腳本
實現頁面一打開,就從數據表MyOption中把字段OptionList每個記錄寫入控件,同時讀取用戶上一次選擇的項目編號。腳本如下:
Sub OnOpen()
Dim OptionList
Dim conn,ssql,ors,scon,ocom,i
Dim PCName
PCName=HMIRuntime.Tags("@LocalMachineName").Read
scon="Provider = SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog =MyDB;Data Source = " &PCName & "\WINCC"
ssql="select OptionList from MyOption"
Set conn=CreateObject("ADODB.Connection")
conn.ConnectionString=scon
conn.Cursorlocation=3
conn.open
Set ors=CreateObject("ADODB.RecordSet")
Set ocom=CreateObject("ADODB.Command")
ocom.commandtype=1
Set ocom.ActiveConnection=conn
ocom.CommandText=ssql
Set ors=ocom.Execute
ors.movefirst
Set OptionList=ScreenItems("OptionList")
OptionList.boxcount = ors.recordcount '讓組合框的可選項數量與數據表記錄數一樣
For i=1 To ors.recordcount
OptionList.index =i
OptionList.Text =ors.fields(0).value
ors.movenext
Next
Set ors=Nothing
conn.close
Set conn=Nothing
Set OptionList=screenitems("OptionList")
'讀取上一次操作人員的選擇
OptionList.process=hmiruntime.Tags("OptionListSelIndex").Read
End Sub
2. 操作人員修改選項時的腳本
操作人員修改了選擇,那么需要及時把修改情況記錄下來,一邊下一次畫面切換回來仍然保持原選擇。我們在組合框的事件-“屬性主題-輸入輸出-選擇框-更改”寫入以下腳本:
Sub Process_OnPropertyChanged(ByVal Item, ByVal value)
HMIRuntime.Tags("OptionListSelIndex").Write value
End Sub
3. 其他腳本
擴展一下,有時我們可能需要讀取一下控件其他的屬性,下面給出幾個例子參考一下。
計算單選框有多少個可選條目
Sub OnClick(ByVal Item)
Dim OptionList
Set OptionList=ScreenItems("OptionList")
Msgbox OptionList.Boxcount
End Sub
刪除單選框條目只留一個
Sub OnClick(ByVal Item)
Dim OptionList
Set OptionList=ScreenItems("OptionList")
OptionList.boxcount=1
OptionList.index=1
OptionList.text=""
End Sub
顯示操作人員選擇的是哪一項
Sub OnClick(ByVal Item)
Dim OptionList,i,process,index,boxcount
Set OptionList=ScreenItems("OptionList")
process =OptionList.Process
boxcount=OptionList.BoxCount
For i=1 To boxcount
If process Mod 2 =0 Then
process=process\2
Else
index=i
Msgbox index
Exit For
End If
Next
End Sub
顯示操作人員當前選項的文本是什么
Sub OnClick(ByVal Item)
Dim OptionList,i,process,index,boxcount
Set OptionList=ScreenItems("OptionList")
process =OptionList.Process
boxcount=OptionList.BoxCount
For i=1 To boxcount
If process Mod 2 =0 Then
process=process\2
Else
index=i
OptionList.Index =index
Msgbox OptionList.text
Exit For
End If
Next
End Sub
八 組合框的腳本
1. 打開畫面的腳本
實現頁面一打開,就從數據表MyCheck中把字段CheckList每個記錄寫入控件,同時讀取用戶上一次選擇的項目編號。腳本如下:
Sub OnOpen()
Dim conn,ssql,ors,scon,ocom,i
Dim PCName
Dim objCheck
PCName=HMIRuntime.Tags("@LocalMachineName").Read
scon="Provider = SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog =MyDB;Data Source = " &PCName & "\WINCC"
ssql="select CheckList from MyCheck"
Set conn=CreateObject("ADODB.Connection")
conn.ConnectionString=scon
conn.Cursorlocation=3
conn.open
Set ors=CreateObject("ADODB.RecordSet")
Set ocom=CreateObject("ADODB.Command")
ocom.commandtype=1
Set ocom.ActiveConnection=conn
ocom.CommandText=ssql
Set ors=ocom.Execute
ors.movefirst
Set objCheck=ScreenItems("objCheck")
objCheck.boxcount = ors.recordcount '讓組合框的可選項數量與數據表記錄數一樣
For i=1 To ors.recordcount
objCheck.index =i
objCheck.Text =ors.fields(0).value
ors.movenext
Next
Set ors=Nothing
conn.close
Set conn=Nothing
'讀取上一次操作人員的選擇
objcheck.process=hmiruntime.Tags("CheckListSelIndex").Read
End Sub
2. 操作人員修改選項時的腳本
操作人員修改了選擇,那么需要及時把修改情況記錄下來,一邊下一次畫面切換回來仍然保持原選擇。我們在組合框的事件-“屬性主題-輸入輸出-選擇框-更改”寫入以下腳本:
Sub Process_OnPropertyChanged(ByVal Item, ByVal value)
HMIRuntime.Tags("CheckListSelIndex").Write value
End Sub
3. 其他腳本
擴展一下,有時我們可能需要讀取一下控件其他的屬性,下面給出幾個例子參考一下。
計算單選框有多少個可選條目
Sub OnClick(ByVal Item)
Dim ObjCheck
Set ObjCheck=ScreenItems("ObjCheck")
Msgbox ObjCheck.Boxcount
End Sub
刪除單選框條目只留一個
Sub OnClick(ByVal Item)
Dim ObjCheck
Set ObjCheck=ScreenItems("ObjCheck")
ObjCheck.boxcount=1
ObjCheck.index=1
ObjCheck.text=""
End Sub
顯示操作人員選了哪幾項編號
Sub OnClick(ByVal Item)
Dim ObjCheck,i,process,Selindex,boxcount
Set ObjCheck=ScreenItems("ObjCheck")
process =ObjCheck.Process
boxcount=ObjCheck.BoxCount
For i=1 To boxcount
If process Mod 2 =1 Then
Selindex=Selindex & " " & CStr(i)
End If
process=process\2
Next
Msgbox "復選框勾選的是:" & Selindex
End Sub
顯示操作人員選擇項目的文本
Sub OnClick(ByVal Item)
Dim objCheck,i,process,index,boxcount,SelText
Set objCheck=ScreenItems("objCheck")
process =objCheck.Process
boxcount=objCheck.boxcount
For i=1 To boxcount
If process Mod 2 =1 Then
index=i
objCheck.Index =index
SelText=SelText & " " & objCheck.text
End If
process=process\2
Next
Msgbox "復選框勾選的文本是" & SelText
End Sub