TIA TIA:SCL Bausteine verstehen, Teilweise in FUB umwandeln

wt15309

Level-1
Beiträge
55
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo User,

leider bin ich ein Greenhorn und will die SCL-Programmierung besser verstehen.
Für mich hilfreich ist wenn man den SCL-Programmierung in FUB oder AWL darstellen kann.
mir geht es um eine gewisse Flexiblität um dann später zu entscheiden was ist der bessere Weg SCL, AWL oder FUB.

Ein Beispiel:
#delta, #TI, #IN und #OUT sind REAL-Variablen
#delta := (#IN - #OUT) * DINT_TO_REAL("Zeitsystem".DeltaT) / REAL#1000.0 / #TI;
#OUT := #OUT + #delta;

//Überlauf abfangen
//Bei Überläufen wid Out ungültig, und OUT=Out gibt false zurück
IF NOT (#OUT = #OUT) THEN
#OUT := #IN;
END_IF;

Kann mir Bitte jemand helfen dies in FUB und AWL zu übersetzen?

Für Eure Hilfe bin ich extrem dankbar.

Gruß
wt15309
 
sorry, da fehlt noch was:
"Zeitsystem".DeltaT ist die Time-Datentpy.
Ich verstehe das hier gar nicht: DINT_TO_REAL("Zeitsystem".DeltaT)
Wo kommt da DINT her?
Eine Zeitvariable convertieren in Real ist hier gefordert, oder verstehe ich das falsch?

Gruß
wt15309
 
Hallo,
erstmal viel Dank für die Antwort.


warum willst Du das in FUP oder AWL übersetzen? Gerade solche Berechnungen machen in SCL am ehesten Sinn. In FUP oder AWL wärs ziemlich unlesbar.
Nun wie oben beschrieben, erstmal möchte ich die Programmierung verstehen, dann eben in FUP und AWL darstellen.
Wenn man alles verstanden hat kann man entscheiden was für welche Variante für einen Selbst die Beste ist.

Ich hoffe du hilst mir weiter.

Gruß
wt16309
 
in AWL funktioniert das so:

Code:
Addition in REAL:

L #OUT
L #delta
+R
T #OUT

Konvertierung DINT nach REAL:
L "Zeitsystem".deltaT
DTR

evtl. brauchst noch Variablen für Teilergebnisse, bzw. mit TAK die Akkus drehn.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht ein kleiner Tipp bei der Wahl der "besten" Sprache für Anfänger:
Bei reinen logischen Verküpfungen (UND, ODER; etc.) ist FUP am besten zu lesen.
Bei Programmen, die Fallunterscheidungen haben (IF ... THEN .... ELSE) oder Schleifen brauchen (FOR ...), ist SCL besser.
Ebenso kann man besser bzw. übersichtlicher in SCL rechnen. Rechnen in AWL geht auch noch, aber FUP wäre ziemlich unübersichtlich.
AWL ist für 1500er Steuerungen eigentlich nicht mehr notwendig, zumindest wenn man neue Bausteine erzeugt.

Wenn man einen Baustein grundsätzlich als FUP-Baustein anlegt hat man die Möglichkeit Netzwerke zu verwenden. Man kann in einem Baustein Netzwerke mit unterschiedlichen Sprachen (FUP, SCL, AWL) kombinieren. So kann man je nach Aufgabe sogar innerhalb eines Bausteins die "passende" Sprache wählen. Allerdings mag nicht jeder diesen Programmierstil, da es gewöhnungsbedürftig ist und auf den ersten Blick sogar leicht chaotisch wirken kann.

Grundsätzlich gilt natürlich auch, dass die "richtige" Programmiersprache auch stark von dem abhängt, wie man jahrelang programmiert hat. Eingefleischte SPS-Programmierer, die 20 Jahre lang 300er SPSsen mit AWL programmiert haben, tun sich oft schwer mit SCL, da sie alles auch fliessend in AWL abbilden können.
Man muss also auch berücksichtigen, mit wem man programmiert und wie der vorherrschende Programmierstil in der jeweilige Firma bzw. Abteilung ist. Bei dem Thema gibt es kein richtig oder falsch, sondern es sind auch viele Gewohnheiten der Anderen zu berücksichtigen.
 
Hey,
ich versuchs mal in AWL.

Code:
//Addieren
      L     #IN
      L     #OUT
      +R
      T     #HM_delta

// Konvertierung
      L     "Zeitsystem".DeltaT
      DTR
      T     #HM_Conv

//Mulitiplikation
      L     #HM_delta
      L     #HM_Conv
      *R
      T     #HM_Multi

//Division 1
      L     #HM_Multi
      L     REAL#1000.0
      /R
      T     #HM_Div1

//Division 2
      L     #HM_Div1
      L     #TI
      /R
      T     #HM_Div2

//Addieren Erg.
      L     #HM_Div2
      L     #OUT
      +R
      T     #OUT

Ist das Ok?

//Überlauf abfangen
// zuerst Vergleichen
      L     #OUT
      L     #OUT
      ==R
      T     #"delta_Vergl."

      L     #"delta_Vergl."
      T     #IN

Das mit den Überlauf hab ich noch nicht verstanden.
Wenn der OUT nicht gleich ist , dann ....
An der Stelle ist der Out doch immer gleich, oder sehe ich das falsch?
In #IN müsste hier ein IN/OUT sein, oder?

Oder hab ich da was falsch gemacht?


Gruß
wt15309
 
@ Imolator,
Vielen Dank für die Info.
ja da gebe ich dir völlig recht, das ist ja auch der Grund weshalb ich es genauer wissen möchte.
Klar könnte man den SCL-Netzwerk einfügen und den Code reinkopieren, aber dann kopiert man nur und weis nicht warum.

Ich bin überzeugt: wers nicht versteht kann es auch nicht besser machen.

Gruß
wt15309
 
viele Wege führen nach Rom:

Code:
//#delta, #TI, #IN und #OUT sind REAL-Variablen
//#delta := (#IN - #OUT) * DINT_TO_REAL("Zeitsystem".DeltaT) / REAL#1000.0 / #TI;
L #IN
L #OUT
-R
L "Zeitsystem".DeltaT
DTR
*R
L 1000.0
/R
L #TI
/R
T #delta

//#OUT := #OUT + #delta;
L #OUT
L #delta
+R
T #OUT

//Überlauf abfangen
//Bei Überläufen wid Out ungültig, und OUT=Out gibt false zurück
//IF NOT (#OUT = #OUT) THEN
//#OUT := #IN;
//END_IF;
L #OUT
L #OUT
==R
SPB n01a
L #IN
T #OUT
n01a: NOP 0

ob das mit dem Überlauf abfangen so funktioniert, keine Ahnung, würds nicht so machen.
 
Zuletzt bearbeitet:
Hallo,
vielen Dank für deine Hilfe.
Die Hilfsmerker sind gar nicht notwendig - Klasse.
viellen Dank für die Sprungfunktion.

Wenn ich dies nun in FUB mache, dann benötigt man die Hilfsmerker, oder hast da auch eine andere Lösung?

Gruß
wt15309
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schau mal in der TIA-Onlinehilfe nach den "Grundlagen des Statuswort".
Dort ist das Überlaufbit OV beschrieben.

Zitat:
OV (Überlauf)
Das Statusbit OV zeigt einen Zahlenbereichsüberlauf oder die Verwendung ungültiger Gleitpunktzahlen.
Das Statusbit OV kann durch mathematische Funktionen, Umwandlungsanweisungen und Vergleiche von Gleitpunktzahlen beeinflusst werden.

Beispiel zur Verwendung in AWL:
U OV// Abfragen, ob ein Überlauf aufgetreten ist.
 
Schau mal in der TIA-Onlinehilfe nach den "Grundlagen des Statuswort".
Dort ist das Überlaufbit OV beschrieben.

Zitat:


Beispiel zur Verwendung in AWL:
U OV// Abfragen, ob ein Überlauf aufgetreten ist.
keine Ahnung, was da überhaupt überlaufen soll. Ich würd eher abprüfen, dass für TI niemand 0.0 einstellt...

denke eher, der Code war mal nen Integrierer, den jemand zu nem PT1 umgebaut hat, und die Überlaufprüfung dringelassen hat. Aber selbst da kann der REAL #OUT eigentlich nicht "Überlaufen". Weil "TI-Integrationszeit" ist eigentlich der falsche Name für die Zeitkonstante T1 bei nem PT1.
 
Zuletzt bearbeitet:
Das ist eher was aus der Zeit, als man mit INT gerechnet und multipliziert hat. Oder wenn man im Sicherheitsprogramm rechnen muss. Da ist man aber eh auf FUP/KOP festgenagelt.
Eleganter ist es, gleich das passende Zahlenformat zu wählen und ggf. in dieses zu konvertieren, damit ein Überlauf gar nicht erst stattfindet. Oder wie Du schreibst, vorher ungültige Werte abfangen. Ist auch bei der berühmten "Division durch Null" sinnvoll.
Spätestens hier ist man bei den Vorzügen von SCL:
IF DIVISOR<> 0 THEN
OUT := Wert / DIVISOR;
END_IF;
Ist schön lesbar.

Aber wenn man partout das OV-Statusbit in AWL auswerten möchte, dann geht's so.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ich würds generell eher so machen:

Code:
// #delta, #TI, #IN und #OUT sind REAL-Variablen
IF #TI>=0.001 THEN
#delta := (#IN - #OUT) * DINT_TO_REAL("Zeitsystem".DeltaT) / REAL#1000.0 / #TI;
#OUT := #OUT + #delta;
ELSE
#OUT := #IN;
END_IF;
 
Dank euch für die Erklärung.
Wenn ich dich richtig verstehe ist dies eigentlich nicht notwendig, da man keine Zahlen umwandelt ( INT -->Real oder ähnliches) und somit der Überhang nicht existiert, da nur mit REAL gerechnet wird.
Nun frage ich mich weshalb dies in der Programmierung von SCL drin ist? Ein Programmierer "allen Schlages" ?

Gruß
wt15309
 
ich würds generell eher so machen:

Code:
// #delta, #TI, #IN und #OUT sind REAL-Variablen
IF #TI>=0.001 THEN
#delta := (#IN - #OUT) * DINT_TO_REAL("Zeitsystem".DeltaT) / REAL#1000.0 / #TI;
#OUT := #OUT + #delta;
ELSE
#OUT := #IN;
END_IF;
jetzt warst du schneller. 1 generelle Fragen hierzu:
Weshalb der Vergleich #TI>=0.001?
 
Zurück
Oben