Canopus231171
Level-1
- Beiträge
- 70
- Reaktionspunkte
- 1
-> Hier kostenlos registrieren
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: This feature may not be available in some browsers.
Ich habe vergessen zu erwähnen das der Datentyp einmal zur IBN festgelegt wird dann nie wieder, der Kunde hat aber keine Möglichkeit in unsere Bausteine zu ändern..
FUNCTION "SKAL" : Void
TITLE = 'scaling Peripherical Input words'
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : VoR
FAMILY : Peripher
NAME : W_skal_R
VERSION : 1.6
// Input will be converted directly from PEW to AUSG_REAL and AUSG_INT
// the Linearity is calculatet from UGR_IN to UGR_Out and OGR_IN to OGR_OUT
VAR_INPUT
EING : Variant; // Input. IF Word then PEW scal unipolar
OGR_IN : Real; // Upper limit input in format REAL
UGR_IN : Real; // Lower limit input in format REAL
UGR_OUT : Real; // Lower Output = Lower Input
OGR_OUT : Real; // Upper Output = Upper Input
INT_FACTOR : Real; // Faktor for the Integer Input (Normaly 10.0) means 13.7 REAL out is 137 for INT
OBJ_AH : Bool; // Manualoverride aktiv inaktiv
END_VAR
VAR_OUTPUT
FE : Bool; // Fehler bei PEW Wandlung
END_VAR
VAR_IN_OUT
AUSG : Variant; // Output scaled (Format REAL)
END_VAR
VAR_TEMP
OGR_IN_MAX : Bool; // Input >= Upper limit input
UGR_IN_MAX : Bool; // Input <= Upper limit input
EING_REAL : Real; // Input im format REAL
EING_WORD : Word;
EING_INT : Int;
LIMIT_R : Real; // limited input (for calculation)
LIM_X_UG : Real; // temporary VAR for limiter
LIM_X_OG : Real; // Dito
Status : Word;
Ausg_REAL : Real;
EING_REAL_PEW : Real;
END_VAR
BEGIN
CASE TypeOf(#EING) OF
Word: // Wenn Wort, dann behandeln wie einen Analogeingang
VariantGet(SRC := #EING,
DST => #EING_WORD);
#Status := SCALE(IN := WORD_TO_INT(#EING_WORD), HI_LIM := #OGR_OUT, LO_LIM := #UGR_OUT, BIPOLAR := 0, OUT => #EING_REAL_PEW);
#FE := #Status <> 0;
Int: // Wenn Int dann in REAL wandeln
VariantGet(SRC := #EING,
DST => #EING_INT);
#EING_REAL := INT_TO_REAL(#EING_INT);
#FE := 0;
Real: // Wenn Real dann So übernehmen
VariantGet(SRC := #EING,
DST => #EING_REAL);
#FE := 0;
ELSE
#FE := 1;
#Status := 12; // Nicht unterstütztes Format
END_CASE;
(*sorting limits for calculation*)
IF #UGR_IN < #OGR_IN THEN
#LIM_X_UG := #UGR_IN;
#LIM_X_OG := #OGR_IN;
ELSIF #OGR_IN <= #UGR_IN THEN
#LIM_X_UG := #OGR_IN;
#LIM_X_OG := #UGR_IN;
END_IF;
(*input should be limited*)
#LIMIT_R := LIMIT(MN := #LIM_X_UG, IN := #EING_REAL, MX := #LIM_X_OG);
(*calculating limited data*)
IF NOT #OBJ_AH THEN
IF NOT (TypeOf(#EING) = Word) THEN
#Ausg_REAL := ((#OGR_OUT - #UGR_OUT) / (#OGR_IN - #UGR_IN)
* #LIMIT_R
+ (#OGR_OUT - (#OGR_OUT - #UGR_OUT)
/ (#OGR_IN - #UGR_IN) * #OGR_IN));
ELSE
#Ausg_REAL := #EING_REAL_PEW;
END_IF;
CASE TypeOf(#AUSG) OF
Real:
VariantPut(SRC := #Ausg_REAL,
DST := #AUSG);
Int:
VariantPut(SRC := REAL_TO_INT(#INT_FACTOR * #Ausg_REAL),
DST := #AUSG);
END_CASE;
END_IF;
END_FUNCTION
TYPE "SIG_HW_FLS"
VERSION : 0.1
STRUCT
DI : Struct
Signal_nicht_Ein : Bool;
Reservelampe_Ein : Bool;
Stromueberwachung : Bool;
END_STRUCT;
DA : Struct
gruen : Bool;
rot : Bool;
links : Bool;
rechts : Bool;
END_STRUCT;
END_STRUCT;
END_TYPE
TYPE "SIG_HW_VA"
VERSION : 0.1
STRUCT
DI : Struct
Stromueberwachung : Bool;
END_STRUCT;
DA : Struct
gruen : Bool;
rot : Bool;
gelb : Bool;
END_STRUCT;
END_STRUCT;
END_TYPE
TYPE "typSignal"
VERSION : 0.1
STRUCT
Soll : Int := -1; // Sollwert für Signal
Ist : Int; // Istwert von Signal
Alert : Array[0..10] of Bool;
END_STRUCT;
END_TYPE
FUNCTION "OBJ_Sig" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
HW : Variant;
END_VAR
VAR_IN_OUT
Sig : "typSignal";
END_VAR
VAR_TEMP
FLS : "SIG_HW_FLS";
VA : "SIG_HW_VA";
END_VAR
BEGIN
CASE TypeOf(#HW) OF
SIG_HW_FLS:
VariantGet(SRC:=#HW,
DST=>#FLS);
#Sig.Alert[2] := #FLS.DI.Reservelampe_Ein;
#Sig.Alert[3] := #FLS.DI.Signal_nicht_Ein;
#Sig.Alert[4] := NOT #FLS.DI.Stromueberwachung;
CASE #Sig.Soll OF
1:
#FLS.DA.gruen := true;
#FLS.DA.rot := false;
#FLS.DA.links := false;
#FLS.DA.rechts := false;
2:
#FLS.DA.gruen := false;
#FLS.DA.rot := false;
#FLS.DA.links := true;
#FLS.DA.rechts := false;
END_CASE;
VariantPut(SRC:=#FLS,
DST:=#HW);
SIG_HW_VA:
VariantGet(SRC:=#HW,
DST=>#VA);
#Sig.Alert[2] := NOT #VA.DI.Stromueberwachung;
CASE #Sig.Soll OF
1:
#VA.DA.gruen := false;
#VA.DA.rot := true;
#VA.DA.gelb := false;
2:
#VA.DA.gruen := false;
#VA.DA.rot := true;
#VA.DA.gelb := true;
3:
#VA.DA.gruen := TRUE;
#VA.DA.rot := false;
#VA.DA.gelb := false;
END_CASE;
VariantPut(SRC := #VA,
DST := #HW);
END_CASE;
END_FUNCTION
Ich würde mich jetzt soweit ausdem Fenster lehnen und sagen Variantarbeiten (VARIANT PUT/GET TYPEOF) brauchen ca 50% mehr Zeit wie die einfache Zuweisung.
Eher Vernachlässigbar.
Da es bei Dir sehr viele Werte betrifft, welche ihren Datentyp ändern sollen (auch viele interne Variablen), und weil es nicht damit getan ist, einen DINT einfach auf eine REAL-Variable zu kopieren, nochmal der Tipp: Erstelle 2 Versionen des FC und gut ist's.Nochmal zu dem Thema zurück zu kommen,
kann mir mal jemand verraten wie ich nun die Werte aus Projekt in den Kundenbereich kopieren kann??? Entweder Kunde Real oder DINT.
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen