TIA TIA:SCL Bausteine verstehen, Teilweise in FUB umwandeln

Zuviel Werbung?
-> Hier kostenlos registrieren
Genau so ein Beispiel dient gut zur Veranschaulichung, warum für sowas FUP nicht so geeignet ist.
In SCL liest sich das viel eleganter und leichter:

IF Gewaehlt AND Sollfrqequenz > Maximalfrequenz AND Maximalfrequenz <> 0.0 THEN
Sollfrqequenz := Maximalfrequenz;
END_IF;

(P.S.: Bitte schreib FUP, das steht für "FunktionsPlan" ;))
@ Imolator,

klar SCL ist hier sehr schön und kompakt, aber was hilft mir das wenn der Kunde nur FUP oder AWL verlangt?
Abgesehen davon will ich ja weiterentwickeln.

Vielen Dank

PS: Mir ist bewusst da ich noch viel zu lernen hab bis ich dies alles einigermaßen kann, aber wer nur rumeiert kommt niemals ans Ziel.
Niemals aufgeben!

Gruß
wt15309
 
Halte die Variante mit "NAN" (Not a Number) für die bessere.

Kleine Optimierung vielleicht: Konstante Werte nicht dividieren, das braucht Rechenzeit, lieber multiplizieren.
/ REAL#1000.0 => * REAL#0.001
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Noch so eine Frage, die ich gar nicht verstehe.

Als letzte Anweisung im FB steht das.

//ENO setzen, damit in KOP hinten andere Bausteine "angeflanscht" werden können
ENO := true;

Weshalb macht man das so?
 
//ENO setzen, damit in KOP hinten andere Bausteine "angeflanscht" werden können
ENO := true;

Weshalb macht man das so?
Das "Anflanschen" gilt nicht nur in KOP, sondern auch in FUP.

Sieh Dir mal den Move-Block in Deinen FUP-Varianten an. Dort ist zwar der ENO nicht belegt, aber der EN mit dem Du den Move "bedingt" ausführst (nur bei Bedarf). Man kann den EN-Eingang mit einem ENO-Ausgang eines anderen (varausgehenden) Blocks verbinden, um die Bedingung weiterzureichen.
Normalerweise dient der ENO dazu, zu melden, ob im Block ein Fehler aufgetreten ist (und die "Freigabe" für den folgenden Block wegzunehmen).
Den ENO aber immer mit 'True' zu versorgen, ist nicht üblich und daher auch nicht sehr sinnvoll.
 
Jetzt noch so eine Sache.

Den ersten Teil kann ich evtl so in FUP schreiben.
Alles weitere gefällt mir gar nicht.

Mein Gefühl sagt mir es passt nicht. o_O

Könnt ihr mir Bitte wieder weiterhelfen?

Code:
//Wenn die Peripherie keine Auslastung liefert, aber einen Strom:
//Dann berechnert der Baustein die Auslastung über den Nennstrom selbst (falls angegeben)
IF #Peripherie."Hat Strom" AND NOT #Peripherie."Hat Auslastung" AND #Parameter.Nennstrom <> 0 THEN
    #Peripherie.Auslastung := #Peripherie.Strom / #Parameter.Nennstrom * 100.0;
    #Peripherie."Hat Auslastung" := true;
END_IF;
1625564368548.png
 
Jetzt noch so eine Sache.

Den ersten Teil kann ich evtl so in FUP schreiben.
Alles weitere gefällt mir gar nicht.

Mein Gefühl sagt mir es passt nicht. o_O

Könnt ihr mir Bitte wieder weiterhelfen?


//Wenn die Peripherie keine Auslastung liefert, aber einen Strom:
//Dann berechnert der Baustein die Auslastung über den Nennstrom selbst (falls angegeben)
IF #Peripherie."Hat Strom" AND NOT #Peripherie."Hat Auslastung" AND #Parameter.Nennstrom <> 0 THEN
#Peripherie.Auslastung := #Peripherie.Strom / #Parameter.Nennstrom * 100.0;
#Peripherie."Hat Auslastung" := true;
END_IF;

Anhang anzeigen 55277
Aus der Onlinehilfe kannst Du entnehmen, dass man Signale auch verzweigen kann:
1625565234111.png
Das wäre oben hilfreich.
 
Das "Anflanschen" gilt nicht nur in KOP, sondern auch in FUP.

Sieh Dir mal den Move-Block in Deinen FUP-Varianten an. Dort ist zwar der ENO nicht belegt, aber der EN mit dem Du den Move "bedingt" ausführst (nur bei Bedarf). Man kann den EN-Eingang mit einem ENO-Ausgang eines anderen (varausgehenden) Blocks verbinden, um die Bedingung weiterzureichen.
Normalerweise dient der ENO dazu, zu melden, ob im Block ein Fehler aufgetreten ist (und die "Freigabe" für den folgenden Block wegzunehmen).
Den ENO aber immer mit 'True' zu versorgen, ist nicht üblich und daher auch nicht sehr sinnvoll.
1625564915706.png
Wenn ich das richtig versthe, müsste die dann die richtige Anwendung sein. Der Hilfsmerker HM_peri_Ausl. ist aber notwendig. Das Setzen gefällt mir nicht so richtig.

Gruß
wt15309
 
Mache eine Verzweigung an den Ausgang vom UND-Glied und hänge da das SETZE "HatAuslastung" dran.

Allerdings muss "HatAuslastung" auch irgendwann/irgendwo wieder zurückgesetzt werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin davon ausgegangen:
Code:
//Wenn die Peripherie keine Auslastung liefert, aber einen Strom:
//Dann berechnert der Baustein die Auslastung über den Nennstrom selbst (falls angegeben)
IF #Peripherie."Hat Strom" AND NOT #Peripherie."Hat Auslastung" AND #Parameter.Nennstrom <> 0 THEN
   #Peripherie.Auslastung := #Peripherie.Strom / #Parameter.Nennstrom * 100.0;
   #Peripherie."Hat Auslastung" := true;
END_IF;

Schon möglich, dass die Peripherie irgendwie bei irgendeiner Voraussetzung von sich aus #Peripherie."Hat Auslastung" zurücksetzt. Aber warum setzt sie es manchmal, manchmal aber auch nicht?
Mir ging es hauptsächlich darum darauf hinzuweise, dass man grundsätzlich bei einem SETZE sich auch Gedanken um ein RÜCKSETZEN machen sollte. In den meisten Fällen braucht man sowas paarweise, es sei denn, man möchte z.B. beim Programmstart Variablen fix vorbesetzen.

Als Anfänger realisiert man nicht unbedingt gleich den Unterschied zwischen:
Code:
IF #Peripherie."Hat Strom" AND NOT #Peripherie."Hat Auslastung" AND #Parameter.Nennstrom <> 0 THEN
   #Peripherie."Hat Auslastung" := true;
END_IF;
und
Code:
  #Peripherie."Hat Auslastung" := Peripherie."Hat Strom" AND NOT #Peripherie."Hat Auslastung" AND #Parameter.Nennstrom <> 0;

Ist aber insgesamt sehr mühselig, wirklich korrekte Antworten zu geben, wenn man nur immer Bruchstückchen des Codes bekommt , aber den Gesamtzusammenhang und die Anforderungen des Kunden nicht kennt.
 
Zuletzt bearbeitet:
Hallo,

ich denke den Ganzen FB-Code ist relativ lang. Aber an mir soll es nicht scheitern - sind nur 535 Zeilen.
Gebt Bescheid wenn ihr das für Sinnvoll hält.
 
Noch eine so grundlegende Frage. Hier Kopiere ich einen UDT-Strucktur in eine DB-Strucktur, die Struckturen sind Gleich. Kann man dies so machen?


1625572952726.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
IN der SCL_vorlage sieht dies so aus
#Parameter := #Bereich."Aktiver Aktor".Parameter;

hier werde nur REALS verschoben.
Würde dies auch funktioniern wenn noch andere Datentypen involiert sind?
 
Hallo,

ich denke den Ganzen FB-Code ist relativ lang. Aber an mir soll es nicht scheitern - sind nur 535 Zeilen.
Gebt Bescheid wenn ihr das für Sinnvoll hält.

Ich habe das Gefühl das hier sowieso nach und nach alle Zeilen für dich überprüft / mit dir übersetzt werden :D.
Spaß beiseite. Du hast ja jetzt schon ein paar "Beispiele" bekommen. Ich denke nicht das sich hier wirklich jemand bereit erklärt dir den kompletten Baustein für dich zu übersetzen, vor allem nicht kostenlos :D.
Versuche dich doch einfach an den nächsten Zeilen ohne hilfe. Du kannst ja auch immer deine Programmteile Simulieren wenn du dir unsicher bist.
Es gibt auch immernoch die TIA Hilfe um mal schnell was nachzuschlagen ;).




Noch eine so grundlegende Frage. Hier Kopiere ich einen UDT-Strucktur in eine DB-Strucktur, die Struckturen sind Gleich. Kann man dies so machen?


Anhang anzeigen 55284

ja, solange beide Strukturen identisch sind. Bedenke nur, das wird jetzt immer so ausgeführt. Wenn du den EN beschaltest, kannst du das halt bedingt ausführen lassen.

-chris
 
IN der SCL_vorlage sieht dies so aus
#Parameter := #Bereich."Aktiver Aktor".Parameter;

hier werde nur REALS verschoben.
Würde dies auch funktioniern wenn noch andere Datentypen involiert sind?

klick mal auf den Move-Baustein und drücke F1. Dort steht alles beschrieben, was der so kann :)

-chris
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum schreibt man in SCL: REAL#100.0? Ich könnte doch nur 100.0 schreiben.
Wo ist der Unterschied? Gleitpunktzahl sind doch beides, oder?
Unabhängig von SCL oder nicht, wenn Du nur 100.0 schreibst, weiß der Interpreter nicht wirklich, in welchem Größenbereich die Gleitpunktzahl angelegt werden soll und nimmt deshalb die größt mögliche. Das wäre bei einer S7-1500 LREAL.
(U.U. bekommst Du dann beim Rechnen mit einer Realzahl auch eine Warnung wegen Genauigkeitsverlust.)

Mit REAL# legst Du dagegen den Datentyp selbst fest.
 
Darf ich euch mal was ganz Grundlegendes fragen?
Warum schreibt man in SCL: REAL#100.0? Ich könnte doch nur 100.0 schreiben.
Wo ist der Unterschied? Gleitpunktzahl sind doch beides, oder?

REAL#100.0 möchte man bei TIA schreiben, wenn man keine Warnmeldungen beim Übersetzen bekommen möchte. Andernfalls bekommst du an vielen Stellen eine Warnung bezüglich angeblichem Genauigkeitsverlust, wobei das bei Werten wie 0.0 oder 100.0 natürlich eine Falschmeldung ist weil dort keine Genauigkeit von REAL zu LREAL verloren geht. - aber das ist eben Siemens, da kann man kein tiefergehendes Verständnis mehr verlangen.
 
Zurück
Oben