WINCC用VB读写数据库以及EXCEL导出_wincc利用vb与数据库的连接-程序员宅基地

技术标签: WINCC  

本文主要是介绍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个局部变量,数据库涉及的东西少,按照图片的来,没问题哈

有什么问题可以留言

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gojava/article/details/104909154

智能推荐

优化APK体积_android apk 大小优化-程序员宅基地

文章浏览阅读1.2k次。该篇文章主要来介绍如何减少APK体积,以帮助用户更快地下载App,并加速安装/更新过程。_android apk 大小优化

通用存储过程分页(top max模式)版本(性能相对之前的not in版本极大提高) _top 搭配not in 性能-程序员宅基地

文章浏览阅读1.3k次。 --/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/--/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/--/*-----存储过程 分页处理 孙伟 2005-04-21修改 添加Distinct查询功能-------*/--/*-----存储过程 分页处理 孙伟 2005-05-18修改 多字段排序规则问题-_top 搭配not in 性能

vue新玩法VueUse-工具库@vueuse/core-程序员宅基地

文章浏览阅读1.5w次,点赞3次,收藏10次。VueUse官方链接一、什么是VueUseVueUse不是Vue.use !!!它是一个基于 Composition API 的实用函数集合,下面是具体的一些用法二、如何引入import { 具体方法 } from ‘@vueuse/core’三、下面来看看一些具体的用法1、useMouse:监听当前鼠标坐标的一个方法,他会实时的获取鼠标的当前的位置2、usePreferredDark:判断用户是否喜欢深色的方法,他会实时的判断用户是否喜欢深色的主题3、useLocalStorage:数据_vueuse/core

统计学5大基本概念,建议收藏!(文末送书)-程序员宅基地

文章浏览阅读736次。转自:爱数据LoveD大家好,我是小z,也可以叫我阿粥~今天给大家分享一波统计学重要概念,顺便前排提示文末送书~从高的角度来看,统计学是一种利用数学理论来进行数据分析的技术。象柱状图这种基本的可视化形式,会给你更加全面的信息。但是,通过统计学我们可以以更富有信息驱动力和针对性的方式对数据进行操作。所涉及的数学理论帮助我们形成数据的具体结论,而不仅仅是猜测。利用统计学,我们可以更深入、更细致地观察数..._统计学五大基本原理

Java多线程4:synchronized的使用场景和原理简介_synchronized常见使用场景 threadsyntest.new myrunnable3-程序员宅基地

文章浏览阅读2.4k次,点赞3次,收藏9次。一、synchronized使用1.1 synchronized介绍在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。synchronized可以修饰普通方法,静态方法和代码块。当synchronize..._synchronized常见使用场景 threadsyntest.new myrunnable3

Windows python用impyla连接远程Hive数据库_python impyla demo-程序员宅基地

文章浏览阅读260次。安装下述包:thirftpythirft-saslthirftpure-sasl(卸载sasl,若要用pyhive,sasl轮子安装路径Link)impyla# -*- coding:UTF-8 -*-from impala.dbapi import connect#下述host只是个demo,需填入真实ipconn = connect(host='11.22.33.44', port=21050, auth_mechanism='PLAIN',user='yourusername',pa_python impyla demo

随便推点

python语言程序设计实践教程陈东上海交通大学答案_《软件开发训练营:ASP.NET开发一站式学习难点》杨云著【摘要 书评 在线阅读】-苏宁易购图书...-程序员宅基地

文章浏览阅读2.7k次。商品参数作者:杨云著出版社:清华大学出版社出版时间:2013-8-1版次:1印次:1印刷时间:2013-8-1页数:434开本:16开装帧:平装ISBN:9787302318286版权提供:清华大学出版社编辑推荐《软件开发训练营·ASP.NET开发一站式学习:难点·案例·练习》特色:1.《软件开发训练营·ASP.NET开发一站式学习:难点·案例·练习》所讲内容既避开艰涩难懂的理论知识,又覆盖了编程..._python语言程序设计实践教程陈东课后习题答案解析

解决:Qt项目构建成功,但是运行异常退出。_qt安装后构建可以,运行就一直提示程序异常-程序员宅基地

文章浏览阅读2k次。构建:从debug换成release:就可以正常运行了_qt安装后构建可以,运行就一直提示程序异常

李宏毅2021机器学习笔记(一)_李宏毅2021机器学习笔记 百度-程序员宅基地

文章浏览阅读601次。什么是机器学习?简单来说就是让机器帮我们找一个函数,即一个映射。如声音—>文字的语音识别函数自变量可以是向量,矩阵(图像识别),序列输出是数值、图片等课程讲什么?一、监督学习,给定图片人工的告诉机器其类型,训练模型,让机器拥有 f(图片)—>类型 这一函数二、训练模型之前进行Pre-train,让机器学习如何辨别图片这一基本功,因为人工输入图片类型过于繁琐。只需传入大量图片资料即可自动训练。如把图片翻转、变色,询问机器是不是可以..._李宏毅2021机器学习笔记 百度

stdmap c++两个map合并成一个map ,c++多个map的合并_c++ map合并-程序员宅基地

文章浏览阅读1.7k次。两个map合并成一个map,用insert()函数就可以了,看代码:#include <map>#include <iostream>int main(){ std::map<int, int> v1 = {{1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}}; std::map<int, int> v2 = { {3, 2}, {4, 2}, {5, 2}, {6, 2}, {7_c++ map合并

CLion:使用CLion新建一个C语言项目_clion创建c语言项目-程序员宅基地

文章浏览阅读1.3w次,点赞12次,收藏85次。步骤1、2、3、我喜欢一个文件夹下存放多个项目,所以删掉生成的CMakeList.txt、main.c和cmake-build-debug文件。新建一个List目录,并在该目录下新建CMakeList.txt4、创建一个C文件进行测试5、创建好后,提示在List文件夹下的CMakeList.txt添加:include_directories(.)add_executable(List-List01 List01.c) //List是文件夹名称,List01.c是具体文件名称_clion创建c语言项目

鸟哥的 linux 的私房菜 基础学习篇,鸟哥的 Linux 私房菜 -- 基础学习篇-程序员宅基地

文章浏览阅读5k次。再次强调:底下的几篇短文是学习 Linux 的基础文件,这些文件是基础中的基础,如果您能将其中的文件都看完,并且消化过,那么未来在管理 Linux 主机以及架设网站方面,就能够达到『事半功倍』的成效,请不要忽略这部份了!否则,再怎么讨论都是枉然的啦! ^_^第一部份:Linux 的规划与安装Linux 本身虽然具有相当强大的功能,不过,如果不能理解 Linux 的工作能力,那么 Linux 能做的..._鸟哥linux基础篇