BaumimGarten
Level-1
- Beiträge
- 63
- Reaktionspunkte
- 0
For #i := 0 TO 50 DO
IF
"DBxy".rValue[#i] <> 4.0 //DB1 sind alles LReal
THEN
"DBxy".rValue[2] := 0;
Else
Exit;
End_IF;
End_FOR;
Nebenbei bemerkt könnte der Vergleich auf 4.0 ins leere laufen. Denn Dein Real-Wert hat wahrscheinlich nicht exakt 4.000000. Realwertvergleiche sollten nur mit >,<,>= oder <= gemacht werden. Ansonsten einen anderen Datentyp verwenden.
Komisch ist auch, dass Du ein Array-Element beschreibst anhand der Abfrage aller Array-Elemente. Das verstehe ich nicht.
Ist eh' ne grausame Struktur in Deinem DB!Das einzige was ich machen könnte wäre ein Array aus meinem Datensatz aber da müsste ich dann auch noch den vergleich im UDT machen, wenn ich nur einen Wert bei einem Motor ändern will
TYPE "typeMotor"
VERSION : 0.1
STRUCT
Cmd : Struct
Emergency : Bool;
Start : Bool;
END_STRUCT;
Val : Struct
Target : LReal;
Offset : LReal;
END_STRUCT;
END_STRUCT;
END_TYPE
DATA_BLOCK "gdbMotor"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
NON_RETAIN
VAR
Motor { S7_SetPoint := 'False'} : Array[0.."MOTOR_MAX"] of "typeMotor"; // MAX_MOTOR = globale Konstante in PLC-Variablen - Tabelle
END_VAR
BEGIN
END_DATA_BLOCK
FOR #i := 0 TO "MOTOR_MAX" BY 1 DO
IF "gdbMotor".Motor[#i].Val.Target <> 4.0
THEN
"gdbMotor".Motor[#i].Val.Offset := 0.0;
END_IF;
END_FOR;
Da stimme ich dir komplett zu, war auch nur ein schnell erstelltes Beispiel, was ungefähr auf meine Anwendung passtIst eh' ne grausame Struktur in Deinem DB!
Da macht es IMHO ohnehin Sinn, mal aufzuräumen.
Ja, warum wird das dann gemacht? Ich kann mir auch nicht vorstellen, dass die Mehrzahl der Kunden das will/kann.Und ja sry ich weiß es ist recht nervig dem Kunden so viele Freiheiten zugeben, da es für mich deutlich umständlicher wird
Struct Value
Struct Cmd1
Enabled : BOOL; // Es kann mit diesem Wert dieser Befehl ausgeführt werden
ActionValue : DINT; // Vergleichswert, wann der Befehl ausgeführt werden soll
Comparison : INT; // Ein Zahlenwert, der angibt, ob auf =/>/</>=/<= geprüft werden soll
Action : INT; // Ein Zahlenwert, der eine vordefinierte Aktion angibt oder eine Verknüpfung mit einem Gerät z.B.
End_Struct
Struct Cmd2
Enabled : BOOL; // Es kann mit diesem Wert dieser Befehl ausgeführt werden
ActionValue : DINT; // Vergleichswert, wann der Befehl ausgeführt werden soll
Comparison : INT; // Ein Zahlenwert, der angibt, ob auf =/>/</>=/<= geprüft werden soll
Action : INT; // Ein Zahlenwert, der eine vordefinierte Aktion angibt oder eine Verknüpfung mit einem Gerät z.B.
End_Struct
Struct Value
InUse : BOOL; // Dieser Wert ist eingestellt und soll im Programm benutzt werden
RAW : DINT; // Eingelesener Rohwert
Physical : REAL; // Umgerechnet auf Strom-/Spannungssignal
Phys_Unit : String(5); // Einheit mA / V
InputType : INT; // Ein Zahlenwert, der den Eingangstyp der Karte angibt, über eine zugehörige Tabelle kann dann die Skalierung automatisch erfolgen
Scaled : REAL; // Der umgerechnete Meßwert
Scaled_Unit : String(5); // Einheit des Meßwerts, z.B. "°C"
Name : String; // Name des Wertes, bspw. "Außentemperatur"
Struct Scaling
Factor : REAL; // Faktor zur Umrechnung des Meßwerts
Offset : REAL; // Offset zur Umrechnung des Meßwerts
End_Struct
End_Struct
End_Struct
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?