WINCC用VB读写数据库以及EXCEL导出

WINCC 专栏收录该内容
1 篇文章 2 订阅

本文主要是介绍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的画面文件上传了https://download.csdn.net/download/gojava/12252437,大家可以试试,在试的时候,把画面文件导入进去,然后建立2个局部变量,数据库涉及的东西少,按照图片的来,没问题哈

有什么问题可以留言

 

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

gojava

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值