WinCC OA Tutorial. Teil 9. Steuerungsskript. Nicht schnell, aber richtig. Vollständiger UI-Start

Bei der Erstellung des Ventilverhaltensmodells haben wir ein Modellskript erstellt (und im letzten Teil geändert), in dem mehrere dpConnect-Aufrufe und mehrere Rückruffunktionen vorhanden waren. Dann schrieb ich, dass dies ein "schneller, aber falscher Weg" ist. Diese Pause war notwendig, um sich mit der Funktion dpQuery vertraut zu machen. Ich schlage vor, ein wenig zurückzugehen und das Modell langsam und sehr langweilig  korrekt zu implementieren  , wobei ich jetzt Funktionen der dpQueryConnect-Familie verwende. Öffnen wir unser Skriptmodell.





// $License: NOLICENSE
//--------------------------------------------------------------------------------
/**
  @file $relPath
  @copyright $copyright
  @author akcou
*/

//--------------------------------------------------------------------------------
// Libraries used (#uses)

//--------------------------------------------------------------------------------
// Variables and Constants

//--------------------------------------------------------------------------------
/**
*/
main()
{
  dpConnect("OnOpen_CB1", "System1:Flap1.Commands.Open");
  dpConnect("OnOpen_CB2", "System1:Flap2.Commands.Open");
  dpConnect("OnOpen_CB3", "System1:Flap3.Commands.Open");

  for (;;) {
    dpSet("System1:Flap1.Inputs.Flow", rand());
    dpSet("System1:Flap2.Inputs.Flow", rand());
    delay(1);
  }
}

void OnOpen_CB1(string dp1, bool bNewValue)
{
  if (bNewValue)  {
    dpSet("System1:Flap1.Inputs.Position", 90);
  } else {
    dpSet("System1:Flap1.Inputs.Position", 0);
  }
}

void OnOpen_CB2(string dp1, bool bNewValue)
{
  if (bNewValue)  {
    dpSet("System1:Flap2.Inputs.Position", 90);
  } else {
    dpSet("System1:Flap2.Inputs.Position", 0);
  }
}

void OnOpen_CB3(string dp1, bool bNewValue)
{
  if (bNewValue)  {
    dpSet("System1:Flap3.Inputs.Position", 90);
  } else {
    dpSet("System1:Flap3.Inputs.Position", 0);
  }
}

      
      



dpConnect DPE, . dpQueryConnect . , SQL-. , SQL-, : Flap1, Flap2 Flap3. — dpQueryConnectSingle dpQueryConnectAll. - . , . , , DPE . «» , .





, WinCC OA , — , . , , dpQueryConnectSingle . . , Flap4. Flap4 , . , . « ». , , . «», ( Flap1, Flap2, Flap3), ( 4 ). .





«» . SQL-query .





Model main





main()
{
  dpQueryConnectSingle("OnOpenAll_CB",FALSE, "", "SELECT '_original.._value' FROM 'Flap*.Commands.Open'");

  //dpConnect("OnOpen_CB1", "System1:Flap1.Commands.Open");
  //dpConnect("OnOpen_CB2", "System1:Flap2.Commands.Open");
  //dpConnect("OnOpen_CB3", "System1:Flap3.Commands.Open");

  for (;;) {
    dpSet("System1:Flap1.Inputs.Flow", rand());
    dpSet("System1:Flap2.Inputs.Flow", rand());
    delay(1);
  }
}

      
      



dpConnect . dpQueryConnectSingle. OnOpenAll_CB.





. callback- . , , SQL-. , , , , -, , .





— . FlapX, X — . , Position FlapX. , «» . — .





sDPE — , System1:Flap2.Commands.Open





bNewValue — , true false





split — DPE , , , System1:Flap2





« » , , .





OnOpenAll_CB(string s, dyn_dyn_anytype ddaTab)
{ //ddaTab contains DPE and the changed value
  int z; // 
  string sDPE; //  ,   
  dyn_string split; //  DPE
  bool bNewValue; //  
  for(z=2;z<=dynlen(ddaTab);z++) //  ,    -   
  {
    sDPE = ddaTab[z][1]; // DPE,     -  DPE ,  System1:FlapX.Commands.Open
    bNewValue = ddaTab[z][2]; //  ,   
    split = strsplit(sDPE, "."); //  DPE   ,    ,  System1:FlapX
    //DebugN("AGK", sDPE, bNewValue);
    //DebugN("AGK", split);
    if (bNewValue)  { //  ""
      dpSet(split[1] + ".Inputs.Position", 90); //  Position  90 
    } else {
      dpSet(split[1] + ".Inputs.Position", 0); //   
    }
  }
}

      
      



, , Main , .





, . Main QuickTest , . , . ui-.





User Interface. 2 (-num 2), ui — , . , «-p Main.pnl» — , . (always). ui.












All Articles