我工作的生产模式,原料的投入是每小时的基础,我运行模型8小时(1班),所以基本上16小时,资源闲置。当我不使用调度部分并运行模型8 *7小时( 56小时)时,每个作业的时间度量都很好,但是现在,当我调度输出时,它也包括空闲时间。所以,我怎么才能计算出忙碌的时间来看一份工作在车间里平均花费的时间(从原材料到完成的时间)。
发布于 2021-09-06 15:30:57
首先,请注意:虽然您说您运行8小时轮班,但上午8点到下午6点的时间段实际上是10小时,所以我将在此解决方案中忽略它,而是假设班次实际上是8小时,从9:00到17:00运行。
下面是一个用于测试的简单模型(模型时间单位是秒):

要做到这一点,有四个要素:


f_calcTATsec函数中计算真实时间(不包括班次之间的死时间):// get 'Service' enter time for that agent
double startTime = col_startTimesSec.get(_agent);
// calculate time spent
double timeSpent = time() - startTime;
traceln("%.2f: agent spent %.2f in service", time(), timeSpent);
traceln("%.2f: 8hrs is %.2f, 16hrs is %.2f",
time(), (8 * hour()), (16 * hour()));
// below is a ternary statement which says:
// if 'timeSpent' is less than 8 hrs then use it
// otherwise
// exclude whole 16 hr periods (can be more than 1)
// and use the remainder
double trueTimeSpent = timeSpent <= (8 * hour()) ?
timeSpent :
timeSpent % (16 * hour());
// return time spent
traceln("%.2f: returning %.2f", time(), trueTimeSpent);
return trueTimeSpent;f_calcTATsec()函数,即On enter = col_startTimesSec.put(agent, time());和On exit = double trueTimeSpentSec = f_calcTATsec(agent);发布于 2021-09-07 16:31:11
当我不使用进度表部分并运行模型8 *7小时( 56小时)时,每个作业的时间度量都很好,但是现在当我调度输出时,它也包括空闲时间。
所以我想你是在用时间测量开始/结束块来进行系统时间测量。他们只计算从开始块到结束块的运行时间,因此永远不能计算“不应该计算的时间”。您不必使用这些块来计算时间;通常,您将相关的开始时间存储在流程中的(自定义)代理类型中,然后根据需要计算相关的运行时间(例如,在服务块的退出时,伪代码是“当前时间在入口上=块中经过的时间”)。
首先,您需要更清楚地了解您正在计算的度量以及计算原因。您希望排除正在进行的(可能是先发制人的)作业等待资源返回轮班的时间。但是,那些排队等待资源的工作又会怎样呢?如果有多种可能的资源可以用在不同的转换模式中呢?更普遍的工作等待资源(当资源处于轮班状态时)会怎样呢?
听起来你真正想要的是两者
后者只是总运行时间减去前者。
因此有多种方法来解决这个问题。可能最简单的方法可能是保留您的整个运行时间(通过Time测量开始/结束块),然后分别计算工作时间:将其作为变量存储在作业代理中,并将其添加到其“已完成的工作”的每个块中(例如,对于服务块,不需要抢占使用持续时间,从开始-抢占到打开-退出,延迟块使用持续时间从开始-进入-退出)。
要处理移位结束抢占任务等待资源返回轮班的情况,您可以使用Service块的"On任务暂停“和"On任务恢复”操作,这些操作会在任务挂起(由于抢占原因)或恢复时触发(当原始资源可用时,如果这是您选择的抢占选项)。
这需要一个额外的变量来存储“当前持续时间开始时间”。
明确地:
double变量cumulativeWorkingTimeMinsdouble Vriable currentWorkStartTimeMins服务块的...and (处理抢占情况)
agent.currentWorkStartTimeMins = time(MINUTE);的“On捕捉单元”(或“在进入延迟时”)动作agent.cumulativeWorkingTimeMins += (time(MINUTE) - agent.currentWorkStartTimeMins);的“任务暂停”行为agent.currentWorkStartTimeMins = time(MINUTE);的“关于任务恢复”的动作agent.cumulativeWorkingTimeMins += (time(MINUTE) - agent.currentWorkStartTimeMins);的“退出”作用注意在变量名称中指定的单元要清楚,并在获取当前时间时显式指定单元;这确保代码对更改模型时间单元具有鲁棒性。
NB:如果您真的想要减去抢占的作业等待下班资源返回的时间(而且没有其他等待时间)--作为一个度量标准,这似乎没有意义--您仍然可以使用上面的一个变量来完成这个任务,因为它只捕获了等待时间。
(作业完成后,还需要将相关的最终数字存储在某个HistogramData元素或类似元素中,以便能够在图表中显示这些数据:TimeMeasureEnd块会自动在其distribution变量中捕获该直方图数据,但在计算时间时,您需要自己存储图表的数据。)
https://stackoverflow.com/questions/69071587
复制相似问题