Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Dynamischer Insanz-DB bei FB-Aufruf

  1. #1
    Registriert seit
    02.03.2015
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!

    Ich habe hier ein Problem, das mich jetzt schon ein paar Tage beschäftigt. Die Aufgabenstellung klingt einfach, ist aber offenbar gar nicht so trivial in der Umsetzung. Also...

    Ich habe folgende Aufrufkette von Funktionen und Funktionbausteinen: OB1 --> FC4 --> FB4 --> FC5 --> FB10. Der FB10 am Ende der Kette soll mit einem dynamischen Instanz-DB aufgerufen werden. Dynamisch deshalb weil der DB ganz am Anfang der Kette (im FC4) festgelegt wird. Im Grunde geht es also nur darum, einen Datenbaustein über mehrere Aufrufe weiterzugeben um ihn dann am Ende als Instanz-DB zu verwenden. Das Problem ist nur: Es funktioniert nicht. Natürlich kann ich einfach die DB-Nummer als Integer übergeben und dann den DB über den Befehl AUF DB [#Variable] öffnen. Das funktioniert aber leider nicht mit dem CALL-Befehl (CALL FB10, DB [#Variable] ist nicht erlaubt). Schade, es hätte so einfach sein können. Aber es gibt ja noch eine Möglichkeit: Den Datentyp Block_DB. Diesen kann ich für eine Input-Variable verwenden und den Instanz-DB damit weiterreichen. Aber auch hier gibt es ein kleines (und für mich genauso unverständliches) Problem: Variablen vom Typ Block_DB können nicht als Parameter an Funktionen übergeben werden, nur an Funktionsbausteine, womit ich bei FC5 Schiffbruch erleiden würde. Eine weitere Alternative wären Fallunterscheidungen und Sprungmarken, aber damit würde ich wieder seitenweise unübersichtlichen Spaghetticode produzieren.

    Ich bin langsam mit meinem Latein am Ende. Wie kann ich einen FB mit dynamischem Instanz-DB aufrufen? Die wenigen Threads, in denen dieses Problem besprochen wurde brachten leider keine Lösung. Ich bin für jede Hilfe dankbar.

    Falls sich jemand wundert, warum ich mit so vielen FBs und FCs arbeite, ich mache das um redundanten Quelltext zu vermeiden und um das Projekt übersichtlich zu halten (Ich programmiere in AWL).
    Zitieren Zitieren Dynamischer Insanz-DB bei FB-Aufruf  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.284
    Danke
    932
    Erhielt 3.320 Danke für 2.682 Beiträge

    Standard

    Zitat Zitat von W7X Beitrag anzeigen
    ich mache das um redundanten Quelltext zu vermeiden und um das Projekt übersichtlich zu halten

    ... und dafür völlig undurchsichtigen und unwartbaren Programmcode zu produzieren, den höchstwahrscheinlich nur Du selber verstehst und in einem halben Jahr wird es überhaupt niemand mehr verstehen. In Zeiten von TIA und vollsymbolischer Programmierung muß man sich solche vorsintflutlichen Schweinereien garnicht erst angewöhnen.

    Gut, daß Siemens die Verwendung dynamischer IDB so schwer gemacht hat, daß nur wirkliche Profi-Programmierer sowas hinkriegen, welche genau wissen was sie tun.

    Was verstehst Du unter vermeidbarem "redundanten Quelltext"?

    Ich behaupte mal, daß Dein Konzept falsch ist und Du Deine Idee besser in die Tonne kloppst.
    Warum hast Du mehrere Instanz-DBs, von denen Du anscheinend immer nur einen nutzen willst?
    Hat Dein FB10 gar keine Übergabeparameter oder wie bekommst Du Deine Werte in/aus den betreffenden IDB?

    Beschreibe doch mal etwas genauer, was Du da vorhast und warum das so umständlich gelöst werden soll.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    W7X ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.03.2015
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Harald!

    Danke erstmal für die schnelle Antwort.

    Ich muss dazu sagen, dass ich Neuling bin in der SPS-Programmierung. Von daher könntest du schon Recht haben, vielleicht ist mein Konzept falsch. Ich versuche mal zu erklären, worum es geht...

    Die SPS soll insgesamt 6 bewegliche Spiegel steuern, die wiederum von jeweils 2 Motoren bewegt werden. Jeder Motor wird mit einem Servoverstärker vom Typ Kollmorgen S600 über den PROFIBUS betrieben. Der bereits erwähnte FB10 ist ein fertiger Funktionsbaustein, der dem Benutzer die Funktionalität der Servoverstärkers bereitstellt. Nun soll es möglich sein, ausgehend von den gemeldeten Istwerten der Motoren frei wählbare Zielwerte anzusteuern. Da die Spiegel aber in ihrer Beweglichkeit eingeschränkt sind muss vorher eine Überprüfung der Zielwerte stattfinden und eventuell ein Umweg gefahren werden. Aufgrund dieser, etwas komplexeren, Abläufe habe ich mich für die genannte Struktur entschieden. FC4: Aufrufe für alle 6 Spiegel, FB4: Prozesssteuerung für einen Spiegel, FC5: Prozesssteuerung für einen Motor. Ich könnte natürlich FB4 und FC5 zusammenlegen, aber dann hätte ich den Code für die Motorsteuerung schon wieder doppelt drin.

    Ich habe früher hauptsächlich objektorientiert programmiert und da ist es eben so, dass man jede Funktion wenn möglich nur einmal implementiert und dafür entsprechend eine Klasse deklariert und daraus Objekte erzeugt. Selbst wenn man dabei manchmal ein bisschen ausholen muss finde ich solche Strukturen dann immernoch übersichtlicher (und vor allem einfacher zu ändern) als einen Quelltext, in dem alles 10 mal drin steht. Aber wie gesagt, ich bin SPS-Neuling und wenn du einen guten Vorschlag hast, wie man das anders lösen kann dann wäre ich dafür natürlich auch dankbar.

    Grüße,
    Niko

  4. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.284
    Danke
    932
    Erhielt 3.320 Danke für 2.682 Beiträge

    Standard

    Du mußt ja nicht die Ansteuerfunktion 10 mal schreiben sondern nur einmal in einem FB. Dann rufst Du diesen FB je einmal für jeden Motor (oder jeden Spiegel) auf, jedesmal mit einem anderen IDB. Ich sehe da keinen redundanten/mehrfach vorhandenen Code. Es wird immer wieder der gleiche Code ausgeführt, jedoch jedesmal mit einem anderen Satz Variablen (der IDB).

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    W7X ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.03.2015
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Naja, im Grunde mache ich ja genau das - mit dem FB4. Nur dass ich dann zusätzlich die Steuerung für die einzelnen Motoren nochmal auslagern will. Ich hab das Problem jetzt erst mal dadurch gelöst, dass ich aus dem FC5 einen FB5 gemacht habe. Dadurch habe ich zwar einen zusätzlichen Instanz-DB, den ich nicht gebraucht hätte, aber immerhin kann ich jetzt die Block_DB-Variable bis zum FB10 durchreichen.

    Gruß,
    Niko

  6. #6
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.635
    Danke
    786
    Erhielt 654 Danke für 497 Beiträge

    Standard

    Und den FB5 packst du jetzt in die Schnittstelle eines aufrufenden FBs z.B. FB100

    FB100 ruft also FB5 10 mal auf mit jeweils anderer Deklaraktion in der Schnittstelle von FB100. Stichwort Multiinstanz.

    Dann hast du nur noch einen Instanzdb nämlich den von FB100.

    mfG René

    PS: Grad letztens wieder geflucht wieso unsere Lehrlinge das in der Berufsschule nichtmal anschneiden. Die lernen immernoch alles mit Merkern (nein keine DBs sondern echte Schmiermerker in FCs)

  7. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.284
    Danke
    932
    Erhielt 3.320 Danke für 2.682 Beiträge

    Standard

    Zitat Zitat von W7X Beitrag anzeigen
    aber immerhin kann ich jetzt die Block_DB-Variable bis zum FB10 durchreichen.
    Du solltest aber nicht die Nummer des IDB durchreichen. Wenn Du Multiinstanzen benutzt, dann brauchst Du gar nichts an die FB10 durchreichen und trotzdem werden die 12 FB10-Instanzen automatisch klar unterschieden.
    z.B.:
    * "IDB_Spiegel1".Motor1.ServoFB
    * "IDB_Spiegel1".Motor2.ServoFB
    * "IDB_Spiegel2".Motor1.ServoFB
    * "IDB_Spiegel2".Motor2.ServoFB
    ...
    * "IDB_Spiegel6".Motor1.ServoFB
    * "IDB_Spiegel6".Motor2.ServoFB

    Das erreichst Du so:
    - FC5 umwandeln zu FB5
    - im FB5 in STAT als Multiinstanz eine Instanz von FB10 : #ServoFB
    - im FB4 in STAT als Multiinstanz zwei Instanzen von FB5 : #Motor1 + #Motor2
    - im FC4 6x FB4 aufrufen mit 6 verschiedenen IDB

    Code:
    OB1 --> FC4 --> CALL FB4,"IDB_Spiegel1"
                         --> #Motor1 (FB5) --> #ServoFB (FB10)
                         --> #Motor2 (FB5) --> #ServoFB (FB10)
                --> CALL FB4,"IDB_Spiegel2"
                         --> #Motor1 (FB5) --> #ServoFB (FB10)
                         --> #Motor2 (FB5) --> #ServoFB (FB10)
                --> CALL FB4,"IDB_Spiegel3"
                         --> #Motor1 (FB5) --> #ServoFB (FB10)
                         --> #Motor2 (FB5) --> #ServoFB (FB10)
                --> CALL FB4,"IDB_Spiegel4"
                         --> #Motor1 (FB5) --> #ServoFB (FB10)
                         --> #Motor2 (FB5) --> #ServoFB (FB10)
                --> CALL FB4,"IDB_Spiegel5"
                         --> #Motor1 (FB5) --> #ServoFB (FB10)
                         --> #Motor2 (FB5) --> #ServoFB (FB10)
                --> CALL FB4,"IDB_Spiegel6"
                         --> #Motor1 (FB5) --> #ServoFB (FB10)
                         --> #Motor2 (FB5) --> #ServoFB (FB10)
    Du könntest auch den FC4 in einen FB umwandeln und alle 6 Spiegel als Multiinstanz in diesen Mutter-FB packen, dann brauchst du nur 1 IDB für alles.

    Btw: "Tiefe" Aufruf-Strukturen sind bei SPS eher unüblich (die Schachtelungstiefe der Bausteinaufrufe ist begrenzt), Dein Beispiel ist aber noch machbar.
    Und bei SPS kommt es nicht so drauf an, Code möglichst kompakt zu packen, sondern mehr auf Lesbarkeit und besonders Beobachtbarkeit der einzelnen "Objekte". Da wird durchaus lieber keine Schleife programmiert sondern "stupide" 10x nacheinander das Gleiche programmiert, weil das viel besser zu beobachten ist und kleine unterschiedliche Spezialbehandlungen leichter einzubauen sind. Außerdem kann solch linearer Code einfacher von Programmgeneratoren erzeugt werden.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #8
    W7X ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.03.2015
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    OK, jetzt ist bei mir der Groschen gefallen. Ich habe gerade festgestellt, dass ich bisher keinen Schimmer hatte, was Multiinstanzen sind. Aber das ist genau das was ich brauche: Die Motorsteuerung kommt einfach als Multiinstanz zweimal in die Spiegelsteuerung mit rein und das wars - genial. Damit sollte es funktionieren.

    Vielen Dank für die Hilfe!

  9. #9
    Registriert seit
    15.10.2007
    Ort
    St.Pölten
    Beiträge
    875
    Danke
    98
    Erhielt 200 Danke für 188 Beiträge

    Standard

    Und bitte nicht vergessen den FB5 multiinstanzfähig zu programmieren, sonst gibt es tolle Effekte. Gibt hier gute Threads zum Nachlesen. Offset vom Adressregister dazuzählen und und und.....
    Beginne jeden Tag mit einem lächeln,es kann dir nämlich während des Tages sehr schnell vergehen.

  10. #10
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Gerhard K Beitrag anzeigen
    Und bitte nicht vergessen den FB5 multiinstanzfähig zu programmieren, sonst gibt es tolle Effekte. Gibt hier gute Threads zum Nachlesen. Offset vom Adressregister dazuzählen und und und.....
    Muss ich das ar2 auch berücksichtigen, wenn ich symbolisch adressiere?

Ähnliche Themen

  1. Antworten: 16
    Letzter Beitrag: 23.05.2017, 16:03
  2. Zeilenumbruch bei dynamischer Sprachumschaltung
    Von EvilIce im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 16.05.2014, 13:43
  3. Antworten: 9
    Letzter Beitrag: 05.04.2013, 09:01
  4. Antworten: 9
    Letzter Beitrag: 10.02.2011, 10:46
  5. dynamischer db aufruf
    Von misconduct im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 24.11.2007, 22:42

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •