获得机器在两个日期之间的总运行时间,但分为3个时间范围:标准时间、高峰时间和非高峰时间。
上下文
编程环境: Wonderware ArchestrA
编程语言: ArchestrA快速脚本.Net
数据库:历史学家- Server (In- SQL )
外部:几个泵在矿业,需要知道泵的使用在3个不同的电费时间(高峰,标准,离峰时间)。
平日:
标准时间: 09:00至5:00及19:00至22:00
繁忙时间: 06:00至09:00及17:00至19:00
非山顶时间: 22:00至06:00
星期六:
标准时间: 07:00至12:00及6:00至20:00
非山顶时间:20时至07:00及12:00至6:00
星期日:
非高峰时间:整个星期天都是淡季。
我需要
在两个日期之间:
我试过的是:(在机器运行的几个小时内,所有的非高峰时间)。
这很管用,但大多数时候我得到的时间比我应该得到的要少。
-- This script only gets the total off-peak time hours
SET NOCOUNT ON
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
DECLARE @var1 REAL;
DECLARE @var2 REAL;
DECLARE @var3 REAL;
SET @StartDate = '2015/08/01 05:00:00.000'
SET @EndDate = GetDate()
SET NOCOUNT OFF
SET @var1 =
(
SELECT
'Count' = Count(DiscreteHistory.Value)/60.0
FROM
DiscreteHistory
WHERE
DiscreteHistory.TagName
IN ('KDCE_S04_22PMP01_Machine.FA_RF')
AND DiscreteHistory.Value = 1
AND wwRetrievalMode = 'Cyclic'
AND wwResolution = 60000
AND DateTime >= @StartDate
AND DateTime <= @EndDate
AND DATEPART(dw, DateTime) NOT IN (2, 3, 4, 5, 6, 7)
)
SET @var2 =
(
SELECT
'Count' = Count(DiscreteHistory.Value)/60.0
FROM
DiscreteHistory
WHERE
DiscreteHistory.TagName
IN ('KDCE_S04_22PMP01_Machine.FA_RF')
AND DiscreteHistory.Value = 1
AND wwRetrievalMode = 'Cyclic'
AND wwResolution = 60000
AND DateTime >= @StartDate
AND DateTime <= @EndDate
AND DATEPART(dw, DateTime) NOT IN (1, 2, 3, 4, 5, 6)
AND (CAST(DateTime as time) >= '20:00:00' AND CAST(DateTime as time) < '07:00:00')
)
SET @var3 =
(
SELECT
'Count' = Count(DiscreteHistory.Value)/60.0
FROM
DiscreteHistory
WHERE
DiscreteHistory.TagName
IN ('KDCE_S04_22PMP01_Machine.FA_RF')
AND DiscreteHistory.Value = 1
AND wwRetrievalMode = 'Cyclic'
AND wwResolution = 60000
AND DateTime >= @StartDate
AND DateTime <= @EndDate
AND DATEPART(dw, DateTime) NOT IN (1, 2, 3, 4, 5, 6)
AND (CAST(DateTime as time) >= '12:00:00' AND CAST(DateTime as time) < '18:00:00')
)
IF @var1 IS NULL SET @var1 = 0
IF @var2 IS NULL SET @var2 = 0
IF @var3 IS NULL SET @var3 = 0
SELECT
'Count' = (Count(DiscreteHistory.Value)/60.0) + @var1 + @var2 + @var3
FROM
DiscreteHistory
WHERE
DiscreteHistory.TagName
IN ('KDCE_S04_22PMP01_Machine.FA_RF')
AND DiscreteHistory.Value = 1
AND wwRetrievalMode = 'Cyclic'
AND wwResolution = 60000
AND DateTime >= @StartDate
AND DateTime <= @EndDate
AND DATEPART(dw, DateTime) NOT IN (1, 7)
AND (CAST(DateTime as time) >= '22:00:00' OR CAST(DateTime as time) < '06:00:00'); 谢谢。
样本数据
我将下列信息登录到数据库中:
运行反馈的唯一标记名称: KDCE_S04_22PMP01_Machine.FA_RF --这是一个运行反馈,它是"1“、"0”或“空”值。
机器运行时数的唯一标记名称: me.a0_MainPump.RunningHours.FA_PV,它是泵运行时数的整数值。
两个标记名都使用TagName、Value、DateTime、quality等进行记录。
我有一个包含以下列的表:
| DateTime | TagName | Value | QualityDetail | 获取DB中的示例数据的脚本:
SET NOCOUNT ON
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = '20150701 05:00:00.000'
SET @EndDate = '20150731 05:00:00.000'
SET NOCOUNT OFF
SELECT
DateTime, TagName, Value, Quality
FROM
DiscreteHistory
WHERE
DiscreteHistory.TagName IN ('KDCE_S04_22PMP01_Machine.FA_RF')
AND DateTime >= @StartDate AND DateTime <= @EndDate 如果我导出到csv:(我缩短了它),它将返回这个输出。
DateTime,TagName,Value,Quality
2015/07/01 05:00:00 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,133
2015/07/01 05:09:46 AM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/01 05:09:53 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/01 06:44:20 AM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/01 06:45:54 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/01 07:36:22 AM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/01 07:36:48 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/01 01:53:44 PM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/01 01:53:44 PM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/01 02:04:52 PM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/01 02:05:27 PM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/01 02:07:25 PM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/01 02:09:13 PM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/01 02:14:54 PM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/02 12:10:48 AM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/02 05:24:06 AM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/02 05:24:16 AM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/02 05:50:52 AM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/02 05:50:59 AM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/02 06:00:15 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/02 06:55:18 AM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/02 06:55:18 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/02 09:46:58 AM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/02 09:46:58 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/02 01:30:27 PM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/02 01:30:27 PM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/02 05:38:03 PM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/02 07:01:56 PM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/03 03:41:09 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/03 09:05:18 AM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/03 10:42:00 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/03 10:57:31 AM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/03 04:53:36 PM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/04 10:08:17 PM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/05 06:43:50 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/05 09:43:08 AM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/05 01:04:03 PM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/06 09:37:53 AM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/06 11:07:15 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/06 11:29:48 AM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/06 05:02:38 PM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/07 06:15:33 AM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/07 06:32:24 AM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/07 09:05:20 AM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/07 01:10:09 PM,KDCE_S04_22PMP01_Machine.FA_RF,(null),1
2015/07/07 01:10:16 PM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/07 04:45:12 PM,KDCE_S04_22PMP01_Machine.FA_RF,0,0
2015/07/07 08:19:40 PM,KDCE_S04_22PMP01_Machine.FA_RF,1,0
2015/07/07 09:01:35 PM,KDCE_S04_22PMP01_Machine.FA_RF,0,0发布于 2015-09-01 04:48:18
好的,上面编辑的脚本现在运行得很好,基本上我有下面每个时间段(峰值、标准和非峰值)的三种代码变体。
唯一的问题是,如果在PLC和历史学家/SQL数据库之间存在网络通信问题,那么您将“松散”数据,最终会在数据库中得到大量的“空”读数。这就是为什么时间没有加起来。更好的方法是以SCADA IO标签为代价,在PLC中实现这一功能。
尽管如此,下面的脚本仍然有效。
-- this script only gets the total off-peak time hours
SET NOCOUNT ON
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
DECLARE @var1 REAL;
DECLARE @var2 REAL;
DECLARE @var3 REAL;
SET @StartDate = '2015/08/01 05:00:00.000'
SET @EndDate = GetDate()
SET NOCOUNT OFF
SET @var1 =
(
SELECT
'Count' = Count(DiscreteHistory.Value)/60.0
FROM
DiscreteHistory
WHERE
DiscreteHistory.TagName
IN ('KDCE_S04_22PMP01_Machine.FA_RF')
AND DiscreteHistory.Value = 1
AND wwRetrievalMode = 'Cyclic'
AND wwResolution = 60000
AND DateTime >= @StartDate
AND DateTime <= @EndDate
AND DATEPART(dw, DateTime) NOT IN (2, 3, 4, 5, 6, 7)
)
SET @var2 =
(
SELECT
'Count' = Count(DiscreteHistory.Value)/60.0
FROM
DiscreteHistory
WHERE
DiscreteHistory.TagName
IN ('KDCE_S04_22PMP01_Machine.FA_RF')
AND DiscreteHistory.Value = 1
AND wwRetrievalMode = 'Cyclic'
AND wwResolution = 60000
AND DateTime >= @StartDate
AND DateTime <= @EndDate
AND DATEPART(dw, DateTime) NOT IN (1, 2, 3, 4, 5, 6)
AND (CAST(DateTime as time) >= '20:00:00' AND CAST(DateTime as time) < '07:00:00')
)
SET @var3 =
(
SELECT
'Count' = Count(DiscreteHistory.Value)/60.0
FROM
DiscreteHistory
WHERE
DiscreteHistory.TagName
IN ('KDCE_S04_22PMP01_Machine.FA_RF')
AND DiscreteHistory.Value = 1
AND wwRetrievalMode = 'Cyclic'
AND wwResolution = 60000
AND DateTime >= @StartDate
AND DateTime <= @EndDate
AND DATEPART(dw, DateTime) NOT IN (1, 2, 3, 4, 5, 6)
AND (CAST(DateTime as time) >= '12:00:00' AND CAST(DateTime as time) < '18:00:00')
)
IF @var1 IS NULL SET @var1 = 0
IF @var2 IS NULL SET @var2 = 0
IF @var3 IS NULL SET @var3 = 0
SELECT
'Count' = (Count(DiscreteHistory.Value)/60.0) + @var1 + @var2 + @var3
FROM
DiscreteHistory
WHERE
DiscreteHistory.TagName
IN ('KDCE_S04_22PMP01_Machine.FA_RF')
AND DiscreteHistory.Value = 1
AND wwRetrievalMode = 'Cyclic'
AND wwResolution = 60000
AND DateTime >= @StartDate
AND DateTime <= @EndDate
AND DATEPART(dw, DateTime) NOT IN (1, 7)
AND (CAST(DateTime as time) >= '22:00:00' OR CAST(DateTime as time) < '06:00:00'); 发布于 2016-07-17 00:35:21
我不知道您是否还需要这个主题的帮助,但是我们实际上使用事件系统来触发当我们的泵没有运行时,并将记录插入到我们自己的表中。这个表有一个触发器,它将0和1扁平化为单个记录,从而使分析数据变得更加容易。我们的数据库的一个示例记录如下所示:
brake_start_time | brake_end_time | (downtime calculation) | (uptime before it broke) | reasons why it stopped working | comments使用类似的概念,您可以简单地拥有以下内容
pump_start_time | pump_end_time | runtime | run_category ( standard time, peak time and off-peak time )https://stackoverflow.com/questions/31785157
复制相似问题