上一次我们最终创建一个数据点类型(DPT Flap)和三个数据点实例(DP Flap1,Flap2,Flap3)。现在该转到操作员界面的可视组件了。打开gedi模块。在gedi中,我们在树及其组件中看到了项目的名称。现在,我们对“面板”感兴趣,因此我们对其进行了扩展。
, . , «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 , .
正确的做法是什么?一次调用dpSet发送多个分配是正确的。例如,而不是三个调用:
dpSet(“ System1:Flap 1 .Inputs.Position”,90);
dpSet(“ System1:Flap 2 .Inputs.Position”,90);
dpSet(“ System1:Flap 3 .Inputs.Position”,90);
打个电话
dpSet(“ System1:Flap 1 .Inputs.Position”,90,“ System1 :Flap 2 .Inputs.Position”,90,“ System1 :Flap 3 .Inputs.Position”,90);