- Beiträge
- 2.654
- Reaktionspunkte
- 776
// Alarm High High
IF NOT #HH_Activ THEN
#HH_AL_Intern := false;
GOTO Jump_HH;
;
END_IF;
IF #AV_intern >= #Limit_HH THEN
#Running_Time_HH_Help_M := TRUE;
ELSE
#Running_Time_HH_Help_M := false;
;
END_IF;
#TIMER_HH(IN := #Running_Time_HH_Help_M,
PT := #Delay_HH);
IF #TIMER_HH.Q = true THEN
#HH_AL_Intern := true;
ELSIF (#ACK AND #Extern_ACK_Activ) OR ((#AV_intern < (#Limit_HH - #HYSTERYSE_HH) AND NOT #Extern_ACK_Activ))
THEN
#HH_AL_Intern := false;
;
END_IF;
Jump_HH:
// Analog
#LL_LIM_OUT := #Limit_LL;
#Comm_ZLT.Limit_LL := #Limit_LL;
//Alarm and BIT OUT and STATE
IF #LL_AL_Intern THEN
#LL_ALARM_OUT := true;
#STATE_HMI.LL_ALARM_OUT := true;
#Comm_ZLT.STATE.LL_ALARM_OUT := true;
ELSE
#LL_ALARM_OUT := false;
#STATE_HMI.LL_ALARM_OUT := false;
#Comm_ZLT.STATE.LL_ALARM_OUT := false;
;
END_IF;
Beim teil //Alarm High High, habe ich versucht die IF-Struktur zu verschachteln.
Ich denke, das geht nur so...Beim Teil //Analog will ich das #Limit_LL auf diverse andere stellen schreiben. Mus ich das #Limit_Ll dann bei jede Zuweisung abfragen oder geht das auch das mann nur 1 ml abfragt und dann auf die andere stellen schreibt.
Du kannst Dir theoretisch das IF sparen und den Wert #LL_AL_Intern direkt an die Variablen zuweisen. Wenn Du nichts Komplizierteres machen möchtest, wäre das ein 3zeiler.Beim Teil //Alarm and BIT OUT and STATE will ich das Bit #LL_AL_Intern auch weiter rangieren.
Muss man da so vorgehen wie ich gemacht hab ? (in der AWL komm ich mit 4 Zeilen zurecht)
Code vereinfachen heißt dann nicht unbedingt, daß er leserlicher wird. Da wir aus den Zeiten der notwendigen Codeoptimierungen ziemlich raus sind, schreibe ich oft eher eine Zeile mehr, wenn der Code dadurch verständlicher wird.Doch kommt die mir die frage auf ob solche (Einfache) Code noch zu vereinfachen ist.
IF #AV_intern >= #Limit_HH THEN
#Running_Time_HH_Help_M := TRUE;
ELSE
#Running_Time_HH_Help_M := false;
;
END_IF;
UndDu kannst Dir theoretisch das IF sparen und den Wert #LL_AL_Intern direkt an die Variablen zuweisen. Wenn Du nichts Komplizierteres machen möchtest, wäre das ein 3zeiler.
Code vereinfachen heißt dann nicht unbedingt, daß er leserlicher wird. Da wir aus den Zeiten der notwendigen Codeoptimierungen ziemlich raus sind, schreibe ich oft eher eine Zeile mehr, wenn der Code dadurch verständlicher wird.
Theoretisch könntest Du Dir in diesem Fall das
Code:
IF #AV_intern >= #Limit_HH THEN
#Running_Time_HH_Help_M := TRUE;
ELSE
#Running_Time_HH_Help_M := false;
;
END_IF;
sparen und die Bedingung in Klammern direkt an den Timereingang schreiben, da Du mit der Hilfsvariablen sonst nichts weiter machst
Da hab ich es einfach mal probiert, mit dem ziel die Code die zusammen gehört, zusammen in ein IF zu machen.Beim teil //Alarm High High, habe ich versucht die IF-Struktur zu verschachteln.
Wie springe ich im Hochsprache über stücke Programme wenn "GOTO" vermieden werden soll ?
// Alarm High High
IF NOT #HH_Activ THEN
#HH_AL_Intern := false;
ELSE
IF #AV_intern >= #Limit_HH THEN
#Running_Time_HH_Help_M := TRUE;
ELSE
#Running_Time_HH_Help_M := false;
;
END_IF;
#TIMER_HH(IN := #Running_Time_HH_Help_M,
PT := #Delay_HH);
IF #TIMER_HH.Q = true THEN
#HH_AL_Intern := true;
ELSIF (#ACK AND #Extern_ACK_Activ) OR ((#AV_intern < (#Limit_HH - #HYSTERYSE_HH) AND NOT #Extern_ACK_Activ))
THEN
#HH_AL_Intern := false;
;
END_IF;
END_IF;
IF #LL_AL_Intern THEN
#LL_ALARM_OUT := true;
#STATE_HMI.LL_ALARM_OUT := true;
#Comm_ZLT.STATE.LL_ALARM_OUT := true;
ELSE
#LL_ALARM_OUT := false;
#STATE_HMI.LL_ALARM_OUT := false;
#Comm_ZLT.STATE.LL_ALARM_OUT := false;
;
END_IF;
#LL_ALARM_OUT := #LL_AL_Intern;
#STATE_HMI.LL_ALARM_OUT := #LL_AL_Intern;
#Comm_ZLT.STATE.LL_ALARM_OUT := #LL_AL_Intern;
IF #AV_intern >= #Limit_HH THEN
#Running_Time_HH_Help_M := TRUE;
ELSE
#Running_Time_HH_Help_M := false;
;
END_IF;
#Running_Time_HH_Help_M := #AV_intern >= #Limit_HH;
Ja, ich hab gemeint immer in Else verwenden zu müssen.
Aber eine zweiteilige mit Sprungbefehlen sowie SET und Clear.Ein "IF ... THEN ... ELSE ... END_IF" ist eine Zuweisung(=).
Aber eine zweiteilige mit Sprungbefehlen sowie SET und Clear.
Eine reine Zuweisung wäre in meinen Augen das, was MasterOhh gepostet hat.
U E1.0
S M1.0
UN E1.0
R M1.0
U E1.0
= M1.0
IF E1.0 THEN
M1.0 := TRUE;
ELSE
M1.0 := FALSE;
END_IF;
M1.0 := E1.0;
Eines der "Probleme" mit SCL ist, dass manche Programmierer alles mit IF-THEN erschlagen wollen.
Da werden selbst einfache binäre Verknüpfungen zu wahren Orgien von verschachtelten IF-THEN-Ausdrücken.
Wollen nicht unbedingt.
Hab gedenkt es muss so.
Hellebarde hat es ein paar Treads her auch so geschrieben.
Ziel ist schon einen saubere, übersichtliche schnelle SCl Code schreiben zu können.
Und dabei fange ich unten an...
xxxxxxxxxxxxxxxxxxxxxxx
So, der SCL Baustein ist fertig.
Im vergleich zu seine AWL (Zykluszeitoptimierte Version) Vorlage ist er auch 5 bis 10% schneller :smile:
Bram
#T_POS_RE_DIF := DWORD_TO_REAL(DW#16#7FFFFFFF And REAL_TO_DWORD(#IO_AKT_PRG[1].WKZ_H - #IO_AKT_PRG[2].WKZ_H));
mahlzeit.
Hab mich grad wegen dieser diskusion angemeldet, da ich selber eine frage diesbezüglich habe und jeden tag ins forum schaue um neue ideen zu sammeln.
Wie würdet ihr das vorzeichen einer real variable in scl entfernen? Ich hab das bisher so gemacht
was absolut nicht schön ist, so mach ich das normaler weise auch in awl.Code:#t_pos_re_dif := dword_to_real(dw#16#7fffffff and real_to_dword(#io_akt_prg[1].wkz_h - #io_akt_prg[2].wkz_h));
#t_pos_re_dif := ABS(#io_akt_prg[1].wkz_h - #io_akt_prg[2].wkz_h);
Mahlzeit.
Hab mich grad wegen dieser Diskusion angemeldet, da ich selber eine Frage diesbezüglich habe und jeden tag ins Forum schaue um neue Ideen zu sammeln.
Wie würdet ihr das Vorzeichen einer Real variable in SCL entfernen? Ich hab das Bisher so gemacht
was absolut nicht schön ist, so mach ich das normaler weise auch in AWL.Code:#T_POS_RE_DIF := DWORD_TO_REAL(DW#16#7FFFFFFF And REAL_TO_DWORD(#IO_AKT_PRG[1].WKZ_H - #IO_AKT_PRG[2].WKZ_H));
Wie mehr ich jetzt mit der SCL mache, wie mehr ich mir abfrage warum ich mich nicht früher damit auseinander gesetzt hab.
hab jetzt echt so etwas von " Ich mache nie wieder AWL"
Es macht echt spaß.
Bram
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?