编写定制排序规则
要排列请求队列,将每个排序规则的逻辑写入负荷等级函数。您可编写并安装定制负荷等级函数,按生产工序特有的规则进行队列排序。
顺序规则逻辑
在创建自己的负荷等级函数前,应该理解顺序规则处理请求的方法。当负荷放置请求时,负荷等级函数分配给请求一个等级值。等级值从不改变。
例如,假定按照在到期日期前的剩余时间排序规则将请求排列。在今天下午一点钟,在今天下午四点钟到期的一个负荷发出一个请求并分配了等级值 3。在今天下午三点钟,今天下午五点钟到期的一个负荷发出一个请求并接收了等级值 2。假定这些是队列中仅有的请求。假定在 3:30 满足了这些请求中的一个请求。所满足请求是等级值为 2 的请求,即使其在到期前还有 1.5 小时并且等级值为 3 的请求距到期仅有 0.5 小时。
按照等级值在从低至高表示队列的内部列表中对请求进行排序。通过将等级值乘以 -1 可按定制逻辑对换该顺序。例如,要为当前工序按照最长处理时间对负荷排序,等级函数将在其当前工序为负荷返回处理时间的负数。
命名函数
您的负荷等级函数可使用非标准的用户可调用函数名的任何名称。
自变量
#include "factor.h"
double myrule(ldp, atrib)
LOAD *ldp; /* pointer to the load. */
ATTRIBUTE *atr; /* pointer to attribute, if any, to base ranking on. */
函数必须按以下顺序接受两个自变量:
- 负荷 (类型:LOAD*)。
- 属性(类型:ATTRIBUTE)。
返回值
该函数必须返回值(类型:double),其为负荷的请求等级值。
此为一个负荷等级函数的示例,该函数按照最少动态闲置时间对负荷排序 (即,至到期日期的最少剩余时间减去剩余处理时间):
double sqrl (LOAD *ldp, ATTRIBUTE *atr)
/*-----------------------------------------------------------------
Ranking function to cause loads to be ranked on a least dynamic
slack basis.
ARGS:
ldp - pointer to load for which to evaluate the ranking code
RETURNS: load ranking value
-----------------------------------------------------------------*/
{
double rt, lt;
int rn;
rt = sermot(ldp, &rn, <);
return(ldp->loordp->ordudt - DATENOW - rt);
}
安装定制函数
要使定制函数对“排产器”可用,必须调用函数 sedfrk 从 ucini1 函数将其“安装”。函数 Sedfrk 必须按以下顺序使用两个自变量:
- 等级函数包括定制逻辑的排序规则数量。
- 负荷等级函数的地址。
例如,要在规则位置 39 安装以上示例规则“sqrl”:
sedfrk (39, sqrl);