WINCC用VB讀寫數據庫以及EXCEL導出

本文主要是介紹WINCC7.4 用VB來讀寫SQL server數據庫,網上有不少這類例子,實現功能的方法也很多,但是能完整介紹並且貼出所有編碼的還是比較少,今天的這個例子,我會先把所有的內容先截圖展示,然後再提供整個WINCC文件

第一步,SQL server建庫和建表

我用的是2014版本的,其他版本的相差無幾,在開始--->所有程序,找到方框中箭頭的那個單擊

然後,彈出下面圖片,記住這個server name 後面的值,這個等會程序中會用到

 點擊 connect,右鍵“Databases” 點擊 “New Database” 這是建庫

 然後在“Database name”中輸入數據庫名字,點“OK”。這個名字用英文,我測試,所以名字隨便取得

 新建好了之後,點Databases ,就出現了下圖信息

 然後在庫“zhoubin”下面 的“table” 右鍵--->new--->點擊table,就出現下圖,這是建表,建表的意思就是建立一個小房間,這個房間專門用來存放某一個單獨業務數據,比如專門存放某一個班級的學生信息

 進入下圖,下面這個圖是建字段,字段是用來存放這個班級中學生的屬性,例如姓名、年齡等等

Column Name就是填寫屬性,

Data Type 是字段類型,字符、數字、浮點要選的類型都不一樣,這個字段類型也很重要,它涉及到保存數據的長度,如果選錯了,保存數據就會有問題。不同的數據庫都會詳細介紹各個類型的使用場景,數據庫基礎知識我就不介紹了,隨便找一個對於數據庫的教學視頻或者書都會介紹。

Allow Nulls意思是是否允許這一個值爲空。就是說當保存一個學生名字叫張三,年齡爲14的數據時候,允許爲空的情況下,保存數據的時候,如果SQL語句中對於name的值沒取到,或者丟失,則這條數據也會保存,那麼最終保存到數據庫的信息就是姓名爲空,年齡爲14

填好信息後,保存,就會彈出下面圖片,這個是填寫表的名字,就是給這個小房間弄一個名字,例如students、people

 上圖點擊OK後,就出現下圖

 到這裏,數據庫的建庫建表就完成了,這個是鼠標操作,還可以用SQL語句來建表,或者直接拿別的地方導出的庫文件直接導入到這個數據庫,前提是同類型數據庫

第二步 在WINCC中建立畫面

 上圖的新建畫面,然後就自動出現了下圖的這個文件

 這裏可以修改畫面名字,進入畫面後,新建一個按鈕、數字輸入項、多行文本

 這個年齡和名字都要鏈接變量以及對應屬性中對象名稱都要修改爲對應的名字(看下圖),以供後面VB獲取輸入值,事先在WINCC中建立局部變量age、name

 

 然後在保存按鈕中添加鼠標VB事件,如下圖

打開VB窗口後,開始編碼,下面編碼中需要修改的地方就是標紅色的地方,綠色的值就是在登陸數據庫軟件的地方,之前截圖讓你記住的地方,藍色值就是庫的名字

Sub OnClick(ByVal Item)                       
Dim conn                     '定義類對象
Dim SCon                     '定義數據庫連接字符串
Dim oRs1                       '定義獲取到的數據集
Dim oCom
Dim strSQL1
Dim age,name

sCon= "Provider=SQLOLEDB.1; Integrated Security =SSPI;Persist Security Info=False; Initial Catalog=zhoubin;Data Source=.\WINCC"
age=HMIRuntime.Tags("age").Read
name=HMIRuntime.Tags("name").Read

'測試是否能取到值
'MsgBox("age=" & age)

 '---------彈框顯示測試數據是否正確-----------'
        Dim Msg, Style, Title, Help, Ctxt, Response, MyString
    Msg = "Do you want to continue "  ' 定義信息。
    Style = vbYesNo + vbQuestion + vbDefaultButton2   ' 定義按鈕。
    Title = "是否保存"   ' 定義標題。
    Help = "DEMO.HLP"   ' 定義幫助文件。
    Ctxt = 1000   ' 定義標題
          ' 上下文。
          ' 顯示信息。
    Response = MsgBox(Msg, Style, Title, Help, Ctxt)
    If Response = vbYes Then   ' 用戶按下“是”。
        MyString = "Yes"   ' 完成某操作。

 '---------彈框顯示測試數據是否正確-----------'    
 
strSQL1="INSERT INTO [dbo].[people] VALUES ('"& name & "','"&  age &"')"

Set conn=CreateObject("ADODB.Connection")
    conn.ConnectionString = sCon
    conn.CursorLocation = 3  
    conn.Open
Set oRs1 = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
    oCom.CommandType = 1
Set oCom.ActiveConnection = conn
    oCom.CommandText = strSQL1           
Set oRs1 = oCom.Execute              
   

Set oRs1 = Nothing
Set oCom = Nothing
conn.Close
Set conn = Nothing
'---------彈框顯示測試數據是否正確-----------'    
    Else   ' 用戶按下“否”。
        MyString = "No"   ' 完成某操作。
    End If
'---------彈框顯示測試數據是否正確-----------'    
End Sub

代碼結束,這個裏面最重要的並不是代碼怎麼寫,而是下面這兩行

'測試是否能取到值
'MsgBox("age=" & age)

這個MsgBox是一個彈框的小玩意兒,他的作用就是彈窗顯示你括號中的信息,這個東西爲什麼重要呢,因爲他可以調試,當你沒取到值或者出現什麼錯誤,WINCC根本一點反應都沒有,你就不知道到底執行到什麼狀態了,所以你可以把這個功能加到任何地方,來測試,就類似調試Html或者JS的時候,用alert來簡單調試,在JAVA中用SystemO來打印調試,當然斷點後Debug運行也可以

保存完了,可以在數據庫中查詢,如下圖

 然後彈出下框,直接點擊“EXECUTE”,就出現了自己插入的數據

 第三步,查詢功能

查詢的顯示是用WINCC的MSHFlexGrid控件,這個控件默認沒加載,所以要添加進來,如下圖

添加進來後,就是下圖這個東東

 把控件添加到頁面中,給控件命名,如下圖,其他都在VB中處理,程序可以對錶格行數列數等等做操作

 給查詢按鈕添加VB事件,如下圖

 開始編碼

Sub OnClick(Byval Item)                     
     
         
Dim conn                     '定義類對象
Dim SCon                     '定義數據庫連接字符串
Dim oRs1,oRs2,oRs3           '定義獲取到的數據集
Dim oCom
Dim m
Dim strSQL1,strSQL2,strSQL3
Dim i,j,k
Dim ReportSelect
sCon= "Provider=SQLOLEDB.1; Integrated Security =SSPI;Persist Security Info=False; Initial Catalog=zhoubin;Data Source=.\WINCC"
strSQL1= "SELECT *  FROM  [dbo].[people]"
Set conn=CreateObject("ADODB.Connection")
    conn.ConnectionString = sCon
    conn.CursorLocation = 3  
    conn.Open
Set oRs1 = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
    oCom.CommandType = 1
Set oCom.ActiveConnection = conn
    oCom.CommandText = strSQL1           
Set oRs1 = oCom.Execute              
    m = oRs1.RecordCount    


Dim olist
Set olist = ScreenItems("報表")
    olist.clear
    olist.Cols=3    '列數        
    olist.Rows = m+1 '行數量

For i = 0 To 2
    olist.ColAlignment(i)=3'列內容居中顯示
Next

    '設置列寬    
    olist.ColWidth(0) = 800                 
    olist.ColWidth(1) = 1200
    olist.ColWidth(1) = 1200

    '設置表頭
    oList.TextMatrix(0, 0)="序號"    
    oList.TextMatrix(0, 1) = "姓名"   
    oList.TextMatrix(0, 2) = "年齡"  

'將數據寫入表格
oRs1.movefirst

    For i = 1 To m
 
          oList.TextMatrix(i, 0) = i
        oList.TextMatrix(i ,1) = oRs1.Fields(0).Value
        oList.TextMatrix(i ,2) = oRs1.Fields(1).Value
        oRs1.movenext

    Next
        


Set oRs1 = Nothing
Set oRs2 = Nothing
Set oRs3 = Nothing
Set oCom = Nothing
conn.Close
Set conn = Nothing

End Sub

 

編碼完成,至於每一行代碼什麼含義,這個真的需要會編程,不然很難解釋。不管是VB、C、C++、JAVA都可以,語言是相同的

第四步,EXCEL導出功能

新增一個按鈕,如下圖

然後在硬盤新建一個EXCEL文件,空白文件就可以了,VB中有用到

同上,開始編碼

Sub OnClick(Byval Item)                                                      
     
         
Dim conn                     '定義類對象
Dim SCon                     '定義數據庫連接字符串
Dim oRs1           '定義獲取到的數據集
Dim oCom
Dim m
Dim strSQL1
Dim ReportSelect
sCon= "Provider=SQLOLEDB.1; Integrated Security =SSPI;Persist Security Info=False; Initial Catalog=zhoubin;Data Source=.\WINCC"
strSQL1= "SELECT *  FROM  [dbo].[people]"
Set conn=CreateObject("ADODB.Connection")
    conn.ConnectionString = sCon
    conn.CursorLocation = 3  
    conn.Open
Set oRs1 = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
    oCom.CommandType = 1
Set oCom.ActiveConnection = conn
    oCom.CommandText = strSQL1           
Set oRs1 = oCom.Execute              
    m = oRs1.RecordCount    

 

Dim objExcelApp,objExcelBook,objExcelSheet,a,b ,i
Set objExcelApp =CreateObject("Excel.Application")
  objExcelApp.Visible=True
Set a =objExcelApp.Workbooks.Open("D:\test.xlsx")
'MsgBox("m="&m)
    
Set b =a.Worksheets("報表模板")
 b.Range("A1") = "報表日期:"
 
 objExcelApp.Worksheets("報表模板").Activate

If (oRs1.EOF) Then
    MsgBox("沒有符合要求的記錄")
Else
oRs1.movefirst

        For i = 2 To m+1
        
            With objExcelApp.Worksheets("報表模板")
            .cells(i,1).value=CStr(oRs1.Fields(0).Value)
            .cells(i,2).value=CStr(oRs1.Fields(1).Value)
            End With
            oRs1.MoveNext

        Next


End If


Set objExcelApp= Nothing
Set oRs1 = Nothing
Set oCom = Nothing
conn.Close
Set conn = Nothing

End Sub

 

至此,全部完成,這個功能是簡單實現一下,其實還有很多可以潤色的地方,例如MSHFlexGrid有很多函數可以用,讓表格更加友好,連接數據庫的時候增加一些判斷,導出時候可以增加打印等等,以後有機會再補充吧。

我把WINCC的畫面文件上傳了,大家可以試試,在試的時候,把畫面文件導入進去,然後建立2個局部變量,數據庫涉及的東西少,按照圖片的來,沒問題哈

有什麼問題可以留言

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章