用组态王报表功能实现显示设备启动、停止时间和运行时长的方法 点击:8256 | 回复:17



zhongxxx

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 20回
  • 年度积分:11
  • 历史总积分:274
  • 注册:2007年1月02日
发表于:2011-08-10 11:23:41
楼主

在对设备的状态进行监控中,往往要取得一些参数来记录和分析设备的运行状况。这其中就包括设备的启动时间、停止时间和运行的时长。当然,组态软件不会有这样的功能,让我们轻易实现。不过,通过组态软件的报表功能,再通过二次开发,写一些脚本语言。实现起来倒也不难。以下,以组态王为例,是对操作过程的描述,希望能够对需要的人有一些帮助。

总体思路:以一个项目为例。在这个工程中,有21台设备的运行状态需要记录,他们的运行状态依次记录在报表中。报表中的每一行都表示,此设备的一个运行周期。由于设备状态在报表中依次排列,因此需要相应的变量来保存该设备状态所在的行数。这样,当停止该设备时,才能将“停止时间”和“运行时长”填充到正确的位置。这样,就需要建立21个内存整形变量。由于报表中的记录依次排列,因此还需要一个变量来保存报表中最后一条记录的行数,这样才能顺序填充记录。

1、 新建报表,并命名为“报表1”。


2、 创建内存整形变量。21个内存变量分别保存21个设备状态所在的行数。1个内存变量保存报表中最后一条记录的行数。


3、 编写自定义函数,好处是减少代码量,修改方便。

脚本内容具体如下
//"var"是变量的名称,"name"是要显示在报表中的字符串,"varRow"是保存记录的行数
//用年月日,时分秒,系统变量来组合形成日期。
//不用日期变量,因为其格式长度不确定,在后来的分解中会很麻烦。
string strY=StrFromInt( \\本站点\$年, 10 );
string strM=StrFromInt( \\本站点\$月, 10 );
string strD=StrFromInt( \\本站点\$日, 10 );

string strH=StrFromInt( \\本站点\$时, 10 );
string strMi=StrFromInt( \\本站点\$分, 10 );
string strS=StrFromInt( \\本站点\$秒, 10 );

//确定日期的格式,并使长度和位置固定
if(\\本站点\$月<10) strM="0"+strM;
if(\\本站点\$日<10) strD="0"+strD;
if(\\本站点\$时<10) strH="0"+strH;
if(\\本站点\$分<10) strMi="0"+strMi;
if(\\本站点\$秒<10) strS="0"+strS;

//组合,定义格式
string str=strY+"-"+strM+"-"+strD+" "+strH+":"+strMi+":"+strS;

//启动设备时,将“序号”、“名称”、“启动时间”填充到报表中
if(var==1)
{
long num=报表当前行-1;
string id=StrFromInt( num, 10 );

ReportSetCellString("报表1", 报表当前行, 1, id);//序号
ReportSetCellString("报表1", 报表当前行, 2, name);//名称
ReportSetCellString("报表1", 报表当前行, 3, str);//开始时间

varRow=报表当前行;//所在行=报表当前行
报表当前行=报表当前行+1;
}
//停止设备时
else
{
string startStr=ReportGetCellString("报表1", varRow, 3);//从报表中取得开始时间

//开始时间转换秒 2011-05-06 12:23:34
string midY=StrMid( startStr, 1, 4 );
string midM=StrMid( startStr, 6, 2 );
string midD=StrMid( startStr, 9, 2 );

string midH=StrMid( startStr, 12, 2 );
string midMi=StrMid( startStr, 15, 2 );
string midS=StrMid( startStr, 18, 2 );

long lY=StrToInt( midY);
long lM=StrToInt( midM);
long lD=StrToInt( midD);

long lH=StrToInt( midH);
long lMi=StrToInt( midMi);
long lS=StrToInt( midS);

long startTime= HTConvertTime(lY,lM,lD,lH,lMi,lS);
long endTime= HTConvertTime(\\本站点\$年,\\本站点\$月,\\本站点\$日,\\本站点\$时,\\本站点\$分,\\本站点\$秒);//结束时间转换秒

//计算时间差
long timeLength=endTime-startTime;//单位秒
//秒转换为小时
//timeLength=timeLength/3600;
string endStr=StrFromInt( timeLength, 10 )+"秒";

//将“停止时间”和“运行时长”填充到报表中
ReportSetCellString("报表1", varRow, 4, str);//结束时间
ReportSetCellString("报表1", varRow, 5, endStr);//时间长度

}

4、 建立设备启动或停止的运行事件命令。只需调用自定义函数,并将填写相应的变量即可。如:SetReport(\\本站点\冰水循环泵2运行,"冰水循环泵2",\\本站点\冰水循环泵2所在行);


5、 运行程序




宋仲狼

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 11回
  • 年度积分:0
  • 历史总积分:62
  • 注册:2007年11月06日
发表于:2011-11-13 08:00:27
1楼
非常感谢,老兄,牛人总是让人尊敬的。

YSC1

  • 精华:3帖
  • 求助:2帖
  • 帖子:129帖 | 2487回
  • 年度积分:88
  • 历史总积分:8018
  • 注册:2002年6月07日
发表于:2012-08-23 16:20:27
2楼
有做过的吗?为什么我按照以上做的不能运行呢?

工控钓鱼鸟

  • 精华:3帖
  • 求助:2帖
  • 帖子:129帖 | 2487回
  • 年度积分:88
  • 历史总积分:8018
  • 注册:2002年6月07日
发表于:2012-10-30 16:32:36
3楼
楼主还在 吗?牛人在吗?不要潜水

工控钓鱼鸟

  • 精华:3帖
  • 求助:2帖
  • 帖子:129帖 | 2487回
  • 年度积分:88
  • 历史总积分:8018
  • 注册:2002年6月07日
发表于:2012-11-02 16:43:06
4楼

此图是结构变量内的吗?

工控钓鱼鸟

  • 精华:3帖
  • 求助:2帖
  • 帖子:129帖 | 2487回
  • 年度积分:88
  • 历史总积分:8018
  • 注册:2002年6月07日
发表于:2012-11-13 12:01:45
5楼

我即可就去,谢楼上                  

DCS、自动化

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 122回
  • 年度积分:2
  • 历史总积分:1414
  • 注册:2003年3月24日
发表于:2012-11-14 20:57:40
6楼

我们经常做这些案例,有兴趣联系QQ:1918263225

QY21255

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 8回
  • 年度积分:0
  • 历史总积分:18
  • 注册:2013年1月18日
发表于:2013-01-27 16:32:54
7楼
谢谢楼主,很想好好学习下!

flya0713

  • 精华:0帖
  • 求助:1帖
  • 帖子:2帖 | 28回
  • 年度积分:0
  • 历史总积分:35
  • 注册:2014年1月30日
发表于:2014-01-30 18:50:07
8楼

谢谢楼主,很想好好学习下!

huoshi

  • 精华:0帖
  • 求助:22帖
  • 帖子:347帖 | 2576回
  • 年度积分:517
  • 历史总积分:23145
  • 注册:2020年3月27日
发表于:2014-01-31 08:42:46
9楼

谢谢老师分享最好有工程案例学习学习!!!

ascent522

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 4234回
  • 年度积分:0
  • 历史总积分:10293
  • 注册:2011年2月28日
发表于:2014-01-31 19:00:44
10楼

引用 flya0713 的回复内容: 谢谢楼主,很想好好学习下!



jdlzl

  • 精华:0帖
  • 求助:5帖
  • 帖子:18帖 | 47回
  • 年度积分:0
  • 历史总积分:275
  • 注册:2003年8月27日
发表于:2014-04-15 18:27:39
11楼

几个问题能问下吗?

1)第一行能固定不动吗?就是下面填的再多行,第一行始终出现

2)表格填多行时,如果超过了原来设定的行数,超出了显示区域,运行时始终最后一行显示,怎么设置?

3)怎样自动保存,保存后又如何装载新表格

主要是第一、第二问!!

ycl111

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 11回
  • 年度积分:9
  • 历史总积分:536
  • 注册:2014年9月12日
发表于:2014-09-22 21:08:02
12楼

牛人总是让人膜拜,谢谢,老师

王者之师-陌上尘

  • 精华:1帖
  • 求助:11帖
  • 帖子:20帖 | 939回
  • 年度积分:0
  • 历史总积分:5186
  • 注册:2010年5月12日
发表于:2015-02-04 09:57:07
13楼

这是个老帖子,新人有几个问题想请教一下:

1、您这个报表主要是把设备启动运行、停止记录一次、能不能多条记录,设备多次急停是要记录的

2、你这个是固定行、固定设备记录在报表中的位置,能否随机的记录呢

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:39
  • 注册:2006年4月25日
发表于:2015-07-02 10:31:05
14楼

我也是遇到这样的问题,请问你后面解决了吗?


  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:39
  • 注册:2006年4月25日
发表于:2015-07-02 10:32:42
15楼

能帮忙指导一下吗?

表格填多行时,如果超过了原来设定的行数,超出了显示区域,运行时始终最后一行显示,怎么设置?

ww4649

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:41
  • 注册:2020年8月26日
发表于:2021-12-15 17:31:29
16楼

"jdlzl" 的回复,发表在11楼
        对内容: 【几个问题能问下吗?1)第一行能固定不动吗?就是下面填的再多行,第一行始终出现2)表格填多行时,如果超过了原来设定的行数,超出了显示区域,运行时始终最后一行显示,怎么设置?3)怎样自动保存,保存后又如何...】进行回复:

        -----------------------------------------------------------------


这个问题解决了吗?

kd18746

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 119回
  • 年度积分:18
  • 历史总积分:108
  • 注册:2005年9月22日
发表于:2023-07-05 22:47:03
17楼

这个真的很好


热门招聘
相关主题

官方公众号

智造工程师