关于Microsoft Office Access的问题

怎样用Microsoft Office Access从wincc数据库中中导出归档变量?如果有能不能写详细点?

问题补充:
有没有更详细的注释,我对数据库不是很清楚,如果有人不嫌麻烦的话,请赐教,我将非常感谢!也可以发我邮箱:401772473@qq.com

最佳答案

在wincc6.0中使用vb脚本采用adox动态创建Access数据库,导出SQL server中的归档数据。楼主可以参考如下代码

数据库创建数据导出代码:

Dim begintime,endtime
Dim dcat,dconn,drs,dpstr
Dim dfm,ddlg,dtbl
Dim sPro,sDsn,sSer,sptr,sConn
Dim sSql1,sSql2
Dim sRs1,sRs2
Dim sCmd1,sCmd2
Dim m, n, s, b
b=timeconv(begintime,endtime,0)
If b=False Then
Exit Sub 
Else
'create new database and table
set dcat = createobject("adox.catalog")
set dconn = createobject("adodb.connection")
set drs = createobject("adodb.recordset")
Set ddlg = ScreenItems("dialog")
ddlg.Filter = "MDB文件(*.mdb)|*.mdb|AllFiles(*.*)|*.*|"
ddlg.FilterIndeX = 1
ddlg.InitDir = "E:\vb code"
ddlg.Flags = 6
ddlg.Action = 2

If ddlg.Filename = "" Then
MsgBox "you must input name"
Exit Sub
Else
dfm =ddlg.FileName
End If
dpstr = "Provider=Microsoft.Jet.OLEDB.4.0;"
dpstr = dpstr & "Data Source=" & dfm
dcat.Create dpstr
Set dtbl = CreateObject("adox.table")
dcat.ActiveConnection = dpstr
dtbl.Name = "MyTable" 
dtbl.Columns.Append "time"
dtbl.Columns.Append "tag1value"
dtbl.Columns.Append "tag2value"
dcat.Tables.Append dtbl
dconn.Open dpstr
drs.CursorLocation = 3
drs.Open "MyTable",dconn, 1, 2
'open sql server database
sPro = "Provider = WinCCOLEDBProvider.1;"
sDsn = "Catalog = CC_test_10_04_21_18_05_57R;"
sSer = "Data Source = .\WinCC"
sptr = sPro + sDsn + sSer
sSql1="TAG:R,'SpeedAndTemp\motor_actual'," &begintime& "," &endtime
sSql2="TAG:R,'SpeedAndTemp\oil_temp'," &begintime& "," &endtime

Set sconn = CreateObject("ADODB.Connection")
sconn.ConnectionString = sptr
sconn.CursorLocation = 3
sconn.Open

Set sRs1 = CreateObject("ADODB.Recordset")
Set scmd1 = CreateObject("ADODB.Command")
sCmd1.CommandType = 1
Set sCmd1.ActiveConnection = sconn
sCmd1.CommandText = sSql1
Set sRs1 = sCmd1.Execute

Set sRs2 = CreateObject("ADODB.Recordset")
Set scmd2 = CreateObject("ADODB.Command")
sCmd2.CommandType = 1
Set sCmd2.ActiveConnection = sconn
sCmd2.CommandText = sSql2
Set sRs2 = sCmd2.Execute
m = sRs1.Fields.Count

If (m > 0) Then
MsgBox "bie"
sRs1.Movefirst
srs2.movefirst
MsgBox "now"
n = 0
Do 
n= n + 1
'If (n>1000) Then Exit Do

drs.AddNew 
drs.Fields(0).Value = FormatDateTime(srs1.fields(1).value)
drs.Fields(1).Value = srs1.fields(2).value
drs.Fields(2).ValUe = srs2.fields(2).value
drs.Update
'End If
dRs.MoveNext
srs1.movenext
srs2.movenext
Loop While Not sRs1.EOF     
dRs.Close
srs1.close
srs2.close
Else
End If
Set drs=Nothing
Set srs1=Nothing
Set srs2=Nothing
sconn.close
dconn.close
Set sconn=Nothing
Set dconn=Nothing
End If 
MsgBox"export success!"

时间判断转换代码:

Function timeconv(begintime,endtime,choice)
'there is still some problems:checktime should return a boolen flag to show whether the number
'is in the range, then in function timeconv shoule check this flag to decide 
'whether Exit funciton Or Not, this function needs to improve!
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'begin time returns the begintime you choose from combobox after some processing
'endtime is as upon
'choice is input choice of what process,0 is no processing and 1 is 
'adjust to (GMT)Greenwich Mean Time 
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Dim byear,bmonth,bday,bhour,bmin,bsec
Dim eyear,emonth,eday,ehour,emin,esec
Dim btime,etime,newbtime,newetime
Dim timeerr
Dim temph,tempd,stemph,stempd

Set byear = ScreenItems("byear")
Set bmonth = ScreenItems("bmonth")
Set bday = ScreenItems("bday")
Set bhour = ScreenItems("bhour")
Set bmin = ScreenItems("bmin")
Set bsec = ScreenItems("bsec")

Set eyear = ScreenItems("eyear")
Set emonth = ScreenItems("emonth")
Set eday = ScreenItems("eday")
Set ehour = ScreenItems("ehour")
Set emin = ScreenItems("emin")
Set esec = ScreenItems("esec")
'check whether entered begintime is legal or valid

If (Not IsNumeric(byear.text))Or (Not IsNumeric(bmonth.text))Or (Not IsNumeric(bday.text))Or _
   (Not IsNumeric(bhour.text))Or (Not IsNumeric(bmin.text))Or (Not IsNumeric(bsec.text)) Then
   MsgBox "some of you entered begintime is not numeric or null!",vbOKCancel,"wrong time"
   timeconv=False
   Exit Function
End If
'check whether time is outof range
Call checktime(byear.text,9999,0,"begin year")
Call checktime(bmonth.text,12,1,"begin month")
Call checktime(bday.text,31,1,"begin day")
Call checktime(bhour.text,23,0,"begin hour")
Call checktime(bmin.text,59,0,"begin minutes")
Call checktime(bsec.text,59,0,"begin second")

'check whether entered endtime is legal or valid
If Not IsNumeric(eyear.text)Or Not IsNumeric(emonth.text)Or Not IsNumeric(eday.text)Or Not _ 
       IsNumeric(ehour.text)Or Not IsNumeric(emin.text)Or Not IsNumeric(esec.text) Then
   MsgBox "some of you entered endtime is not numeric or null!",vbOKCancel,"wrong time"
   timeconv = False
   Exit Function
End If
'check whether time is outof range
Call checktime(eyear.text,9999,0,"end year")
Call checktime(emonth.text,12,1,"end month")
Call checktime(eday.text,31,1,"end day")
Call checktime(ehour.text,23,0,"end hour")
Call checktime(emin.text,59,0,"end minutes")
Call checktime(esec.text,59,0,"end second")

'check whether begin time is later than end time
btime= byear.text & "-" & bmonth.text &"-"& bday.text &" "& bhour.text &":"& bmin.text&":"&bsec.text
etime=eyear.text+"-"+emonth.text+"-"+eday.text+" "+ehour.text+":"+emin.text+":"+esec.text

timeerr = DateDiff("s",btime,etime)
If timeerr<0 Then
MsgBox"you entered wrong time range,begin time later than end time"
timeconv = False
Exit Function
End If
'check whether it is export time or show time,
'chioce=0--show Time,chioce=1---export Time
If choice = 0 Then
begintime = btime
endtime = etime
Else
'time convert to equalize with SQL server
If bhour.text >= 8 Then
    temph=CInt(bhour.text)-8
    tempd=DateDiff("d",0,btime)
Else
   temph=CInt(bhour.text)+16
   tempd=DateDiff("d",1,btime)
End If
   stemph=CStr(temph)
   stempd=CStr(CDate(tempd))

'new time after convert
   newbtime=stempd+" "+stemph+":"+bmin.text+":"+bsec.text
If ehour.text >= 8 Then
    temph=CInt(ehour.text)-8
    tempd=DateDiff("d",0,etime)
Else
   temph=CInt(ehour.text)+16
   tempd=DateDiff("d",1,etime)
End If
   stemph=CStr(temph)
   stempd=CStr(CDate(tempd))
'new time after convert
   newetime=stempd+" "+stemph+":"+emin.text+":"+esec.text
begintime =newbtime
endtime=newetime
End If 'end of chioce 
timeconv = True 
End Function

Sub checktime(input,upper,downer,note)
'check if time is outof ranges
If CInt(input)<downer Or CInt(input)>upper Then
MsgBox"you entered wrong range of " ¬e
Exit Sub
End If
End Sub

使用listview控件显示数据:

dim conn, rs, cmd, pstr,ssql
Dim opdlg,fm, ListView1,trend,item1
Dim m,n,b,s
dim begintime,endtime
b=timeconv(begintime,endtime,0)
'MsgBox CDate(begintime)
if b=false then
exit sub
else 
set conn = createobject("adodb.connection")
set rs = createobject("adodb.recordset")
set cmd = createobject("adodb.command")
Set opdlg = ScreenItems("dialog")
Set trend = ScreenItems("curve")

With opdlg 
.Flags = 4
.Filter = "MDB文件(*.mdb)|*.mdb|AllFiles(*.*)|*.*|"
.FilterIndex = 2
.InitDir = "E:\vb code"
.Action = 1
End With

If opdlg.FileName = "" Then
MsgBox "you must choose a file"
   Exit Sub
Else
fm = opdlg.FileName
End If
'MsgBox begintime
pstr = "Provider=Microsoft.Jet.OLEDB.4.0;"
pstr = pstr & "Data Source=" & fm
conn.connectionstring=pstr
conn.cursorlocation=3
conn.open
ssql="select * from MyTable where cdate(time) between #"&begintime&"# And #"&endtime&"#" 
rs.cursorlocation = 3
rs.open ssql,conn,1,2
m=rs.fields.count
'MsgBox ssql
Set ListView1 = ScreenItems("listview")
ListView1.ColumnHeaders.Clear
ListView1.ColumnHeaders.Add , , CStr(Rs.Fields(0).Name), 100
ListView1.ColumnHeaders.Add , , CStr(Rs.Fields(1).Name), 70
ListView1.ColumnHeaders.Add , , CStr(Rs.Fields(2).Name), 70
If (m > 0) Then
MsgBox "here"
Rs.MoveFirst
n = 0
s=rs.recordcount
MsgBox s
Do While Not Rs.EOF
n = n + 1
s = Left(CStr(Rs.Fields(0).Value), 23)
Set Item1 = ListView1.ListItems.Add()
Item1.Text = Left(CStr(Rs.Fields(0).Value), 23)
Item1.SubItems(1) = FormatNumber(Rs.Fields(1).Value, 1)
Item1.SubItems(2) = FormatNumber(Rs.Fields(2).Value, 1)
trend.index = 0
trend.Datax=CDate(rs.fields(0).value) 
trend.datay= rs.fields(1).value
trend.InsertData = True 
trend.index = 1
trend.Datax=CDate(rs.fields(0).value) 
trend.datay= rs.fields(2).value
trend.InsertData = True

If (n > 1000) Then Exit Do
Rs.MoveNext
Loop
Rs.Close
Else
End If
Set Rs = Nothing
conn.Close
Set conn = Nothing
end if 'end of b=true

使用wincc自带function trend控件显示曲线,使用复选框选择:

显示复选框与关闭
Sub X6309X94AE3X0000X79F0_OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y) 
Dim checkbo
Set checkbo=ScreenItems("checkbox")
checkbo.Visible= Not checkbo.Visible
End Sub
复选框的输入输出域改变时VBS脚本,选择曲线
Sub Process_OnPropertyChanged(ByVal Item, ByVal value)         
Dim curve, checkbo
Dim pp,i
Set curve= ScreenItems("curve")
Set checkbo=ScreenItems("checkbox")
pp=checkbo.Process 
For i=0 To 1
curve.Index=i
If (pp Mod 2)=1 Then
curve.ItemVisible=True 
Else 
curve.ItemVisible=False
End If
pp=Fix(pp/2)
Next

End Sub

提问者对于答案的评价:
谢谢你们的回答!

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc267136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2019年6月11日
下一篇 2019年6月11日

相关推荐

  • WinCC屏幕分辨率设定问题?

    在WinCC6.2中要在OS项目编辑器中把监视器1024*768的分辨率改为1280*1024,但是提示组态运行系统出错,改不了不知道是什么原因? 问题补充:经过重启,重新打开后还…

    SIMATIC WinCC 2019年6月11日
  • wincc profisional V13 如何创建运行项目快捷键

    我下载了wincc profisional V13 SP1开发版,和西门子的分布式IO ET200SP 通讯,应该不用OPC软件吧…

    SIMATIC WinCC 2017年6月1日
  • wincc脚本触发

    wincc激活运行系统时触发一次脚本,怎么弄? 问题补充:wincc激活运行系统时触发一次,不是通过其他方式触发,就是激活了运行系统会有相关的变量或者系统变量作为标志吗?就像200…

    SIMATIC WinCC 2021年7月5日
  • 触摸屏报警显示设置

    我用TP270制作了一个报警,在离散量里写的报警信息,当有报警时在报警画面有报警信息输出,我见过德国很多设备,当一有报警信息时,无任在哪个显示画面,多被报警信息画面切换掉,显示报警…

    SIMATIC WinCC 2020年11月1日
  • 日报月报年报

    我想用EXCEL作一个日报月报年报的数据记录,请提示一下思路,或者提供一个现成的程序 最佳答案 参考 http://www.ad.siemens.com.cn/club/…

    SIMATIC WinCC 2019年6月11日
  • WINCC C脚本打不开

    我新到一个钢厂,厂子已经生产2年多了,这里的WINCC组态用了C脚本,主要是流量数据计算,现在领导要我修改流量记录曲线的显示比例,可是这个脚本已经加密码了,开始打开时提示要密码,可…

    SIMATIC WinCC 2019年6月11日
  • WINCC VBS的INPUTBOX函数问题

    如图,读取两个变量,然后相加,然后和INPUTBOX的值相比较,如果一样那么输出1,但是结果是每次都为0,这是哪里出问题了呢? 问题补充:最后两行,我把J3和a放到J4和J5里,发…

    2021年7月5日
  • 如何将S7 300中的TIME_OF_DAY 的时间在WINCC中显示

    如题,我在S7中有个变量是系统的时间,他的type 是 TIME_OF_DAY  例如时间为20:10:23.321 意思为20点…

    SIMATIC WinCC 2021年7月5日
  • WINCC 开关量历史曲线问题

    WINCC 开关量历史曲线问为什么变化为斜线? 最佳答案 因为通讯延时可能有的点不能被准确的用曲线表示出来,开关量即使能做曲线也是就两中值:0或1 提问者对于答案的评价:

    SIMATIC WinCC 2021年7月5日
  • Wincc 写数据到SQL数据库

    需要将wincc内某些变量的值通过全局脚本周期性写入SQL数据库自己建的表内,现在不知道Wincc怎样通过C脚本或则VBS访问SQL,大伙给点资料吧 最佳答案 http://www…

    SIMATIC WinCC 2017年11月1日