在WINCC中使用VB脚本通过excel实现报表遇到难题。 点击:4996 | 回复:15



menghua

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 36回
  • 年度积分:0
  • 历史总积分:20
  • 注册:2008年11月14日
发表于:2009-04-04 18:26:18
楼主

新建了一个按钮,按钮属性中选择“鼠标”,右键点击“鼠标动作”选择VB动作。
我做了一段程序,可是没有数据进来。我利用VB做的。程序参考了西门子官网上的文件“WinCC数据报表实现方法介绍.pdf ”

大家看看程序上有哪些不足。

Dim objExcelApp,objExcelBook,objExcelSheet
Dim tagyali1,tagyali2,tagyali3,tagyali4
Dim tagliuliang1,tagliuliang2
Dim tago2
Dim tagshijian,sheetname
Dim i,j
Dim msg

Set tagyali1=HMIRuntime.Tags("p1")
Set tagyali2=HMIRuntime.Tags("p2")
Set tagyali3=HMIRuntime.Tags("p3")
Set tagyali4=HMIRuntime.Tags("p4")
Set tagliuliang1=HMIRuntime.Tags("l1")
Set tagliuliang2=HMIRuntime.Tags("l2")
Set tago2=HMIRuntime.Tags("MicroWin.fuyang.v.o2")

msg="ok"
sheetname="sheetdemo"

On Error Resume Next
Dim ExcelApp,ExcelBook
Set ExcelApp=GetObject(,"Excel.Application")
If TypeName(ExcelApp)="Application" Then
For Each ExcelBook In ExcelApp.WorkBooks
If ExcelBook.FullName="E:\biao.xls" Then
ExcelApp.ActiveWorkbook.Save
ExcelApp.Workbooks.Close
ExcelApp.Quit
Set ExcelApp=Nothing
Exit For
End If
Next
End If

Set objExcelApp=CreateObject("Excel.Application")
open file
objExcelApp.Visible=True
objExcelApp.Workbooks.Open"E:\biao.xls"
objExcelApp.Worksheets(sheetname).Activate

With objExcelApp.Worksheets(sheetname)
For i=5 To 25
For j=1 To 8
.cells(i,j)=Null
Next
Next
For i=26 To 26
For j=1 To 7
.cells(i,j)=Null
Next
Next
End With

tagshijian=Now
objExcelApp.Worksheets(sheetname).cells(2,2).value=tagshijian
For i=5 To 25
with objExcelApp.Worksheets(sheetname)
.cell(i,1).value=tagshijian
tagyali1.Read
.cell(i,2).value=tagyali1.value
tagyali2.Read
.cell(i,3).value=tagyali2.value
tagyali3.Read
.cell(i,4).value=tagyali3.value
tagyali4.Read
.cell(i,5).value=tagyali4.value
tagliuliang1.Read
.cell(i,6).value=tagliuliang1.value
tagliuliang2.Read
.cell(i,7).value=tagliuliang2.value
tago2.Read
.cell(i,8).value=tago2.value
End With
Next
MsgBox msg
Dim patch,filename
filename=CStr(Month(Now))&CStr(Day(Now))+CStr(Hour(Now))&CStr(Minute(Now))
patch="E:\"&filename&".xls"
objExcelApp.ActiveWorkbook.SaveAs patch
objExcelApp.Workbooks.Close
objExcelApp.Quit
Set objExcelApp=Nothing

excel表格如下:

就是没有数据进来。




fangzhongyuan

  • 精华:0帖
  • 求助:0帖
  • 帖子:31帖 | 180回
  • 年度积分:0
  • 历史总积分:6147
  • 注册:2006年11月28日
发表于:2009-04-04 22:29:45
1楼

改成这样试试:

Dim objExcelApp,objExcelBook,objExcelSheet
Dim tagyali1,tagyali2,tagyali3,tagyali4
Dim tagliuliang1,tagliuliang2
Dim tago2
Dim tagshijian,sheetname
Dim i,j
Dim msg

Set tagyali1=HMIRuntime.Tags("MicroWin.fuyang.v.p1")
Set tagyali2=HMIRuntime.Tags("MicroWin.fuyang.v.p2")
Set tagyali3=HMIRuntime.Tags("MicroWin.fuyang.v.p3")
Set tagyali4=HMIRuntime.Tags("MicroWin.fuyang.v.p4")
Set tagliuliang1=HMIRuntime.Tags("MicroWin.fuyang.v.l1")
Set tagliuliang2=HMIRuntime.Tags("MicroWin.fuyang.v.lt2")
Set tago2=HMIRuntime.Tags("MicroWin.fuyang.v.o2")

msg="ok"
sheetname="sheetdemo"

On Error Resume Next
Dim ExcelApp,ExcelBook
Set ExcelApp=GetObject(,"Excel.Application")
If TypeName(ExcelApp)="Application" Then
For Each ExcelBook In ExcelApp.WorkBooks
If ExcelBook.FullName="E:\biao.xls" Then
ExcelApp.ActiveWorkbook.Save
ExcelApp.Workbooks.Close
ExcelApp.Quit
Set ExcelApp=Nothing
Exit For
End If
Next
End If

Set objExcelApp=CreateObject("Excel.Application")
objExcelApp.Visible=True
objExcelApp.Workbooks.Open"E:\biao.xls"
objExcelApp.Worksheets(sheetname).Activate

With objExcelApp.Worksheets(sheetname)
For i=5 To 25
For j=1 To 8
.cells(i,j)=Null
Next
Next
For i=26 To 26
For j=1 To 7
.cells(i,j)=Null
Next
Next
End With

tagshijian=Now
objExcelApp.Worksheets(sheetname).cells(2,2).value=tagshijian
For i=5 To 25
with objExcelApp.Worksheets(sheetname)
.cell(i,1).value=tagshijian
tagyali1.Read
.cell(i,2).value=tagyali1.Value
tagyali2.Read
.cell(i,3).value=tagyali2.Value
tagyali3.Read
.cell(i,4).value=tagyali3.Value
tagyali4.Read
.cell(i,5).value=tagyali4.Value
tagliuliang1.Read
.cell(i,6).value=tagliuliang1.Value
tagliuliang2.Read
.cell(i,7).value=tagliuliang2.Value
tago2.Read
.cell(i,8).value=tago2.Value
End With
Next
MsgBox msg
Dim patch,filename
filename=CStr(Month(Now))&CStr(Day(Now))+CStr(Hour(Now))&CStr(Minute(Now))
patch="E:\"&filename&".xls"
objExcelApp.ActiveWorkbook.SaveAs patch
objExcelApp.Workbooks.Close
objExcelApp.Quit
Set objExcelApp=Nothing

menghua

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 36回
  • 年度积分:0
  • 历史总积分:20
  • 注册:2008年11月14日
发表于:2009-04-05 21:42:38
2楼
不行啊,没有数据记录,打开文件,里面的数据是空的。

menghua

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 36回
  • 年度积分:0
  • 历史总积分:20
  • 注册:2008年11月14日
发表于:2009-04-07 20:32:48
3楼

大虾们,帮帮忙。我觉得变量没有连接上,你们看看是哪错了。

yuanle

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 10208回
  • 年度积分:2747
  • 历史总积分:48332
  • 注册:2005年4月22日
发表于:2009-04-07 20:43:54
4楼
很长时间没用过Wincc了,都快忘记了,但是貌似Wincc使用VBS来读取变量时,应该使用Read方法。

以上

LUGANCHAO

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 1821回
  • 年度积分:0
  • 历史总积分:2757
  • 注册:2007年4月06日
发表于:2009-04-07 21:14:51
5楼
很长时间没用过Wincc了,都快忘记了

LUGANCHAO

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 1821回
  • 年度积分:0
  • 历史总积分:2757
  • 注册:2007年4月06日
发表于:2009-04-07 21:14:56
6楼
很长时间没用过Wincc了,都快忘记了

menghua

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 36回
  • 年度积分:0
  • 历史总积分:20
  • 注册:2008年11月14日
发表于:2009-04-11 20:11:27
7楼

我个人认为是变量没有读成功。

我行我素-2008

  • 精华:0帖
  • 求助:1帖
  • 帖子:6帖 | 92回
  • 年度积分:7
  • 历史总积分:372
  • 注册:2004年8月03日
发表于:2009-04-11 23:12:38
8楼

脚本作如下修改:

1是: sheetname="sheet1"
2是:For i=5 To 25
with objExcelApp.Worksheets(sheetname)
.cell(i,1).value=tagshijian
tagyali1.Read
.cell(i,2).value=tagyali1.value
tagyali2.Read
.cell(i,3).value=tagyali2.value
tagyali3.Read
.cell(i,4).value=tagyali3.value
tagyali4.Read
.cell(i,5).value=tagyali4.value
tagliuliang1.Read
.cell(i,6).value=tagliuliang1.value
tagliuliang2.Read
.cell(i,7).value=tagliuliang2.value
tago2.Read
.cell(i,8).value=tago2.value
End With
Next
-------应改为:

For i=5 To 25
objExcelApp.Worksheets(sheetname).cells(i,1).value=tagshijian
objExcelApp.Worksheets(sheetname).cells(i,2).value=HMIRuntime.Tags("p1").Read
objExcelApp.Worksheets(sheetname).cells(i,3).value=HMIRuntime.Tags("p2").Read
objExcelApp.Worksheets(sheetname).cells(i,4).value=HMIRuntime.Tags("p3").Read
objExcelApp.Worksheets(sheetname).cells(i,5).value=HMIRuntime.Tags("p4").Read
objExcelApp.Worksheets(sheetname).cells(i,6).value=HMIRuntime.Tags("l1").Read
objExcelApp.Worksheets(sheetname).cells(i,7).value=HMIRuntime.Tags("l2").Read
objExcelApp.Worksheets(sheetname).cells(i,8).value=HMIRuntime.Tags("MicroWin.fuyang.v.o2").Read
Next

修改完就可以乐

menghua

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 36回
  • 年度积分:0
  • 历史总积分:20
  • 注册:2008年11月14日
发表于:2009-04-27 17:42:50
9楼

谢谢了,明天我去现场试试。

 

qichaoxing1

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2009-06-10 10:19:44
10楼

这个程序是问问题了,但我要举以反三还是没看懂意思.这个是不是还要在WINCC里面什么地方配置变量呀?就是说是不是还在在WINCC里面怎么设置?软件到是懂了可是不知道怎么在WINCC里面设置这几个变量,所以没有数据出来,只有时间.请大家帮忙!!!!!急用

lrx0825

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2008年1月02日
发表于:2010-02-03 11:17:21
11楼

你好,你的做好了没有

 

fantage18

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:81
  • 历史总积分:137
  • 注册:2003年4月30日
发表于:2010-09-10 16:30:24
12楼

我试验了,怎么没有呢?还有就是我想用WINCC全局脚本做一个。
利用C脚本实现excel报表:
1、在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()
cha r FileName[30] = ""; cha r 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,sysTime.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;
}
2、再写一个全局脚本,整点触发,把你需要记录的变量写到“Day_Report年月日.xls”相应的单
元格里面并存盘;这样就完成了报表的数据存储和打印。也就是说,我们可以在电脑里面存放一份报
表,并打印一份报表。同样也实现了数据的存储。
相关脚本代码如下:(当时是以分钟来做测试的,仅供参考;注意此段代码缺少对其它excel进程的
判断,在此脚本执行前,不要有其它excel应用!切记哦!!!呵呵。)
#include "apdefap.h"
int gscAction( void )
{
int i;
#pragma code ("kernel32.dll")//调用动态链接库
httP://ssyway.blog.sohu.com
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
#pragma code ()
#pragma code("Shell32.dll")//调用动态链接库
VOID ShellExecuteA(HWND, LPCTSTR , LPCTSTR , LPCTSTR , LPCTSTR , INT);
#pragma code()
cha r 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,sysTime.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=GetTagCha r("@ServerName");//Return-Typ
e: cha r* 读取当前计算机名
pExcel->Worksheets("sheet1")->Range("X2")->Value=GetTagCha r("@CurrentUser");//Return-Ty
pe: cha r* 读取当前操作员
pExcel->Worksheets("sheet1")->Cells(6,i)->Value=GetTagCha r("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;
}
各位高手,我这么做完了,不行呀,哪位能帮我,谢谢。fantage18@163.com

kukulee

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2011年7月06日
发表于:2011-07-19 22:09:20
13楼
脚本作如下修改: 1是: sheetname="sheet1" 2是:For i=5 To 25 with objExcelApp.Worksheets(sheetname) .cell(i,1).value=tagshijian tagyali1.Read .cell(i,2).value=tagyali1.value tagyali2.Read .cell(i,3).value=tagyali2.value tagyali3.Read .cell(i,4).value=tagyali3.value tagyali4.Read .cell(i,5).value=tagyali4.value tagliuliang1.Read .cell(i,6).value=tagliuliang1.value tagliuliang2.Read .cell(i,7).value=tagliuliang2.value tago2.Read .cell(i,8).value=tago2.value End With Next -------应改为: For i=5 To 25 with objExcelApp.Worksheets(sheetname) .cells(i,1).value=tagshijian tagyali1.Read .cells(i,2).value=tagyali1.value tagyali2.Read .cells(i,3).value=tagyali2.value tagyali3.Read .cells(i,4).value=tagyali3.value tagyali4.Read .cells(i,5).value=tagyali4.value tagliuliang1.Read .cells(i,6).value=tagliuliang1.value tagliuliang2.Read .cells(i,7).value=tagliuliang2.value tago2.Read .cells(i,8).value=tago2.value End With Next cell后面漏掉了S,粗心要不得

moonyueer

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2019年6月27日
发表于:2020-04-09 12:11:42
14楼

按照脚本,得到的表格只有同一时间的数据,若以5秒间隔,怎么解决

国家工业化

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 93回
  • 年度积分:0
  • 历史总积分:18
  • 注册:2005年4月08日
发表于:2020-07-02 11:36:41
15楼

不错,学习了



热门招聘
相关主题

官方公众号

智造工程师