Escribir reglas de selección personalizadas
Lógica de la regla de selección
Antes de crear reglas de selección personalizadas y escribir las correspondientes funciones, debe comprender la lógica que utiliza la función en cuestión. Cuando un recurso pasa a estar disponible, se invoca la función de selección. Las colas de solicitud se encuentran en listas internas del respectivo recurso que secuencia inicialmente la regla de secuencia.
Cuando se invoca la función, vuelve a organizar esta lista y devuelve el número máximo de solicitudes que se van a tener en cuenta en el proceso de asignación. Si se ordena la lista completa, devuelve el tamaño de la lista. Por tanto, si el número de solicitudes devueltas es menor que el tamaño de la lista, la lista ordenada para asignación podría ser solo parte de la cola de solicitudes.
El proceso de asignación comienza con un intento de reiniciar la operación de la primera solicitud de la lista ordenada para asignación, que requiere el número de unidades disponibles o un valor inferior. Si falla el proceso de asignación, se considera la siguiente solicitud de la lista ordenada para el número de unidades disponibles o un valor inferior. Se consideran solicitudes sucesivas en la lista ordenada para asignación hasta que se hayan asignado las unidades disponibles o se llegue al final de la lista. Si existen unidades disponibles tras considerar la última solicitud, estas quedarán inactivas.
Denominar la función
La función de selección personalizada puede tener cualquier nombre que no sea un nombre de función estándar invocable por el usuario.
Arguments
#include "factor.h"
int myrule(rp)
RESRC *rp; /* pointer to the resource */
La función de selección acepta como su único argumento un indicador al componente para el que esté realizando la selección, que es un recurso (Type: RESRC *).
Valor de devolución
La función devuelve un valor (Type: int) que es el número máximo de solicitudes que se van a procesar.
A continuación presentamos un ejemplo de una función de selección de recursos en función de una configuración mínima:
int slrl (RESRC *rp)
/*-----------------------------------------------------------------
Selection function to process a resource request list by using
the minimum setup time for this resource on the first downstream
setup operation for each load. Loads that have no downstream setup
operation are assumed to have a setup time of zero.
NOTES:
* The estimate flag is set to false for jscmsu so that it will
use the current conditions to find the setup time. Since the
operation could be downstream, there is no guarantee that the
current conditions for the resource in question will still
be appropriate when the setup actually occurs. Therefore,
this rule should only be used when the structure of the model
guarantees that the conditions for the downstream resource
will be constant till the setup occurs.
ARGS:
rp - pointer to resource to resequence
RETURNS: number of requests in the request list
-----------------------------------------------------------------*/
{
RREQ *rq;
JOBSTEP *jsp;
int i;
for ( rq = (RREQ *) csfsls(rp->rsrqls);
rq != NULL;
rq = (RREQ *) csnxls((CSENTITY *) rq) )
{
/* Find first downstream setup operation. */
for ( jsp = rq->rrload->lojspt, i = 0;
jsp != NULL && jsp->jstype != 4 &&
jsp->jstype != 13 && jsp-jstype != 19 && i < 1000;
jsp = jsp->jspnxt, i++);
/* Compute setup time (zero if no setup operation). */
if (jsp == NULL || i >= 1000)
{
rq->rrprio = 0.0;
}
else
{
/* Place a tag for the resource. This allows the step
time to be computed properly for the downstream
operation assuming that the load allocates the
resource before any other load. */
dumrtag->rtrsrc = rp;
cspols(rq->rrload->lorsls, (CSENTITY *) dumrtag, CSLIFO, NULL);
rq->rrprio = jscmsu(0, rq->rrload, jsp);
csgpls(rq->rrload->lorsls, (CSENTITY *) dumrtag);
}
}
/*Sort list based on rankings.*/
cssols (rp->rsrqls, serqor);
/*return number in list*/
return (csszls(rp->rsrqls));
}
Instalación de la función personalizada
Para poner la función de selección de recursos personalizada a disponibilidad del programador, debe "instalarla" desde ucini1 invocando a la función sedfsl. Esta función tiene dos argumentos en el siguiente orden:
- El número de la regla de selección para la que la función contiene lógica personalizada.
- La dirección de la función de selección.
Por ejemplo, para instalar la regla del ejemplo anterior "slrl" en la posición de regla 39:
sedfsl (39, slrl);
Si utiliza una de las reglas de selección "dinámicas" proporcionadas, el sistema ignorará la regla de secuencia y usará Primero Entra Primero Sale (PEPS). Si escribe una regla de selección dinámica, también debe emular el sistema y formar el uso de PEPS. Para ello, invoque la función setosq en la lista de solicitudes aplicable.