WinCC OA教程。第2部分。gedi图形编辑器和dpConnect函数简介

上一次我们最终创建一个数据点类型(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.

选择蓝色
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);




All Articles