WinCC OA Tutorial. Teil 4. Wiederverwendung von Objekten. $ -Parameter

Im vorherigen Teil haben wir die Visualisierung des Ventils abgeschlossen und ein einfaches Skript erstellt, das sein Verhalten simuliert.





Wir haben ein Panel namens Flap, das Befehle fΓΌr ein Ventil anzeigt und sendet - Flap1. Dieser Datenpunkt wird in allen Skripten in diesem Bereich angegeben. Es stellt sich natΓΌrlich die Frage, was zu tun ist, wenn mehr als ein Ventil vorhanden ist. Und nicht einmal zwei. Und mehrere Zehn, Hunderte und sogar Tausende (fΓΌr ein verteiltes System WinCC OA und mehrere Millionen Signale sind kein Hindernis, wir schauen uns den Large Hadron Collider an, in dem dieses System verwendet wird, und wir beneiden).





Die naheliegende Option besteht darin, mehrere Zehntausende, Hunderttausende von Panels zu erstellen, in denen jeder Datenpunkt explizit angegeben wird. Wir schieben ihn beiseite - er ist lang, mΓΌhsam und droht bei den geringsten Γ„nderungen, die wΓ€hrend des NDP unvermeidlich sind, mit enormen Arbeitskosten.





Eine andere Option, aber nicht die einzige, besteht darin, eine Vorlage basierend auf einem vorhandenen Panel zu erstellen. Erstellen Sie eine Kopie des vorhandenen Klappenbedienfelds, indem Sie den MenΓΌpunkt Bedienfeld β†’ Bedienfeld speichern unter auswΓ€hlen. Setzen wir den Namen Panel_ref.pnl (die Endung _ref impliziert eine Referenz, d. H. Einen Link oder, wenn Sie mΓΆchten, eine Vorlage)





Γ–ffnen wir das Flap_ref-Bedienfeld (es sollte nach dem Speichern trotzdem geΓΆffnet sein). Lassen Sie uns die Panel-Skripte bearbeiten, indem Sie im MenΓΌ Bearbeiten β†’ Panel-Skripte bearbeiten wΓ€hlen. Es ΓΆffnet sich ein Fenster mit allen Skripten aller grafischen Grundelemente dieses Bedienfelds.





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





Ziehen und loslassen
Drag'n'drop

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





Alles arbeitet

Flap2





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





Das zweite Ventil funktioniert nicht

, . , , -. dpConnect callback-, callback-. .





Control Manager (, Β«-num 2Β»). , .





Aufgrund der Tatsache, dass wir eine Konfiguration mit einer auf die DPE-Position eingestellten Funktion haben, wird das dritte Ventil noch nicht auf dem Bildschirm angezeigt (tatsΓ€chlich habe ich es vergeblich in das Modell eingefΓΌhrt).








All Articles