# SFC14/SFC15



## Anonymous (18 Juli 2004)

Hallo !
Kann mir Jemand erklären wie ich Die Daten die ich über den Profibus bekomme weiter verarbeiten kann. Ich habe einen Slave der mir seinen Wert als 5 Byte läge sendet.
Das erste Byte ist ein Statusbyte, die restlichen 4 enthalten meinen Messwert. Wie bekomme ich den Messwert auf z.B. eine Analogausgabe meiner SPS.
Genauer gesagt, wie verarbeite ich Pointer (ANY)?

Dank !!
Kai.


----------



## Ralf (19 Juli 2004)

Mit dem Pointer einen Datenbaustei adressieren
Im ersten Byte des DB die Statusangaben. In den Folgenden (ich schätze mal zwei Worten die (ich schätze mal es sind zwei) Meßwerte...
Danach aus dem DB weiterverarbeiten

Gruß

Ralf


----------



## joker (19 Juli 2004)

*SFC 14 / 15*

hallo Ralf,

ich habe unter dem Menü Feldbusse am 11.02.2004 dies erleutert !
Such doch bitte meinem Namen JOKER und Profibus Neuling dann findest du die sehr rasch !

Gruss

Joker


----------



## Markus (19 Juli 2004)

ich denke er will wissen wie der anyparameter aussehen muss...
hier ein beispielaufruf für sfc14:


```
CALL  "DPRD_DAT"
       LADDR  :=#HM_Adresse
       RET_VAL:=#HM_Status
       RECORD :=P#DIX 20.0 BYTE 2


oder P#DB10.DBX10.0 BYTE 2              // 2=Anzahl Bytes
```


----------



## Anonymous (19 Juli 2004)

*SFC14/15*

Erst einmal ein herzliches Dankeschön an Alle die so freundlich waren mir zu antworten.
Ich habe meine Frage wohl nicht ganz präzise erklärt.
Ich habe einen Datenbaustein erstellt und die Werte mittels SFC14 ausgelesen,dann mit
P#DB10.DBX 0.0 BYTE 5 in den Datenbaustein geschrieben.
Die ersten 4 Byte sind der 32 Bit Messwert, das fünfte Byte ist ein Status Byte.
Wie spreche ich jetzt die 4Byte so an das ich sie in einen Merker schreiben kann, oder direkt auf eine Analogausgabebaugruppe ausgeben kann. Wie komme ich an das Statusbyte ? 
Programmieren in Step7 ist für mich noch recht neu, ich habe vor ewiger Zeit auf einer S5 gelernt !


----------



## Markus (19 Juli 2004)

Du kannst byteweise, wortweise oder doppelwortweise auf den wert zugreifen.



```
DB10.DBB0          DB10.DBW0          DB10.DBD0
DB10.DBB1       
DB10.DBB2          DB10.DBW2
DB10.DBB3
```

der status steht in DB10.DBB4



bevor du den wert an einen analogausgang ausgibst musst du ihn normieren(umrechnen).

zb:

```
L     DB10.DBD0
L     1000                      // Faktor
/I
T     PAW 256
```


Der Faktor hängt von dem Bereich deines MEsswertes ab. Analogbaugruppen werden von 0 - 27648 (0-100% bzw. 0-10V) angesprochen.

der Faktor muss also so sein das bei deinem größten messwert 27648 in das paw geschrieben wird...


----------



## Zottel (19 Juli 2004)

L DB10.DBD0
lädt den Messwert. Für eine Analogausgabe ist er aber zu lang. Wenn der Wert ein Doppelwort (32-bit integer) ist, kannst du die oberen Bits durch Rechtsschieben erhalte, du kannst aber auch nur die oberen Bits mittels
L DB10.DBW0 laden.
Ist der Messwert aber ein Gleitkommawert, so musst du ihn zunächst nach Integer wandeln (RND).

Den Status bekommst du mittels
L DB10.DBB4.


----------



## joker (19 Juli 2004)

*Datenbaustein Messdaten darstellen !*

hallo,

 hier dein Bausetinaufruf : P#DB10.DBX 0.0 BYTE 5 

 nun musst du den Ladebefehl :
 L DB10. DBW 0   = Datenbaustein Doppewort laden
 T MD100             = Transfer in Merkerdoppelwort 100 ( Merbyte 100-103)
 L DB10. DBB 4    = Datenbaustein Byte 4 laden 
 T MD104             = Transfer in Merkerdoppelwort 10 4 ( Merbyte 104 )

nun kannst du über Variable beobachten / Steuern dies anschauen
wichtig dabei ist noch das entsprechende Datenformat zu wählen !
Bei MD = Gleitpunktzahl/ IEEE
und beim MB = HEX / Bit oder so !!

Gruss

Joachim


----------



## Anonymous (19 Juli 2004)

*SFC14/15*

Ja das wollte ich wissen.
Muß ich eigentlich alle Bytes die von meinem Slave übertragen werden mit dem SFC14 einlesen und mir die Bytes herrauspicken die ich brauche, oder kann ich auch einen Teilbereich mit dem SFC14 einlesen ?

Z.B.: 
Eingangsbyte   Prozessparam.               Adresse

0,1,2,3            Volumenfluß                  312-315
4                     Status Volumenfluss      316
5,6,7,8            Summenzähler              317-320
9                     Status Summenzähler   321
usw...........
Insgesamt 24Byte. Wenn ich den wert des Summenzählers haben möchte benötige ich aber nur Byte 5 bis 8. Kann ich jetzt einfach ab Adresse 317 4 Byte einlesen mit dem SFC14 ?


----------



## Zottel (19 Juli 2004)

*Re: SFC14/15*



			
				Kai schrieb:
			
		

> Ja das wollte ich wissen.
> Muß ich eigentlich alle Bytes die von meinem Slave übertragen werden mit dem SFC14 einlesen und mir die Bytes herrauspicken die ich brauche, oder kann ich auch einen Teilbereich mit dem SFC14 einlesen ?
> 
> Z.B.:
> ...


Normalerweise ja. Es hängt aber auch davon ab, wie die GSD Datei die Konsistenz der Daten beschreibt.
In der DP-Konfiguration könnte dein Gerät als Slave mit mehreren Modulen auftauchen:
Modul 1:Volumenfluss, Konsistenz über Modul
Modul 2:Summenzähler, Konsistenz über Modul
Ist aber alles ein Block mit Konsistenz über alle Daten, so kannst du nur den Block als ganzes lesen.
Konsistenz ist dafür gut, um folgendes zu verhindern:
Wenn du vom Summenzähler erst 12 oder 3 byte und dann die anderen lesen würdest, der Zähler aber weitergezählt und ein Übertrag aufgetreten wäre, hättest du unsinnige Daten.

Am einfachsten ist es, du probierst es aus. Wenn´s nicht geht, bekommst du einen Rückgabewert ungleich 0 vom SFC14. Den Fehlercode kannst du dann in der Hilfe von Step 7 nachschlagen.
Du kannst dann schauen, ob du in der Hardwarekonfig hinsichtlich der Datenblöcke was ändern kannst.


----------



## Anonymous (19 Juli 2004)

Danke für die gut Hilfe.
Ichr habt mir alle sehr geholfen, und meine Anlage funktioniert. 
Besten Dank.
Kai.


----------

