FB für Stellantrieb über DP

ottopaul

Level-1
Beiträge
160
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo, habe einen FB für einen Stellantrieb geschrieben. Dieser wird über Profibus angesteuert. Könnt ihr mir sagen, ob dieser baustein ok ist oder ob man sowas anders realisiert.
danke im voraus
 

Anhänge

  • FB50.pdf
    75,2 KB · Aufrufe: 75
  • FB50_Quelle.zip
    1,6 KB · Aufrufe: 15
Hallo,
sieht auf den ersten Blick ganz nett aus.
Ich hätte das mit den Lokal-Bits anders gelösst. Ohne so richtig in der Materie zu sein weiss man doch nicht so ohne weiteres was L#2.2 (z.B.) ist ...
Funktioniert der Baustein zu deiner Zufriedenheit ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich finde ihn gelinde gesagt - SCHEISSE!
(sorry, ist halt so...)


also wenn du so einen fb machst, dann willst du ihn doch ggf. mehrmals verwenden wenn du mehrer klappen hast? eben jedesmal ein anderer idb...

1. die direkten pew zugriffe fliegen raus
entweder du legst sie aussen auf parameter, oder noch schöner - du gibst dem baustein als parameter nur die startadresse und er rechnet intern über pointer die zugriffe.


2. zugriff auf lokaldaten ohne symbole ist murks und unübersichtlich.
lege eine struktur an!


mal ein paar ansätze:

IN parameter des FB "LADDR" (int)

Temp Variable "LADDR_tmp" (word)
Temp Variable "retval" (int)


STAT Variable "Eingangsdaten" (struct)
in die struct packst du bools und bytes und was weiss ich so wie das zeug eben bereitliegt...


Netzwerk1

l LADDR
t LADDR_tmp // wandeln in WORD

call sfc14
adrr: LADDR_tmp
retval: retval
record:Eingangssignale // zeiger auf deine struktur


Netzwerk2

nur beispiel für zugriff auf struct bzw. symbolisch

U Eingangssignale.Stoerung
=...




habe nur kurz überflogen, aber wenn der baustein den du da aufrufst ein FB ist, dann binde ihn als Multiinstanz ein, damit der aufrufende FB wiederverwendet werden kann...
 
1. die direkten pew zugriffe fliegen raus
entweder du legst sie aussen auf parameter, oder noch schöner - du gibst dem baustein als parameter nur die startadresse und er rechnet intern über pointer die zugriffe.

@Markus
Ich hab mir die Quelle angesehen, wo sind die direkten PEW-Zugriffe? Er hat die doch schon als IN-Parameter drin.
Allerdings würde ich deinen Vorschlag mit der Startadresse auch bevorzugen.

2. zugriff auf lokaldaten ohne symbole ist murks und unübersichtlich.
lege eine struktur an!

Ja, da stimme ich absolut zu, wäre in diesem Falle und bei diesem Umfang absolut angebracht.

statt:
L #PEW_0;
T #PEW_0_Int;

würde ich für PEW_0_Int die Daten aufschlüsseln als einzelne Temp-Var(wenn z.Bsp. alles Bool ist)
und dann lieber einmal am Anfang

L #PEW_0
T LW 2

und später im Baustein auf die Angelegten Bool-Variablen-Symbole zugreifen,
statt L #L3.3

L #Wahlschalter_Fern
 
Zuletzt bearbeitet:
FB für Stellantrieb

hallo, danke erstmal für die kritik..
kann mir jemand die quelle eleganter schreiben?
oder ausführlicher erklären?
danke im Voraus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Markus
Ich hab mir die Quelle angesehen, wo sind die direkten PEW-Zugriffe? Er hat die doch schon als IN-Parameter drin.

ok habe nur kurz über das pdf geflogen, und da sah es so aus als ob...



das ist genauso scheisse, unsymbolische zugriffe sind böse...

am saubersten alles auf einmal mit sfc14/15

und wenn so, dann wenigstens so:

l p##eingangsdaten
lar1

l #pew_0
t diw [ar1,p#0.0]

l pew_1
t diw [ar1,p#2.0]
...
 
FB Stellantrieb

hallo, danke füe die anregungen.
aber wie mache ich es genau mit dem SFC14?
und wie lege ich dann die struktur an? als temp, als Stat ???

kann mir jemand die vorgehensweise genau sagen, damit ich dann im fb auch geziehlt die einzelnen bits verarbeiten kann.

danke im voraus.
 
das ist genauso scheisse, unsymbolische zugriffe sind böse...

am saubersten alles auf einmal mit sfc14/15

und wenn so, dann wenigstens so:

l p##eingangsdaten
lar1

l #pew_0
t diw [ar1,p#0.0]

l pew_1
t diw [ar1,p#2.0]
...

Ja das stimmt, das ist schöner :ROFLMAO: und übersteht auch Änderungen an den Paramtern!

Ich habs mal schnell probiert:

Code:
FUNCTION FC 32 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  Wort_IN : WORD ;    
END_VAR
VAR_OUTPUT
  Out_1 : BOOL ;    
  Out_2 : BOOL ;    
  Out_3 : BOOL ;    
END_VAR
VAR_TEMP
  DWord_Temp : DWORD ;    
  Bool_1 : BOOL ;    
  Bool_2 : BOOL ;    
  Bool_3 : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =

      L     P##Bool_1; 
      LAR1  ; 

      L     #Wort_IN; 
      T     LW [AR1,P#0.0]; 

      U     #Bool_1; 
      =     #Out_1; 
      U     #Bool_2; 
      =     #Out_2; 
      U     #Bool_3; 
      =     #Out_3; 
END_FUNCTION
Da ist das etwas anschaulicher ;).

Man muß halt die erste Bool-Var zur Adressbestimmung hernehmen, mit ordentlichen Kommentaren wäre das auch für andere nachvollziehbar. Kann man sicher mal irgenswo brauchen, hier würde ich auch SFC14/15 vorziehen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
FB Stellantrieb

ja, danke erstmal.....
aber wie sieht der der ansatz mit dem SFC14/15 genau aus?
Könntet ihr mir dazu auch einen Ansatz nennen?
danke, danke im voraus
 
Code:
       CALL  "DPRD_DAT"  //SFC 14
       LADDR  :=#Adr_IN
       RET_VAL:=#Ret_Val_Temp
       RECORD :=#Rec
Hier mal ein kleines Beispiel.
Adr_IN: Word
RET_VAL_Temp: Int
Rec: struct

Rec legst du im FB in Stat als Struct an, genau mit den Variablen, die du vom Slave bekommst. Der Struct-Name ist dann Rec, auf die Variablen kannst du dann z.Bsp. so zugreifen:

U #Rec.Bool_1
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Fb Stellantrieb

Wie mache ich es denn mit dem SFC 14 wenn ich 3 PEW's von dem Antrieb habe und 1 PAW ?
Wie ist das dann mit der LADDR ?? 3x den SFC 14 aufrufen? oder wie?
Könnt Ihr mir auch dazu was sagen?
Danke im Voraus
 
Wie mache ich es denn mit dem SFC 14 wenn ich 3 PEW's von dem Antrieb habe und 1 PAW ?
Wie ist das dann mit der LADDR ?? 3x den SFC 14 aufrufen? oder wie?
Könnt Ihr mir auch dazu was sagen?
Danke im Voraus

So wie ich dir das schrieb, in der Struct Rec werden alle Variablen definiert, die dir vom Slave übergeben werden. Wenn du also 3 PEW hast, dann muß der Record also insgesamt 6 Byte lang sein. Die Struct baust du genau so auf, wie deine Variablen im Salve aussehen.

Also z.Bsp.

1. Wort
Enable: bool;
Start: bool;
...
2.Wort
Sollpos: Word;
3.Wort
Sollvel: Word;

Du müßtest ja wissen, was dein Slave genau liefert!

Das Selbe dann mit dem SFC15 und einer Struct für 1 Word für dein PEA-Word.
 
FB Stellantrieb

Hallo,
wie mache ich das denn dann mit der LADDR?
Muss ich dann für jedes Eingangswort einen eigenen SFC14 anlegen?
 
Laddr

Hi,
die SFC sitzt doch in deinem FB, die bekommt dann von aussen die
entspr. Adresse. Als FB Eingangsparameter muss du die ja eintragen.

Vladi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
natürlich die PEW.
Hallo,
die Adresse muss in hexadezimaler Schreibweise deklariert werden.
z.B. PEW 256 = w#16#100

Zitat SIEMENS-Hilfe:
LADDR = INPUT = WORD = E, A, M, D, L, Konst.
Projektierte Anfangsadresse aus dem E-Bereich der Baugruppe, aus der gelesen werden soll.
Hinweis: Adresse muß hexadezimal angegeben werden. Z.B. Anfangsadresse 100 bedeutet: LADDR:=W#16#64.

Gruß Andre
 
Zuletzt bearbeitet:
Hallo,
wie mache ich das denn dann mit der LADDR?
Muss ich dann für jedes Eingangswort einen eigenen SFC14 anlegen?
Hallo,
innerhalb des selben Antriebs nicht. Wenn für den DP-Teilnehmer z.B. 3 PEW's parametriert wurden reicht ein SFC14/15. Lies dir doch mal die Hilfe zu den Bausteinen durch! Baustein im Bausteinordner markieren und F1 drücken. Da steht zwar nicht viel aber zum Verständnis reicht es.
Gruß Andre
 
Zurück
Oben