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



## HSThomas (22 März 2010)

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  )


----------



## asci25 (22 März 2010)

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.


----------



## Paule (22 März 2010)

HSThomas schrieb:


> 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.

```
[B][COLOR=red]1[/COLOR][/B]000 0000 0000 0000 0000 0000 0000 0000
>------ DBW 0 -----<>------ DBW 2 -----<
>----------------- DBD 0 ----------------<
```
 


asci25 schrieb:


> DTI: DINT TO INT


Den Befehl gibt es nur in SCL, in AWL brauchst Du den nicht.


HSThomas schrieb:


> 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


----------



## asci25 (22 März 2010)

Paule schrieb:


> Den Befehl gibt es nur in SCL, in AWL brauchst Du den nicht.





AWL: DTI
SCL: DINT_TO_INT()



Paule schrieb:


> ...brauchst Du den nicht.



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

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.


----------



## PN/DP (23 März 2010)

*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:

```
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


----------



## MSB (23 März 2010)

asci25 schrieb:


> AWL: DTI



Wann hast du das letzte mal versucht, diesen Befehl in AWL zu tippen?
Es gibt diesen Befehl ganz einfach nicht.


----------



## Paule (23 März 2010)

asci25 schrieb:


> AWL: DTI
> SCL: DINT_TO_INT()


>>> Schande über mich <<<
Das mit dem Wort-Dreher darf nicht passieren! :sad:

Ich habe Siemens Version: 5.4 SP5 und da gibt es kein DTI


----------



## asci25 (23 März 2010)

: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:


```
L   #DINT_VARIABLE
T   #INT_VARIABLE
```

:-xIch hatte es einfach mit ITD verwechselt.:lol:


----------



## HSThomas (23 März 2010)

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.


----------



## HSThomas (23 März 2010)

Paule schrieb:


> Wo steht da 0.0?
> An der Schnittstelle des FC musst Du ja einen Namen angeben.
> Und in der FC einfach:
> L #Namen




In der Schnittstellendeklaration steht im Unterbereich "Temp" neben den Namen der Variablen, ihrem Datentyp auch eine Adresse - jedenfalls auf unserem Schulrechner


----------



## asci25 (23 März 2010)

HSThomas schrieb:


> 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):

```
L   #tempVariable
T   PAW752
```

Schöner ist die erste Variante...


----------



## HSThomas (23 März 2010)

Bekomme ich bei der ersten Variante keinen Variablentypenkonflikt?


----------



## vierlagig (23 März 2010)

HSThomas schrieb:


> Bekomme ich bei der ersten Variante keinen Variablentypenkonflikt?



nicht wenn du es unter "Extras", "Einstellungen", "KOP/FUP", "Typüberprüfung" abschaltest

(bei den genauen bezeichnungen bin ich mir mangels verfügbarer software nicht ganz sicher...)


----------



## HSThomas (23 März 2010)

Ich sehe schon, mein Lehrer wird die Lösung lieben - und die anderen aus der Arbeitsgruppe


----------



## asci25 (23 März 2010)

HSThomas schrieb:


> 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...


----------



## KG_TC (23 März 2010)

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...


----------



## vierlagig (23 März 2010)

asci25 schrieb:


> vierlagig stellt seinen Humor unter Beweis...


 
ich finde nichts lustig!
ich meine das voll ernst!

es ist doch schon nervig, dass ich, wenn ich den standard-FC105 benutzen will, mein EW als INT und nicht als WORD, was es ja eigentlich ist, in der Symboltabelle hinterlegen muß ...


----------

