En la parte anterior completamos la visualizaciΓ³n de la vΓ‘lvula y creamos un sencillo script que simula su comportamiento.
Tenemos un panel llamado Flap, que muestra y envΓa comandos para una vΓ‘lvula: Flap1. Este punto de datos se especifica en todos los scripts de este panel. Surge una pregunta natural: ΒΏquΓ© hacer si hay mΓ‘s de una vΓ‘lvula? Y ni siquiera dos. Y varias decenas, cientos e incluso miles (para un sistema distribuido WinCC OA y varios millones de seΓ±ales no son un obstΓ‘culo, miramos el Gran Colisionador de Hadrones, donde se usa este sistema, y ββlo envidiamos).
La opciΓ³n obvia es crear varias decenas, cientos y miles de paneles, donde cada punto de datos se da explΓcitamente, lo barremos a un lado: es largo, problemΓ‘tico y amenaza con enormes costos laborales en caso de los cambios mΓ‘s mΓnimos que son inevitables durante el NDP.
Otra opciΓ³n, pero no la ΓΊnica, es crear una plantilla basada en un panel existente. Creemos una copia del panel Flap existente seleccionando el elemento de menΓΊ Panel β Guardar panel como. Establezcamos el nombre Panel_ref.pnl (el final _ref implica una referencia, es decir, un enlace o, si lo desea, una plantilla)
Abramos el panel Flap_ref (deberΓa estar abierto de todos modos despuΓ©s de guardar). Editemos los scripts del panel eligiendo Editar β Editar scripts del panel en el menΓΊ. Se abrirΓ‘ una ventana que contiene todos los scripts de todas las primitivas grΓ‘ficas de este panel.
, , . , .. : Flap1, Flap2 Flap3 . , , Flap1 , $- ( Β«-Β»). Find&Replace . .
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β// [RECTANGLE3] [3] - [Initialize]
// SimpleCtrlScriptStart {invalid}
main()
{
EP_setRotation();
}
void EP_setRotation()
{
dyn_errClass err;
if( !dpExists( "System1:" + $dp + ".Inputs.Position:_online.._value") )
{
setValue("", "color", "_dpdoesnotexist");
return;
}
dpConnect("EP_setRotationCB",
"System1:" + $dp + ".Inputs.Position:_online.._value");
err = getLastError();
if (dynlen(err) > 0)
setValue("", "color", "_dpdoesnotexist");
}
void EP_setRotationCB(string dp1, int iNewValue)
{
float MIN_VALUE = 0;
float MAX_VALUE = 90;
float MIN_ROTATION = 0;
float MAX_ROTATION = 90;
float fRotation;
fRotation = ( 1.0 * (MAX_ROTATION - MIN_ROTATION) / (MAX_VALUE - MIN_VALUE)) *
(iNewValue - MIN_VALUE) + MIN_ROTATION;
if (fRotation > MAX_ROTATION) fRotation = MAX_ROTATION;
else if (fRotation < MIN_ROTATION) fRotation = MIN_ROTATION;
setValue("", "rotation", fRotation);
}
// SimpleCtrlScript {EP_setRotation}
// DP {System1:" + $dp + ".Inputs.Position}
// DPConfig {:_online.._value}
// DPType {int}
// PVSSRange {0}
// Min {0}
// Max {90}
// MinRotation {0}
// MaxRotation {90}
// SimpleCtrlScriptEnd {EP_setRotation}
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β// [PUSH_BUTTON1] [4] - [Clicked]
main(mapping event)
{
dpSet("System1:" + $dp + ".Commands.Open", 1, "System1:" + $dp + ".Commands.Close", 0);
}
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β// [PUSH_BUTTON2] [5] - [Clicked]
main(mapping event)
{
dpSet("System1:" + $dp + ".Commands.Open", 0, "System1:" + $dp + ".Commands.Close", 1);
}
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
:
System1:Flap1.Inputs.Position:online..value
:
System1:" + $dp + ".Inputs.Position:online..value
, , (System1), $dp, , , .. β . + . . , , . $dp (Flap2, ) .
, $- . , , .
. Flaps. .
Flap_ref Flaps. $- β .
, $dp Flap1. Β«Save and Run in QuickTest ModeΒ» , 1 Open Close β , . , -, , ( , , , , ).
Flap2
. (), - . ? , ( ) Flap1. .
, . , , -. dpConnect callback-, callback-. .
Control Manager (, Β«-num 2Β»). , .
Debido al hecho de que tenemos una configuraciΓ³n con una funciΓ³n establecida en la PosiciΓ³n DPE, la tercera vΓ‘lvula aΓΊn no se muestra en la pantalla (de hecho, en vano la agreguΓ© al modelo).