PC软件开发技术之一:在WinCC中通过VBS操作SQL Server2005

 

在项目中需要在一定条件满足时,保存一些数据到数据库中,并可根据条件查询。考虑到WinCC6.2以后采用的就是SQL Server2005数据库,所以直接利用该数据库即可,通过SQL Server Management Studio(SSMS)可以创建自己的数据库,并按要求创建好表。

一、数据库连接

在SQL Server Management Studio(SSMS)中创建名为evcp的数据库,再创建名为evcp的表,然后根据需要创建Columns,在本项目中创建了norder(流水号)、pileno(桩号)、cardno(卡号)、operno(员工号)、energy(电量)、cost(金额)、period(时长)、rate(费率)、pdate(日期)和ptime(时间)。

在本项目中采用ODBC的方式连接数据库,首先在控制面板中创建好数据源,配置好SQL Server驱动数据源,命名为evcs。

二、数据写入

要求在一个状态量值为1的时候完成数据库的保存,等数据保存完后将状态量清0。

1、先在全局脚本VBS项目模块中创建函数savedata,代码如下:

Sub savedata
Dim objConnection
Dim objCommand
Dim objRecordset
Dim strConnectionString
Dim strSQL
Dim norder,pileno,cardno,operno,energy,cost,period,rate,pdate,ptimenorder=HMIRuntime.Tags("norder").Read
pileno= HMIRuntime.Tags("pileno").Read
cardno=HMIRuntime.Tags("cardno").Read
operno= HMIRuntime.Tags("operno").Read
energy= HMIRuntime.Tags("energy").Read
cost= HMIRuntime.Tags("cost").Read
period= HMIRuntime.Tags("period").Read
rate= HMIRuntime.Tags("rate").Read
pdate= HMIRuntime.Tags("pdate").Read
ptime= HMIRuntime.Tags("ptime").ReadstrConnectionString = "Provider=MSDASQL;DSN=evcs;UID=;PWD=;"
Set objConnection = CreateObject("ADODB.Connection")
objConnection.ConnectionString = strConnectionString
objConnection.OpenSet objRecordset = CreateObject("ADODB.Recordset")
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnectionstrSQL = "insert into evcp (norder,pileno,cardno,operno,energy,cost,period,rate,pdate,ptime) values ("&_
"'"&norder&"',"&_
"'"&pileno&"',"&_
"'"&cardno&"',"&_
"'"&operno&"',"&_
"'"&energy&"',"&_
"'"&cost&"',"&_
"'"&period&"',"&_
"'"&rate&"',"&_
"'"&pdate&"',"&_
"'"&ptime&"')"
'MsgBox (strSQL)
objCommand.CommandText = strSQL
objCommand.ExecuteSet objCommand = Nothing
objConnection.Close
Set objRecordset = Nothing
Set objConnection = Nothing
End Sub

2、在全局脚本VBS动作中创建1秒周期的周期性出发动作,并添加如下代码:

Option Explicit
Function action
Dim v1
v1=HMIRuntime.Tags("satuse").ReadIf v1 Then
Call savedata
HMIRuntime.Tags("satuse").Write 0
End if
End Function

这样当satuse值为1时系统自动保存数据

三、数据查询

数据的查询要复杂一些,需要用到MSFlexGrid控件、MS Form2 ComboBox控件和MS Form2 TextBox,这几个控件可以单独注册也可以安装VB6后自动添加。

在查询页面上添加打开页面执行脚本如下:

Sub OnOpen()                         
Dim MSFlexGrid1,cb1,tb1,tb2
Set MSFlexGrid1 = ScreenItems("控件1")
Set cb1 = ScreenItems("cb1")
Set tb1 = ScreenItems("tb1")
Set tb2 = ScreenItems("tb2")
MSFlexGrid1.ClearMSFlexGrid1.ColWidth(0) = 620
MSFlexGrid1.ColWidth(1) = 1500
MsFlexGrid1.ColWidth(2) = 1500
MSFlexGrid1.ColWidth(3) = 1500
MSFlexGrid1.ColWidth(4) = 1500
MSFlexGrid1.ColWidth(5) = 1500
MsFlexGrid1.ColWidth(6) = 1500
MSFlexGrid1.ColWidth(7) = 1500
MSFlexGrid1.ColWidth(8) = 1600
MSFlexGrid1.ColWidth(9) = 2000
MsFlexGrid1.ColWidth(10) = 2000MSFlexGrid1.TextMatrix(0,0) = "编号"
MSFlexGrid1.TextMatrix(0,1) = "流水号"
MSFlexGrid1.TextMatrix(0,2) = "桩号"
MSFlexGrid1.TextMatrix(0,3) = "卡号"
MSFlexGrid1.TextMatrix(0,4) = "操作员号"
MSFlexGrid1.TextMatrix(0,5) = "电量(度)"
MSFlexGrid1.TextMatrix(0,6) = "金额(元)"
MSFlexGrid1.TextMatrix(0,7) = "时长(分)"
MSFlexGrid1.TextMatrix(0,8) = "费率(元/度)"
MSFlexGrid1.TextMatrix(0,9) = "日期"
MSFlexGrid1.TextMatrix(0,10) = "时间"
MSFlexGrid1.ColAlignment(0) = 4
MSFlexGrid1.ColAlignment(1) = 4
MSFlexGrid1.ColAlignment(2) = 4
MSFlexGrid1.ColAlignment(3) = 4
MSFlexGrid1.ColAlignment(4) = 4
MSFlexGrid1.ColAlignment(5) = 4
MSFlexGrid1.ColAlignment(6) = 4
MSFlexGrid1.ColAlignment(7) = 4
MSFlexGrid1.ColAlignment(8) = 4
MSFlexGrid1.ColAlignment(9) = 4
MSFlexGrid1.ColAlignment(10) = 4Dim i
For i= 1 To 39 Step 1
MSFlexGrid1.TextMatrix(i,0) = i
Nextcb1.Text="*"
cb1.AddItem "*"
cb1.AddItem "1"
cb1.AddItem "2"
tb1.Text="*"
tb2.Text="*"End Sub

这段代码主要是用来初始化控件的显示。

在查询按钮加入相应的代码实现三个键值(桩号、卡号、操作员号)条件组合的查询,代码如下:

Sub Click(Byval Item) 
Dim objConnection
Dim objCommand
Dim objRecordset
Dim strConnectionString
Dim strSQL
Dim MSFlexGrid1,cb1,tb1,tb2
Dim i1,i2,cv1,cv2,cv3,cv
Set MSFlexGrid1 = ScreenItems("控件1")
Set cb1 = ScreenItems("cb1")
Set tb1 = ScreenItems("tb1")
Set tb2 = ScreenItems("tb2")'清除原有记录
For i1 = 1 To 39 Step 1
For i2=1 To 10 Step 1
MSFlexGrid1.TextMatrix(i1, i2) =""
Next
NextstrConnectionString = "Provider=MSDASQL;DSN=evcs;UID=;PWD=;"
Set objConnection = CreateObject("ADODB.Connection")
objConnection.ConnectionString = strConnectionString
objConnection.Open
Set objRecordset = CreateObject("ADODB.Recordset")
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnectioncv1=0
cv2=0
cv3=0
If cb1.Text<>"*" Then
cv1=4
End IfIf tb1.Text<>"*" Then
cv2=2
End ifIf tb2.Text<>"*" Then
cv3=1
End If
cv=cv1+cv2+cv3
Select Case cv
Case 7
strSQL = "select * from evcp where pileno like '"&cb1.Text&"'And cardno like '"&tb1.Text&"'And operno like '"&tb2.Text&"'"
Case 6
strSQL = "select * from evcp where pileno like '"&cb1.Text&"'And cardno like '"&tb1.Text&"'"
Case 5
strSQL = "select * from evcp where pileno like '"&cb1.Text&"'And operno like '"&tb2.Text&"'"
Case 4
strSQL = "select * from evcp where pileno like '"&cb1.Text&"'"
Case 3
strSQL = "select * from evcp where cardno like '"&tb1.Text&"'And operno like '"&tb2.Text&"'"
Case 2
strSQL = "select * from evcp where cardno like '"&tb1.Text&"'"
Case 1
strSQL = "select * from evcp where operno like '"&tb2.Text&"'"
Case Else
strSQL = "select * from evcp"
End SelectobjCommand.CommandText = strSQLSet objRecordset = objCommand.ExecuteDim i
i=0If (objRecordset.Bof And objRecordset.Eof) Then
MsgBox("没有符合要求的记录")
Else
While Not objRecordset.EOF
i=i+1
MSFlexGrid1.TextMatrix(i, 1) = CStr(objRecordset.Fields(0).Value)
MSFlexGrid1.TextMatrix(i, 2) = CStr(objRecordset.Fields(1).Value)
MSFlexGrid1.TextMatrix(i, 3) = CStr(objRecordset.Fields(2).Value)
MSFlexGrid1.TextMatrix(i, 4) = CStr(objRecordset.Fields(3).Value)
MSFlexGrid1.TextMatrix(i, 5) = CStr(objRecordset.Fields(4).Value)
MSFlexGrid1.TextMatrix(i, 6) = CStr(objRecordset.Fields(5).Value)
MSFlexGrid1.TextMatrix(i, 7) = CStr(objRecordset.Fields(6).Value)
MSFlexGrid1.TextMatrix(i, 8) = CStr(objRecordset.Fields(7).Value)
MSFlexGrid1.TextMatrix(i, 9) = CStr(objRecordset.Fields(8).Value)
MSFlexGrid1.TextMatrix(i, 10) = CStr(objRecordset.Fields(9).Value)
objRecordset.movenext
Wend
End IfSet objCommand = Nothing
objConnection.Close
Set objRecordset = Nothing
Set objConnection = NothingEnd Sub

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K 近邻算法(KNN)与KD 树实现

KD树节点 /// <summary>/// &#xff2b;&#xff24;树节点/// /2016/4/1安晟添加/// </summary>[Serializable]public class KDTreeNode{/// <summary>/// 获取或设置节点的空间坐标/// </summary>public double[] Position { get; set; }/// <…

PC软件开发技术之二:用C#开发基于自动化接口的OPC客户端

OPC全称是Object Linking and Embedding&#xff08;OLE&#xff09; for Process Control&#xff0c;它的出现为基于Windows的应用程序和现场过程控制应用建立了桥梁。OPC作为一整套接口、属性和方法的协议标准集&#xff0c;与具体的开发语言没有关系。 1、OPC客户端接口方…

标记符控制的分水岭算法原理及matlab实现

-------------------------------------------------------------------------------------------------------------------- 附录A 教程【3】给出的matlab源码&#xff0c;附详细注释 function [ ] MarkerControlled_Watershed_tutorial( ) %标记符控制的分水岭算法教程 …

PC软件开发技术之三:C#操作SQLite数据库

我们在开发应用是经常会需要用到一些数据的存储&#xff0c;存储的方式有多种&#xff0c;使用数据库是一种比较受大家欢迎的方式。但是对于一些小型的应用&#xff0c;如一些移动APP&#xff0c;通常的数据库过于庞大&#xff0c;而轻便的SQLite则能解决这一问题。不但操作方便…

自动搜索数据增强方法分享——fast-autoaugment

前言 简短的介绍下分享fast-autoaugment的原因 毫无疑问数据增强对于训练CNN非常有效&#xff0c;大家也在不断发明新的数据增强方法 拿到一份数据集&#xff0c;我们凭借之前的经验组合不同的增强方法形成一个数据增强策略&#xff0c;通常可以得到一个还不错的baseline。但…

SSD之硬的不能再硬的硬核解析

本文是对经典论文 SSD: Single Shot MultiBox Detector 的解析&#xff0c;耗时3周完成&#xff0c;万字长文&#xff0c;可能是你能看到的最硬核的SSD教程了&#xff0c;如果想一遍搞懂SSD&#xff0c;那就耐心读下去吧~ 一句话总结SSD效果就是&#xff1a;比YOLO快一点且准很…

C语言学习及应用笔记之五:C语言typedef关键字及其使用

在C语言中有一个typedef关键字&#xff0c;其用来定义用户自定义类型。当然&#xff0c;并不是真的创造了一种数据类型&#xff0c;而是给已有的或者符合型的以及复杂的数据类型取一个我们自己更容易理解的别名。总之&#xff0c;可以使用typedef关键字定义一个我们自己的类型名…

Modbus协议栈开发笔记之五:Modbus RTU Slave开发

Modbus在串行链路上分为Slave和Master&#xff0c;这一节我们就来开发Slave。对于Modbus RTU从站来说&#xff0c;需要实现的功能其实与Modbus TCP的服务器端是一样的。其操作过程也是一样的。首先接收到主站的访问命令&#xff0c;对该命令报文进行解析&#xff0c;这里我们也…

Modbus协议栈开发笔记之六:Modbus RTU Master开发

这一节我们来封装最后一种应用&#xff08;Modbus RTU Master应用&#xff09;&#xff0c;RTU主站的开发与TCP客户端的开发是一致的。同样的我们也不是做具体的应用&#xff0c;而是实现RTU主站的基本功能。我们将RTU主站的功能封装为函数&#xff0c;以便在开发具体应用时调用…

PID控制器开发笔记之十三:单神经元PID控制器的实现

神经网络是模拟人脑思维方式的数学模型。神经网络是智能控制的一个重要分支&#xff0c;人们针对控制过程提供了各种实现方式&#xff0c;在本节我们主要讨论一下采用单神经元实现PID控制器的方式。 1、单神经元的基本原理 单神经元作为构成神经网络的基本单位&#xff0c;具…

基于STM32L476的锂电池SOC检测

便携式设备由于使用需求而配备了锂电池&#xff0c;但使用过程中需要掌握电源的状态才能保证设备正常运行。而且在电池充放电的过程中&#xff0c;监控电池的充放电状态也是保证设备安全的需要。 1、硬件设计 电池SOC检测是一个难题&#xff0c;有很多的模型和检测电路。但对…

C语言学习及应用笔记之六:C语言extern关键字及其使用

在C语言中&#xff0c;修饰符extern用在变量或者函数的声明前&#xff0c;用来以标识变量或者函数的定义在别的文件中&#xff0c;提示编译器遇到此变量或者函数时&#xff0c;在其它文件中寻找其定义。extern关键字的用法有几种&#xff0c;我们下面对其进行说明。 1、extern…

TCP/UDP 常用端口列表

计算机之间依照互联网传输层TCP/IP协议不同的协议通信&#xff0c;都有不同的对应端口。所以&#xff0c;利用短信&#xff08;datagram&#xff09;的UDP&#xff0c;所采用的端口号码不一定和采用TCP的端口号码一样。以下为两种通信协议的端口列表链接&#xff1a; 目录 1端…

C语言学习及应用笔记之七:C语言中的回调函数及使用方式

我们在使用C语言实现相对复杂的软件开发时&#xff0c;经常会碰到使用回调函数的问题。但是回调函数的理解和使用却不是一件简单的事&#xff0c;在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析。 1、什么是回调函数 既然谈到了回调函数&#xff0c;首先我们…

STM32与SHT1X温湿度传感器通讯

在这次项目开发中应用到了SHT1X温湿度传感器&#xff0c;该系列有SHT10、SHT11和SHT15&#xff0c;属于Sersirion温湿度传感器家族中的贴片封装系列。包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件&#xff0c;传感器内部有一个精度高达14为位的A/D转换器。…

STM32与MS5837压力传感器的I2C通讯

MS5837压力传感器是一种可用于电路板上&#xff0c;适用于检测10-1200mbar压力范围的传感器&#xff0c;灵敏度非常高&#xff0c;理论上能够检测到0.01mbar的压力变化&#xff0c;实际使用过程中测试并无明显的变化。 MS5837采用I2C总线通讯&#xff0c;与STM32的MCU可以实现…

STM32F0使用LL库实现MS5536C通讯

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。在本文中我们说明一下&#xff0c;使用LL库实现MS5536C的SPI通讯。 1、MS5536C简述 MS5536C是…

STM32F0使用LL库实现DMA方式AD采集

在本次项目中&#xff0c;限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑&#xff0c;而且自带的Flash空间也非常有限&#xff0c;所以我们选择了LL库实现。在本文中我们将介绍基于LL库的ADC的DMA采集方式。 1、概述 这次我们使用DMA方式实现对AD的采集…

STM32与宇电设备实现AI-BUS通讯

宇电的设备使用基于RS-485的自定义协议&#xff0c;协议本身比较简单&#xff0c;只有2条指令&#xff1a; 读&#xff1a;地址代号52H&#xff08;82&#xff09; 要读的参数代号00校验码 写&#xff1a;地址代号43H&#xff08;67&#xff09;要写的参数代号写入数低字节写…

FreeRTOS如何结束和重新启动调度程序

大多数主机或桌面系统&#xff08;比如Linux&#xff0c;Mac或Windows&#xff09;都有一个正常的用例&#xff0c;你可以在早上启动操作系统&#xff0c;然后在晚上关闭它&#xff0c;然后你就离开机器。嵌入式系统是不同的&#xff1a;他们没有参加&#xff0c;他们应该“永远…