La dernière fois, nous avons fini par créer un type de point de données (DPT Flap) et trois instances de point de données (DPs Flap1, Flap2, Flap3). Il est temps de passer au composant visuel de l'interface opérateur. Ouvrez le module gedi. Dans gedi, nous voyons le nom de notre projet dans l'arborescence et ses composants. Nous nous intéressons désormais aux «panels», nous les développons donc.
, . , «Add new panel».
— Flap.pnl, .
«» — , : pnl xml. Xml ( , WinCC OA ), . gedi, . «save as» ( — , ). Flap.pnl:
, ,
gedi , .
, , . , «Background color».
.
, , RGB. , , . , RGB, More, () , . blue.
- «»
-. ( — ).
(, ). . .. « » (reference point). ( , ). «Rotation» 90, .
, ( , ). Rotation . reference point , .
Rotation. «», «».
Save Save and run, .
— DPE Position DP Flap. «», ( ) Initialize «Open property wizard» .
Rotate object
DPE Flap1.Inputs.Position, «» «», Next, «Finish»
Save and run . DPE Flap1.Inputs.Position 11, .
para Flap1.Inputs.Position._original 90, «»
«Initialize» «». Open script editor:
// SimpleCtrlScriptStart {valid}
main()
{
EP_setRotation();
}
void EP_setRotation()
{
dyn_errClass err;
if( !dpExists( "System1:Flap1.Inputs.Position:_online.._value") )
{
setValue("", "color", "_dpdoesnotexist");
return;
}
dpConnect("EP_setRotationCB",
"System1:Flap1.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:Flap1.Inputs.Position}
// DPConfig {:_online.._value}
// DPType {int}
// PVSSRange {0}
// Min {0}
// Max {90}
// MinRotation {0}
// MaxRotation {90}
// SimpleCtrlScriptEnd {EP_setRotation}
, — . , Wizard. , WinCC OA, — , «», . , C. WinCC OA Control.
. , main(), « » , .
main()
{
EP_setRotation();
}
main() — EP_SetRotation(). .
void EP_setRotation()
{
dyn_errClass err;
if( !dpExists( "System1:Flap1.Inputs.Position:_online.._value") )
{
setValue("", "color", "_dpdoesnotexist");
return;
}
dpConnect("EP_setRotationCB",
"System1:Flap1.Inputs.Position:_online.._value");
err = getLastError();
if (dynlen(err) > 0)
setValue("", "color", "_dpdoesnotexist");
}
, . (, DPE) , «». dpConnect. , …
dpConnect!!!
. dpConnect «» — WinCC OA. , . , , , , , . WinCC OA, - . , !
dpConnect ?
dpConnect("EP_setRotationCB", "System1:Flap1.Inputs.Position:_online.._value");
-, Callback- EP_setRotationCB ( ). -, - EP_setRotationCB System1:Flap1.Inputs.Position:_online.._value, , . , , (EV). , , DPE Position Flap1 . , , .
MQTT, S7-1200. . . — . . UI ( dpConnect). , callback-. , , . , , , .. (), dpConnect .
, . main EP_SetRotation. main . EP_SetRotation, , DPE , . — - ? — dpConnect () , , -. , , , . , WinCC OA — , . , , , .
callback-
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);
}
— ( ), . — . DPE, .
setValue. :
( ) — , . ( );
(rotation) — , , , … «» «» ( WinCC );
(fRotation) — .
- , Shape, (GetShape) . .
, , , , .
— . WinCC OA, . Push Button «Button label»
Open. Clicked Script Editor. dpSet, , :
— DPE, DPE. Tools→Datapoint Selector .
Flap1.Inputs.Position. , , . «» — 90 ( ). . . , — . ? . , , , , dpExists.
Close. — DPE Position 90, 0. Save and run .
dpSet. , , .
dpSet("System1:Flap1.Inputs.Position", 90);
… ( )
System1:Flap1.Inputs.Position:= 90;
. ui. DPE EV. ui EV TCP/IP. dpSet — , ui EV. ( ) — . ? , ? (", " () ). ? ? ? ui EV , . . . . , , WinCC OA , .
Quelle est la bonne chose Ă faire? Il est correct d'envoyer plusieurs affectations avec un seul appel Ă la fonction dpSet. Par exemple, au lieu de trois appels:
dpSet ("System1: Flap 1 .Inputs.Position", 90);
dpSet ("System1: Flap 2 .Inputs.Position", 90);
dpSet ("System1: Flap 3 .Inputs.Position", 90);
faire un appel
dpSet ("System1: Flap 1 .Inputs.Position", 90, "System1: Flap 2 .Inputs.Position", 90, "System1: Flap 3 .Inputs.Position", 90);