Real in INT wandeln? & Liste der SFC/SFB?

HSThomas

Level-1
Beiträge
158
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin moin,


die Technikerschule hat mich nun auch mal wieder in die Bedrängnis gebracht, mich mit der S7 zu befassen.
Für jemanden, der nur mit Allen Bradley Steuerungen zu tun hat, ist das eine ziemlich Umstellung.
Aber ich will ja hier nicht über Vor- und Nachteile der verschiedenen Systeme lamentieren, sondern zwei Fragen stellen.

Zum einen stand ich heute vor dem Problem, dass ich einen REAL-Wert in einen INT-Wert umwandeln wollte.

Mit dem "Runden"-Befehl (wie immer der Baustein auch richtig hiess - er rundet auf jeden Fall den Wert) konnte ich aus dem REAL-Wert einen DINT Wert machen.
Nun bliebe ja theoretisch die Möglichkeit, das zweite Wort de DINT Wert zu nehmen und als INT Wert zu behandeln. (Dass ich vorher prüfen muss, wie groß der Wert ist und dass er nicht den Rahmen des INT sprengt, versteht sich von selbst.)Da bliebe dann nur die Frage, was mit dem Vorzeichen passiert? Das wird doch in Bit 31 bzw. in Bit 15 gespeichert, oder?
Und wie mache ich das, wenn ich den DINT-Wert in der Schnittstelle eines FCs angelegt habe? Da steht zwar eine Adresse (in diesem Falle 0.0), aber ich habe leider keine Ahnung, wie ich diese Adresse ansprechen kann. (Merker würde ich gerne vermeiden)




Die andere Frage wäre, ob es irgendwo eine Liste der SFC und SFB Bausteine aus den Standard Libraries gibt? Die Hilfefunktion vom Simatic Manager hat mir da nicht weitergeholfen.




Vielen Dank schonmal im vorraus.



Gruß

Hauke (der im Mai 2012 endlich Techniker ist ;) )
 
Kurz und kompakt:

RND: Round Real to DINT
DTI: DINT TO INT

SFB/SFC-Liste: http://www.automation.siemens.com/doconweb/pdf/SINUMERIK_SINAMICS_09_2009_D/S7_SFC.pdf?p=1

Wenn Du einen FC/FB als Unterprogramm aufrufst, wird automatisch die projektierte Schnittstelle angezeigt, die Du dann mit Konstanten/Variablen beschreiben kannst. Variablen sind Merker oder Datenbausteinvariablen. Solltest Du die Schnittstelle eines bereits aufgerufenen Bausteins nachträglich ändern, wird dieser rot dargestellt. Rechter Mausklick -> Zugriff aktuallisieren, dann ist meist wieder alles OK.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Da bliebe dann nur die Frage, was mit dem Vorzeichen passiert? Das wird doch in Bit 31 bzw. in Bit 15 gespeichert, oder?
Das Vorzeichen bleibt an vorderster Stelle.
Code:
[B][COLOR=red]1[/COLOR][/B]000 0000 0000 0000 0000 0000 0000 0000
>------ DBW 0 -----<>------ DBW 2 -----<
>----------------- DBD 0 ----------------<

Den Befehl gibt es nur in SCL, in AWL brauchst Du den nicht.
Und wie mache ich das, wenn ich den DINT-Wert in der Schnittstelle eines FCs angelegt habe? Da steht zwar eine Adresse (in diesem Falle 0.0), aber ich habe leider keine Ahnung, wie ich diese Adresse ansprechen kann. (Merker würde ich gerne vermeiden)
Wo steht da 0.0?
An der Schnittstelle des FC musst Du ja einen Namen angeben.
Und in der FC einfach:
L #Namen
 
Den Befehl gibt es nur in SCL, in AWL brauchst Du den nicht.

:confused:

AWL: DTI
SCL: DINT_TO_INT()

...brauchst Du den nicht.

Wichtige Besonderheit: Siemens verwendet das Motorola-Format - nicht das Intel-Format. :cool:

Das Vorzeichen befindet sich in DBW2, nicht in DBW0! In DBW0 findest Du den für einen Integer verwertbaren Zähl-Wert. Der Befehl DTI fasst Vorzeichen und Wert in einem 16-Bit-Wort zusammen. Ohne DTI wird aus einer 65535 (DINT) sonst eine -1 (INT), bei positiven Zahlen ( <32768 ) merkst Du dieses Verhalten nicht.
 
Zuletzt bearbeitet:
Step7-Hilfen und ein paar Sachen richtigstellen ...

Hallo Hauke,

auch die Step7-Onlinehilfe enthält die Beschreibung aller SFB und SFC
Im Simatig-Manager auf
* Hilfe > Hilfethemen ...
* im Reiter Inhalt ganz unten (vorletztes): Aufruf von Referenzhilfen (KOP...) Doppelklick
* Sprachbeschreibungen, Bausteinhilfen ...
* nun steht rechts u.A.: Hilfe zu SFBs/SFCs

oder einfach im Bausteinordner einen vorhandenen SFC/SFB markieren und F1.

Mit Step7 wird normalerweise auch das PDF mit der Beschreibung der SFB/SFC installiert:
Start > SIMATIC > Dokumentation > Step7 > STEP 7 - System- und Standardfuntionen für S7-300 und S7-400

Dritte Variante: Im KOP/AWL/FUP-Editor:
* Ansicht > Übersichten Ctrl-K (oder Einfügen > Programmelemente Ctrl-G geht auch)
In dem neuen Teilfenster (links) ganz unten: Bibliotheken > Standard Library > System Function Blocks
einen SFB oder SFC markieren und F1


Hilfe zu AWL-Operationen
im AWL-Editor den Cursor in die Zeile mit einer AWL-Operation stellen oder eine Operation eintippen und F1


Umwandeln REAL -> INT
"RND" wandelt REAL -> DINT, umwandeln DINT -> INT ist nicht nötig (es gibt auch keine AWL-Operation dafür).
Es reicht zu prüfen, ob das RND-Ergebnis im Bereich -32768 ... +32767 liegt, dann ist der INT schon richtig
mit Vorzeichen. Wichtig: Falls mit Vergleichsoperation, dann >D und <D, NICHT >I und <I !!!

Du brauchst nun nur die niederwertigen 16 Bit weiterverarbeiten. Wenn der INT positiv ist, dann ist das
H-Word des DINT alles 0-Bits, wenn der INT negativ ist, dann ist das H-Word des DINT alles 1-Bits.
Also die Bits 15 bis 31 sind dann alle gleich und sind quasi alle Vorzeichen! Das ist sowas von redundant,
deshalb können die Bits 16 bis 31 einfach wegfallen. Bit 15 als Vorzeichen ist ja noch da.

Meine REAL -> INT Wandlung geht so:
Code:
      L     #REAL_Wert
      RND               // REAL -> DINT
      SPO   ERR         // Abbruch, wenn Fehler bei RND (zu groß, zu klein, NaN)
      PUSH              // Akku2 = Akku1 = DINT-Wert
      ITD               // Akku1.0-15 -> DINT
      ==D               // wenn dabei das gleiche wie in Akku2 rauskommt,
      SPB   OK          // dann ist das Ergebnis im Bereich -32768 ... +32767 

ERR:  NOP   0           // Fehler: Wandlung nicht möglich
//    ...               // Fehlerreaktion

OK:   T     #INT_Wert   // Wandlung erfolgreich, untere 16 Bit -> INT

Bei Siemens-SPSen kommt im Speicher zuerst das H-Word und danach das L-Word:
DBD0 (oder MD0) sei der 32-Bit DINT mit den Bits 0 bis 31
DBW0 (oder MW0) sind die höherwertigen Bits 16 bis 31 inklusive Vorzeichen
DBW2 (oder MW2) sind die niederwertigen Bits 0 bis 15 = das 16-Bit INT

Das Vorzeichen des DINT ist Bit 31 und liegt an Adresse DBX0.7 (oder M0.7).
Das Vorzeichen des INT ist Bit 15 und liegt an Adresse DBX2.7 (oder M2.7).

Gruß
Harald
 
:s17: Nach einem gesunden Schlaf funktioniert das Gedächtnis wieder richtig :s17:

Richtig - das war was anderes, an das ich mich erinnerte: INT --> REAL, da muss man über DINT gehen, sonst gibt es das Problem mit den negativen Zahlen...

Die einfachste Umwandlung ist demnach:

Code:
L   #DINT_VARIABLE
T   #INT_VARIABLE

:-xIch hatte es einfach mit ITD verwechselt.:lol:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okokokokokok.... das waren ja schonmal eine ganze Menge Antworten.


Am Anfang hatte ich ja noch den irrsinnigen Glauben, man könnte das einfach in FUP (wir programmieren da eigentlich nur in FUP) erledigen - muss ich wohl umdenken.
Theoretisch kann ich doch den Baustein umwandeln, das Netzwerk in einer anderen Sprache programmieren und dann wieder zurück wandeln, oder? (Klar, das Netzwerk steht dann weiter in der anderen Sprache da)


Wenn das ganze eigentlich nicht notwendig ist - wie kann ich dann das Low-Word des Wertes, der im OB1 am Ausgang des Bausteins (In diesem Falle FC1) einem analogen Ausgang (PAW752) zuweisen? Muss ich da dann einen Umweg über ein MDW machen oder geht das auch anders?


Problematischerweise kann ich das ganze erst wieder probieren, wenn die Abendschule nach den Osterferien wieder losgeht (Ferien... juhuu....).
In der Firma verwenden wir keine Siemens-SPSen, daher fehlt mir da die Testmöglichkeit.
 
Wenn das ganze eigentlich nicht notwendig ist - wie kann ich dann das Low-Word des Wertes, der im OB1 am Ausgang des Bausteins (In diesem Falle FC1) einem analogen Ausgang (PAW752) zuweisen? Muss ich da dann einen Umweg über ein MDW machen oder geht das auch anders?

Deklarier den Ausgang vom FC1 in WORD um, und schon kannst Du das PAW752 direkt beschreiben. :wink:

Damit machst Du die Typumwandlung bereits im FC.

Oder im OB1 deklarierst du eine temporäre Variable als DWORD und im folgenden Netzwerk schreibst Du in AWL (Strg+2):
Code:
L   #tempVariable
T   PAW752

Schöner ist die erste Variante...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bekomme ich bei der ersten Variante keinen Variablentypenkonflikt?

Du musst natürlich den Programmcode des FC1 u.U. anpassen. Je nachdem, ob die Ausgangsvariable in einem FUP/KOP- oder AWL-Netzwerk beschrieben wird. Dieses Topic bietet mittlerweile genug Informationen, mit denen das problemlos zu bewerkstellen sein sollte.


Das mit dem Abschalten der Typüberprüfung ist zwar nett, aber das würde ich eher den erfahrenen alten Hasen empfehlen. Als Anfänger könnte man sich damit die nächste Falle bauen. (DWORD-REAL z.B.)

vierlagig stellt seinen Humor unter Beweis...
 
ja aber wenn du einen real wert auf einen Ausgang haben willst dann benutze doch einfach FC106 (unscale) zu finden in den Standard Library TI-S7 Converting Blocks

Damit kann man das sogar noch wunderbar skalieren...
 
Zurück
Oben