PDA

View Full Version : SFC 14/15 im FB verarbeiten



Steve38
16.03.2010, 14:18
Hi,

hab mir den SFC 14 und 15 erfolgreich parametriert.

Jetzt möchte ich gerne die beiden in einem FB verarbeiten. Komm nur irgendwie mit der Deklaration von RECORD nicht klar.

Wie muss ich RECORD genau deklarieren?

maweri
16.03.2010, 14:26
Hinter RECORD kommt ein ANY-Pointer. Der gibt an, wo der Eingangsbereich der Profibusbaugruppe hingeschrieben werden soll (SFC14).
Beispiel: Der Slave hat einen Eingangsbereich von 32 Byte Länge, dann könnte der Eintrag hinter RECORD lauten: P#DB1.DBX0.0 Byte 32

Für den SCF15 gilt dasselbe, nur umgekehrt. Da wird angegeben wo die Daten für den Ausgangsbereich des Slaves in der SPS liegen.

Steve38
16.03.2010, 14:27
Ok, das hab ich ja soweit schon, aber wenn ich das ganze jetzt in einem FB machen möchte, wie muss ich da deklarieren?


So steht es in meinem FC:

P#DB54.DBX8.0 BYTE 8

maweri
16.03.2010, 14:37
Im FB ist es aber nix anderes.
Oder willst Du die SFC14 und 15 mit IN-/OUT-Variablen beschreiben?

Larry Laffer
16.03.2010, 14:38
Was hast du denn damit weiter vor ?
Soll der FB (und ggf. nur der) die eingelesenen Daten irgendwie weiter verarbeiten ? Wenn ja, dann würde ich im STAT-Bereich des FB den von dir benötigten Datenbereich (vielleicht sogar als Struktur) hinterlegen und diese dann symbolisch dem jeweiligen SFC übergeben ...

Steve38
16.03.2010, 14:41
Ich möchte eigentlich ganz gerne am Ende quasi bei dem FB Aufruf, diesen Wert wieder dran schrieben:

P#DB54.DBX8.0 BYTE 8 und damit auf einen externen Datenbeistein gehe. Und nicht auf den InstanzDB.

Ich möchte das ganz gerne machen, da ich bei dem DB54 mir eine Tabelle angelegt habe, mit der genauen Bedeutung der Bits.
Oder ist das nicht notwenig? Ich hab nämlich knappe 35 FU´s die ich damit einlesen muss/soll/darf

Larry Laffer
16.03.2010, 14:56
... die Tabelle kannst du doch auch genauso in der FB-Instanz anlegen ... ist nur ein Vorschlag ... Ich weiß ja nicht, was du mit den Daten der FU's außerhalb des FB sonst noch so vor hast ...
Wenn du sie (größtenteils) nur in dem FB brauchst, dann wäre eventuell mein Vorschlag etwas für dich ...

Gruß
LL

Steve38
16.03.2010, 15:00
Ich muss außerhalb eigentlich nur 2-3 Werte ausgeben und in den DB 2-3 Bits und den Sollwert setzten.

In den DB:

Start und Stopp
Sollwert

Aus dem DB:

Frequenz
Strom

Larry Laffer
16.03.2010, 15:01
... dann wären das dann die IN's und OUT's deines FB's (eine Instanz für jeden FU) ...

Steve38
16.03.2010, 15:03
Und die deklaration wäre dann:

In/Out und dann Any

Larry Laffer
16.03.2010, 15:09
Nö ... die Daten für die SFC's, die du übergeben willst legst du zuerst mal in deine Instanz. Jetzt kannst du von da aus den/die SFC's symbolisch bedienen ... versuch das mal so ...

Steve38
16.03.2010, 15:15
Ähm, jetzt komm ich nicht mehr mit. :-(

Larry Laffer
16.03.2010, 15:21
... dann war ich vielleicht etwas schnell ... ;)

Ich meinte, dass du dass, was hier : P#DB54.DBX8.0 BYTE 8 steht nach miener Meinung mit in die Instanz gehört. Dadurch ersparst du dir den Übergabe-ANY und alles Zusammengehörige bleibt zusammen. Das mit Start+Stop und den Istwerten ... das sind natürlich Kandidaten für die Schnittstelle (also IN bzw. OUT).

Steve38
16.03.2010, 15:24
Ah ok, jetzt hab ich es. :-)

Mein P#DB54.DBX8.0 BYTE 8 deklarier ich als TEMP im Format Any.

Und die Werte die ich ausgeben möchte einfach als Out bzw. IN.

Larry Laffer
16.03.2010, 15:26
Nein ...
das, was du im DB54 im Bereich von DBB8 bis DBB15 deklariert hast ... das kopierst du dir direkt in deine Instanz - von mir aus auch in den TEMP-Bereich - ich würde aber lieber STAT nehmen.
Was ich meine ist, dass du nicht auf den DB verweisen sollst, sonders das dein Instanz-DB an Stelle des DB tritt ...

Steve38
16.03.2010, 15:28
Ok.

Welches Format muss ich denn beim STAT wählen?

Larry Laffer
16.03.2010, 15:36
:confused: das selbe wie im DB ...

also vielleicht so :

STAT
Sendedaten : struct
Steuerwort : struct
Freigabe_1 : bool
Freigabe_2 : bool

usw.
end_struct
Sollwert : dint
end_struct

Steve38
16.03.2010, 15:52
Quasi so:



IM FB:

http://bastimg1982.ba.funpic.de/SFC14_15.JPG

Deklartaion:


http://bastimg1982.ba.funpic.de/Deklaration.JPG



Aufruf:


http://bastimg1982.ba.funpic.de/Aufruf.JPG

Steve38
17.03.2010, 11:32
Nochmal eine Frage zu meinen "Problem".

Ich muss meinen Sollwert von Panel ja wandeln, bekomm einen INT Wert und der FU erwartet eine HEX Zahl.

So kann ich es machen, oder?



L #Sollwert_Panel
L 164
*I
ITB
T #Steuerwort.PCD_21.Sollwert
NOP 0



#Sollwert ist der Wert im STAT das als Struct hinterlegt ist.

Larry Laffer
17.03.2010, 11:35
Hallo Steve,
der ITB-Befehl ist Blödsinn - ansonsten ist es richtig unter der Voraussetzung, dass du im Sollwert_Panel Werte im Bereich von 0 bos 100 übergibst ...

Gruß
LL

Steve38
17.03.2010, 11:40
Ja genau.

0-100%

Wieso brauch ich den Befel ITB nicht? Muss doch in HEX wandeln, oder nicht?

Larry Laffer
17.03.2010, 11:44
ITB würde den Wert in eine BCD-Zahl wandeln - das hat nichts mit Hex zu tun. Hex ist nun eine andere Ansichtsweise von Dezi. Dafür mußt du NICHT wandeln ...

Beispiel :
die Zahl Dezimal 16 würde dir in der Hex-Darstellung als 10 und in der Binär-Darstellung als 10000 präsentiert - es bleibt aber die ganze Zeit beim exakt demselben Zahlenwert ...

Gruß
LL

Approx
17.03.2010, 11:46
Hallo.
Der Befehl ITB wandelt von Integer in BCD-Format. Ein MOVE von INT- nach einer WORD-Variable reicht i.d.R. aus. Wenn man es ganz genau nimmt, brauchst Du aber nix machen/wandeln.

Gruß

Steve38
17.03.2010, 11:47
Ok. Perfekt.

Besten Dank.