回复:技术专题探讨-WinCC实现报表的不同方法及其应用

n次看你的背影

  • 帖子

    2321
  • 精华

    73
  • 被关注

    53

论坛等级:奇侠

注册时间:2008-03-11

普通 普通 如何晋级?

发布于 2009-03-03 01:11:59

0楼

呵呵,看到各位大侠对报表做了很多方面的深刻讨论,也让我学习了很多。不过本人功底差,对数据库基本不懂。确实用数据库存储数据是比较安全的,但通过数据库来查询得出的“报表”,应该称之为查询结果吧。失去了报表本身的意义了。
较长一段时间,我也在思考和寻找WinCC里面做复杂报表的方法。WinCC自带的报表编辑器确实功能有限,还好WinCC本身功能是强大的,可以通过脚本来完成复杂报表功能。目前我也是这么做的。
我个人认为,在WinCC里面做复杂报表,并不急于去组态和编程;而是先弄清楚原始手工报表的制作过程。报表也就是时间和各类数据的交集的一张表格,手工报表就是通过人工将数据填入相应的格子里面,手工报表就是这么朴素。不过手工报表有n张相同的纸,拿在手上就好像一本书,或者像一块大砖头。呵呵!
目前我报表的思路如下:
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,sysTime.wMonth,sysTime.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,sysTime.wMonth,sysTime.wDay);
pExcel = __object_create("Excel.Application");
pExcel->Visible = 0;//控制生成的excel文件是否可见,当1时,生成excel文件时可见.
pExcel->Workbooks ->Open (FileName);
pExcel->Worksheets("sheet1")->Range("X1")->Value=GetTagChar("@ServerName");//Return-Type: char* 读取当前计算机名
pExcel->Worksheets("sheet1")->Range("X2")->Value=GetTagChar("@CurrentUser");//Return-Type: 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;
}

日报有了,班报、月报,应该也就没有问题了吧!希望大家有什么好东东也一起拿出来分享一下,个人的智慧是有限的,大家的力量是无穷的。不要吝啬,多交流才有进步!

阿弥陀佛!我希望我能给那些热爱工控的人们一点点帮助!!
管理员注:本帖已被纳入此次探讨发帖整理之方案汇总,请点此详阅
佛对我说:“你的痛苦来自于你的欲望,没有欲望也就没有痛苦!”
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC WinCC / Panel

共有32564条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。