Dans le processus de création du modèle de comportement de la vanne, nous avons créé (et modifié dans la dernière partie) un script de modèle, dans lequel il y avait plusieurs appels dpConnect et plusieurs fonctions de rappel. Ensuite, j'ai écrit que c'était une "voie rapide mais fausse". Cette pause était nécessaire pour se familiariser avec la fonction dpQuery. Je propose de revenir un peu en arrière et d'implémenter le modèle lentement et de manière très ennuyeuse correctement, en utilisant maintenant les fonctions de la famille dpQueryConnect. Ouvrons notre modèle de script.
// $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.