Tutorial de WinCC OA. Parte 4. ReutilizaciΓ³n de objetos. $ -parΓ‘metros

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. $- β€” .





Arrastrar y soltar
Drag'n'drop

, $dp Flap1. Β«Save and Run in QuickTest ModeΒ» , 1 Open Close β€” , . , -, , ( , , , , ).





Todo funciona

Flap2





. (), - . ? , ( ) Flap1. .





La segunda vΓ‘lvula no funciona

, . , , -. 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).








All Articles