用VBS实现WINCC的用户归档输出到EXCEL表格的方法和例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用VBS实现WINCC的用户归档输出到EXCEL表格的方法和例
(2009-12-30 16:47:45)
用VBS实现WINCC的用户归档输出到EXCEL表格的方法和例子程序
求用VBS实现WINCC的用户归档输出到固定格式的EXCEL表格的方法和例子程序!我主要问题在SQL数据库的查询语句不会。

看见论坛里有关用VBS实现EXCEL的数据查询和导出,我现在想要完成如下功能:每分钟将数据归档,用户可以输入任意的时刻时间查询从任意时刻开始的之后每隔1小时的数据(有点像日报里的24个小时)。

我现在对于VBS查询数据库的语句不懂,望大大赐教!谢谢
''SQL查询语句
Dim strc as string
strc = "provider=WinCCOLEDBProvider.1;catalog=CC_RebdI_09_06_22_10_3 8_35R;data source=ComputerName\WinCC"
''这个连接字符串可以在SQl2000中看到
Dim cc1
Set cc1=CreateObject("adodb.connection")
cc1.ConnectionString=strc
cc1.CursorLocation=3
cc1.open
Dim rst As Object
Set rst = CreateObject("adodb.recordset")
dim ssql as string
ssql = "Tag:R,'Archive_3\DB1DBD0','2009-7-29 00:00:00.0000','200 9-7-29 23:59:59.999','timestep=3600,258'"
''Archive_3\I_DB1DBD0归档和变量
''2009-7-29 00:00:00.0000,2009-7-29 23:59:59.999时间段
''timestep=3600,258每阁多少秒拿一个数据(3600=1小时),258表示每个时间段取最后一个数据
rst.Open ssql, cc1
''这样查出来的数据就是一天的每小时的数据
''对rst记录集处理就可以得到你要的数据
==========================
Function action
Dim objExcelApp
Dim i,TimeM,TimeNow,TimeS
Set TimeM=HMIRuntime.Tags("TimeM")
i=1+TimeM.Read
TimeNow=CStr(Year(Now))&"年"&CStr(Month(Now))&"月"&CStr(Day(Now))&"日"&CStr(Hour(Now))&"-"&CStr(Minute(Now))&":"&CStr(Second(Now))
TimeS=Second(Now)
Set objExcelApp = CreateObject("Excel.Application")
objExcelApp.Visible = False
objExcelApp.Workbooks.Open"E:\ExcelTest.xls"
objExcelApp.Cells(i, 2).Value =123.47
objExcelApp.Cells(i, 1).Value = TimeNow
objExcelApp.DisplayAlerts = False
objExcelApp.ActiveWorkbook.Save
objExcelApp.Workbooks.Close
objExcelApp.quit
Set objExcelApp =Nothing
End Function
以上代码用于往指定的Excel表格中写数据。

该动作每分钟触发一次,依次往表格中写入60个数据,当进入下一个小时后,大概是因为表格中已存在数据所以在写入前会弹出对话框提醒是否覆盖还是另存,加入
objExcelApp.DisplayAlerts = False语句后就不存在这个问题了,对此要谢谢谢谢版主:城外之人。

WINCC与EXCEL数据交换hjyhjy,2010-11-09 16:55:28
WINCC与EXCEL数据交换
代码
Sub X6309X94AE13X0000X0000_OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)
Dim objExcelApp
Set objExcelApp=createobject("excel.applcation")
objExcelApp.Visible=True
objExcelApp.Workbooks.Open"E:\a.xls"
objExcelApp.cells(4,3).Value=ScreenItems("b").Outputvalue
objExcelApp.ActiveWorkbook.Save
objExcelApp.Workbooks.Close
objExcelApp.Quit
Set objExcelApp=Nothing
End Sub
谢谢,已经解决,单词写错了
objExcelApp.cells(4,3).Value=ScreenItems("b").Outputvalue
这里也有问题
在wincc中怎么做才能把报表生成按日期的Excel文件
2011-07-19 09:45
在wincc 中怎么做才能把报表生成按日期的Excel 文件
VBS脚本实现,就是把文件名称以变量的形式表示。

参考
'关闭保存
Dim patch,filename
filename=CStr(Year(Now))&CStr(Month(Now))&CStr(Day(Now))&CStr(Hour(No w))+CStr(Minute(Now))&CStr(Second(Now))
patch= "d:\"&filename&"demo.xls"
objExcelApp.ActiveWorkbook.SaveAs patch
objExcelApp.Workbooks.Close
objExcelApp.Quit
Set objExcelApp= Nothing
对于Excel报表,用VBS最灵活,Excel 定义好格式后wincc来填空,平均累计值就用Excel 的功能。

Dim excelapp
Dim aa,bb,cc
Set excelapp = CreateObject("Excel.Application")
Set aa = HMIRuntime.tags("tag1")
excelapp.visible = False'True
excelapp.workbooks.open "D:\excel.xls"
bb = Now 'getcurrent_datetime()
aa.Read
MsgBox CStr(bb)
excelapp.cells(1,1).value = "rrrrrr"'111111
excelapp.cells(1,2).value = CStr(bb)
excelapp.cells(2,2).value = CStr(aa.value)
excelapp.cells(3,2).value = CInt(aa.value)
excelapp.cells(4,2).value = CSng(aa.value)
excelapp.cells(5,2).value = CDbl(aa.value)
excelapp.cells(6,2).value = CLng(aa.value)
excelapp.cells(3,3).value = ScreenItems("33").outputvalue
excelapp.cells(4,4).value = ScreenItems("35").outputvalue
cc = "D:\excel" + Mid(CStr(bb), 1, 4)+ Mid(CStr(bb), 6, 2)+ Mid(CStr(bb), 9, 2)+ Mid(CS
tr(bb), 12, 2)+ Mid(CStr(bb), 15, 2)+ Mid(CStr(bb), 18, 2) + ".xls" MsgBox cc
excelapp.DisplayAlerts = False '对打开的文件,直接保存时,避免弹出对话框窗口,而是直接覆

excelapp.activeworkbook.saveas cc '根据当前日期时间,另存为新的文件
'excelapp.activeworkbook.save ’对打开的文件,直接保存
'excelapp.activeworkbook.saveAs "D:\excelcopy.xls" ’直接另存为新的文件
excelapp.workbooks.close
excelapp.quit
Set excelapp = Nothing
这个报表的数据采集没有难度;唯一的难度在于4班3 倒后,每个月班的出勤日是不一样的,这样对
于月报来说,计算出本月每个班的出勤日是需要些算法的。

这个报表用WinCC
完全可以实现。

关键就
是如何存储数据。

方法一 WinCC 支持VBS 脚本,其实通过VBS 和VB本质是没有区别的,都是通过ADO 方式,存储数据格
式化数据的存储。

WinCC的用户归档说白了就是WinCC提供的一个操作数据库表的工具。

我们可以
通过用户归档,创建数据库表。

然后存储数据。

显示的话通过报表系统的连接外部ODBC数据库,通过
SQL 脚本格式化输出。

就ok了。

方法二这个报表的关键就在于如何确定班别和数据之间的关系。

四班三运转在连续生产的行业是很常
见的。

首先确定班别和数据的对应关系。

在WinCC 归档的方式中有一种是通过事件触发的。

那么我们可以通过不同的用户登录来确定归档的启动或者停止,
WinCC中对应一个变量可以生成几个归档变量,那么我们就能确定班次和数据的关系。

比如:一个变
量A,在归档中我们可以建两个归档变量和它对应,一个是aa,一个是bb。

A班用户登录时启动aa的
归档,停止bb 的归档;B班用户登录时启动bb 归档,停止aa 归档,依次类推。

至于得到数据的方法,可以使用WinCC的标准归档查询实现。

数据的显示,通过WinCC 报表的变量直
接连接显示。

觉得和VB相比,方法各有千秋。

但是这样就省去了多加一个应用程序了。

WinCC里面做复杂报表的方法。

WinCC 自带的报表编辑器确实功能有限,还好WinCC 本身功能是强大
的,可以通过脚本来完成复杂报表功能。

目前我也是这么做的。

报表的思路如下:1、用excel我们也做一个符合自己实际需要报表(日报)的空白模板,我称它为Day_Report.xls;
相信各位大侠的excel表格都比我做的精美;我不懂关系数据库,但各位大侠肯定比我精通excel 各
单元格之间的加、减、乘、除,甚至更加复杂的运算,并把运算结果放在你需要放置的单元格内,关
系数据之间的运算,要在excel模板里面预先设置好。

我们要充分利用excel
强大的数据处理能力!!!
2、在WinCC 里面写一个全局脚本,在每天的00:00:01触发,执行复制
Day_Report.xls并以此刻
的年月日加载到模板文件名里面,将复制新生产的“Day_Report年月日.xls”存盘到你指定的目录。

这样当天的空白日报文件也就有了。

全局脚本代码如下:(本人测试通过,仅供参考)
#include "apdefap.h"
int gscAction( void )
{
#pragma code ("kernel32.dll")//调用动态链接库
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
#pragma code ()
#pragma code("Shell32.dll")//调用动态链接库
VOID ShellExecuteA(HWND, LPCTSTR , LPCTSTR , LPCTSTR , LPCTSTR , INT); #pragma code()
char FileName[30] = ""; char DateTime[30] = "";
SYSTEMTIME sysTime;
__object* pExcel = NULL; //建立 pExcel 指针用来对 EXCEL 进行操作HWND handle=NULL;
handle=FindWindow(NULL,"WinCC-运行系统 - ");
GetLocalTime(&sysTime);
sprintf(FileName,"d:\\Day_Report_%02d-%02d-%02d.xls",sysTime.wYear,sy sTime.wMonth,sysTi
me.wDay);
pExcel = __object_create("Excel.Application");
pExcel->Visible = 0;//控制生成的excel 文件是否可见,当1 时,生成excel 文件时可见.
pExcel->Workbooks ->Open ("d:\\Day_Report.XLS");
pExcel->ActiveWorkbook->SaveAs(FileName);//存盘
//pExcel->ActiveWorkbook->PrintPreview();//可以预览
//pExcel->ActiveWorkbook->PrintOut();//直接打印
pExcel->Workbooks->Close();//关闭文件
pExcel->Quit();//退出Excel
__object_delete(pExcel);
return 0;
}
3、再写一个全局脚本,整点触发,把你需要记录的变量写到“Day_Report年月日.xls”相应的单
元格里面并存盘;这样就完成了报表的数据存储和打印。

也就是说,我们可以在电脑里面存放一份报
表,并打印一份报表。

同样也实现了数据的存储。

相关脚本代码如下:(当时是以分钟来做测试的,仅供参考;注意此段代码缺少对其它excel进程的
判断,在此脚本执行前,不要有其它excel应用!切记哦!!!呵呵。


#include "apdefap.h"
int gscAction( void )
{
int i;
#pragma code ("kernel32.dll")//调用动态链接库
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
#pragma code ()
#pragma code("Shell32.dll")//调用动态链接库
VOID ShellExecuteA(HWND, LPCTSTR , LPCTSTR , LPCTSTR , LPCTSTR , INT); #pragma code()
char FileName[30] = "";
SYSTEMTIME sysTime;
__object* pExcel = NULL; //建立 pExcel 指针用来对 EXCEL 进行操作HWND handle=NULL;
handle=FindWindow(NULL,"WinCC-运行系统 - ");
GetLocalTime(&sysTime);
//***********************************
SetTagWord("Minute",sysTime.wMinute);
i=GetTagWord("Minute")+3;
if (i>26) { GetTagWord("Minute") ;}
else if (i<=26)
{
sprintf(FileName,"d:\\Day_Report_%02d-%02d-%02d.xls",sysTime.wYear,sy sTime.wMonth,sysTi
me.wDay);
pExcel = __object_create("Excel.Application");
pExcel->Visible = 0;//控制生成的excel 文件是否可见,当1 时,生成excel 文件时可见.
pExcel->Workbooks ->Open (FileName);
pExcel->Worksheets("sheet1")->Range("X1")->Value=GetTagChar("@ServerN ame");//Return-Typ
e: char* 读取当前计算机名
pExcel->Worksheets("sheet1")->Range("X2")->Value=GetTagChar("@Current User");//Return-Ty
pe: char* 读取当前操作员
pExcel->Worksheets("sheet1")->Cells(6,i)->Value=GetTagChar("TAG1"); pExcel->Worksheets("sheet1")->Cells(7,i)->Value=GetTagFloat("TAG2"); pExcel->Worksheets("sheet1")->Cells(8,i)->Value=GetTagFloat("TAG3"); pExcel->Worksheets("sheet1")->Cells(9,i)->Value=GetTagFloat("TAG4"); pExcel->Worksheets("sheet1")->Cells(10,
i)->Value=GetTagFloat("TAG5");
pExcel->Worksheets("sheet1")->Cells(11,
i)->Value=GetTagFloat("TAG6");
pExcel->ActiveWorkbook->Save;//As(FileName);//存盘~
//pExcel->ActiveWorkbook->PrintPreview();//可以预览
//if (i>=27) { pExcel->ActiveWorkbook->PrintOut(); }//直接打印
pExcel->Workbooks->Close();//关闭文件
pExcel->Quit();//退出Excel
__object_delete(pExcel);
}
return 0;
}
转自亿万论坛。

相关文档
最新文档