Indirekter Bausteinaufruf

Supervisor

Level-1
Beiträge
93
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Experten,

bei der Durchsuchung des Forums habe ich nichts passendes zu meinem Problem gefunden, deswegen meine Anfrage.

Das Problem ist folgendes:
Ich möchte einen bestimmten Funktionsbaustein (FB) und eine bestimmte Funktion (FC) in einem anderen Funktionsbaustein aufrufen. Der Aufruf soll aber indirekt erfolgen und die aufgerufenen Bausteine sollen mit Parametern versorgt werden. Ich würde als Eingangsparameter meines "Hauptfunktionsbausteines" die aufzurufende FB-Nummer verwenden, um einen speziellen Funktionsbaustein aufzurufen. Das funktioniert mit Datenbausteinen ja auch.

Beispiel mit Datenbaustein: AUF DB [#DB-NUMMER_LOKAL]

In der Art muss das doch auch ähnlich mit FBs und FCs gehen: CALL FB [#FB-NUMMER], DB [#DB-NUMMER_INSTANZ]

Ist das überhaupt möglich und wenn ja, wie??? :confused:

Danke und Gruß!

Hatte ich noch vergessen: Programmiersprache ist AWL
 
Zuletzt bearbeitet:
Hallo!

Parameter sollen auch Übergeben werden und die Bausteinnummern ändern sich auch während der Laufzeit?

Naja ich würde das so machen das ich die Bausteine die in Frage kommen normal mit call aufrufe und vor dem Aufruf einen Vergleicher setzen mit der Bausteinnummer. Wenn der Vergleich auf istgleich erfüllt ist dann nicht über den Bausteinaufruf springen ansonsten schon.

Wenn deine Bausteine jetzt sogar die nummer 1 bis zb 10 haben dann könntest es sogar mit einer SPL (Sprungleiste) lösen

Für was brauchst du denn diese Anwendung?

godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo godi,

danke für deine Antwort, aber das ist nicht das, was ich meine.

Ich habe einen "Master-FB". An dessen Eingangsparameter soll man eine Zahl gößer 0 anlegen können. Der Master-FB nimmt diese Zahl und öffnet dann einen dieser Zahl entsprechenden FB, an dem dann Parameter übergeben werden können. Welche Baustein-Nummer der zu öffnende FB hat, weiß ich nicht, da diese variabel sein soll. Deswegen die FB-Nummer (und eventuell die zugehörige DB-Nummer) als Eingangsparameter des Master-FB.

Wenn ich das über Sprungleiste/Vergleiche mache, dann kann ich doch keinen variablen FB anspringen. Wenn der Zahlenbereich der möglichen FB-Nummer sehr groß ist, müsste man sehr viele Vegleiche programmieren. Das halte ich für sehr umständlich.

Der Knackpunkt ist eben, das der Master-FB flexibel in seiner Anwendung sein soll (bibliothekfähig). Deswegen werden alle benötigten Parameter abgefragt.

Da muss es doch irgendetwas geben.
Ich hatte schon die Idee, über "UC FB [#FB_Nummer]" das ganze zu machen. Das funktioniert auch, aber eben ohne Parameterübergabe. Ich versuche gerade den entspechenden Instanzdatenbaustein über die Adress/DB-Register zu manipulieren, aber das verursacht bis jetzt nur ein müdes SF blinken bei der SPS.... :sb8:
 
Hallo!

Ja aber da muss dann die Schnittstelle von den ganzen FB's gleich sein weil wie willst du sonst die Parameter Übergeben?
Sollen deine FB's alle einen gemeinsamen InstanzDB haben oder alle unterschiedliche InstanzDB?

Du kannst deinen FB schon mit CC [#Bausteinnumer] öffnen nur musst du vor dem Befehl mit AUF DI [#Bausteinnummer] den InstanzDB öffnen!
Die Parameter musst du so und so Händisch übergeben.
 
Guten morgen ;) ,

alle FB haben ihren eigenen InstanzDB. Also mein "Master-FB" hat seinen InstanzDB und der InstanzDB vom aufzurufenden FB hat auch seinen eigenen InstanzDB. Der hat auch immer die gleiche Nummer wie der zugehörige FB und eine feste Struktur.

Ich habe heute morgen ein bischen rumprobiert und ich glaube, ich habe die Lösung :) .

Guckst du Code-Ausschnitt:

Code:
      ...
      L     #NUMMER_FB                  //Eingabe der Baustein-Nummer umkopieren
      T     #M_NUMMER_FB
      L     DINO                        //InstDB-Register sichern
      T     #M_INST_DB_TEMP
      AUF   DI [#M_NUMMER_FB]           //Instanzdatenbaustein öffnen
      LAR1  P#0.0                       //Parameter 1
      L     1                           //DI-Adresse: 0.0
      T     DIW [AR1,P#0.0]
      LAR1  P#0.0                       //Parameter 2
      L     3                           //DI-Adresse: 2.0
      T     DIW [AR1,P#2.0]
      LAR1  P#0.0                       //Parameter 3
      L     0                           //DI-Adresse: 4.0
      T     DIW [AR1,P#4.0]
      ....
      UC    FB [#M_NUMMER_FB]           //FB aufrufen
      AUF   DI [#M_INST_DB_TEMP]        //InstDB-Register wiederherstellen
      ...

Das funktioniert und verursacht auch keinen SF-Fehler bei der SPS. Die Adressen vom entsprechenden InstanzDB sind bekannt und verändern sich auch nicht.

Soweit klappt das also mit FBs. Wenn jemand eine bessere Lösung als die obige kennt, dann wäre ich für eine Info sehr dankbar :D .

Was mir noch eingefallen ist, wie mache ich das bei einem FC? Der hat doch keinen InstanzDB, den ich zur Parameterübergabe ansprechen könnte? Weiß hier jemand Rat? :confused:

Danke und Gruß!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
ich hoffe, du hast dabei berücksichtigt (Godi hat das auch schon angedeutet), dass du FB's und Instanz-DB's nicht wild miteinander kreuzen kannst. Der I-DB beinhaltet ja unter anderem auch die Aufruf-Parameter und die interenen STAT-Variablen. Die müßten dann bei allen deinen FB's / I-DB's gleich sein ...

Gruß
LL
 
Hallo Larry,

das sollte eigentlich kein Problem sein (hoffe ich zumindest). Es handelt sich bei den aufzurufenden FB immer um den selben. Ich weiß bloss nicht, welche FB-Nummer der hat, da diese ja variabel vom Endanwender vergeben werden kann. Außerdem versorge ich ja "nur" die Eingangsparameter des FB mit Daten und frage höchsten noch mal einen Ausgangsparameter ab. Alle anderen Parameter werden nicht angetastet. Ich denke der Knackpunkt liegen eben darin, jedesmal den richtigen InstDB ins DI-Register zu laden und entsprechend vorher zu sichern.

Soweit funktioniert das ganze ja auch, aber wie gesagt, wenn irgendjemand da draußen eine bessere Lösung hat (vor allem auch, wie man das bei einem FC machen könnte, dann bitte eine Info an mich.
DANKE! ;)
 
Hallo,
also ohne deine Anwendung genauer zu kennen fällt mir sonst auch nichts mehr dazu ein.
Was ich nur nicht verstehe ist : Du sagst, dass du immer den gleichen FB verwenden willst, dass es nur von Projekt zu Projekt anders heißt. Das riecht für mich eigentlich nach mehreren Instanzen (also Direkt-Aufrufen).
Hast du übrigens schon einmal (in dem Zusammenhang) mit dem Eingangs-Parameter "Block-DB" herumgespielt ? Einen "Block-DB" kannst du einem FB nämlich auch als Aufruf-Parameter übergeben. Wenn der gleiche FB nur anders heißt, so kann man das auch über symbolische Adressierung lösen ...

Aber wie schon gesagt ... ich kenne deine Anwendung nicht genauer ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Larry,

danke für die Tipps! Das mit dem "BLOCK_DB" und "BLOCK_FB" habe ich bis jetzt noch nie ausprobiert. Da muss ich erst ein bischen rumprobieren. Klingt aber sehr interessant.

Als Multiinstanz geht das ganze aber auch nicht, da der aufzurufende FB nicht multiinstanzfähig ist. Und ich meine, bei Multiinstanzen müssen alle FB multiinstanzfähig sein (stimmt doch, oder?). :confused:

Symbolische Adressierng fällt auch weg, da der Baustein auch gerne mal vom Anwender einen anderen Namen bekommt.

Aber was zur Anwendung:
Es existiert ein FB (Sendebaustein) für ein Profibus-CAN-Gateway. Dieser Sende-FB nimmt als Eingangsparameter Eigenschaften einer CAN-Nachricht entgegen (z.B. ID-Nummer, DLC, Datenbytes 1 bis 8, etc.) und schreibt diese Daten an die A-Adressen des Profibus-CAN-Gateways, welches daraus eine CAN-Nachricht generiert.
Ich möchte nun einen Baustein erstellen, der für einen SDO-Transfer genommen werden kann (SDO als expedited transfer, CANopen). Mein SDO-Baustein nimmt also entsprechende Eingangsparameter (Node-ID, Index, Subindex, etc.) entgegen, verwurschelt die intern und übergibt diese Parameter an den Sendebaustein für das Profibus-CAN-Gateway. Dazu muss aber mein SDO-Baustein den Sendebaustein intern aufrufen. Und da fangen die Probleme an, weil alles eben bibliotheksfähig sein soll.

Gruß! ;)
 
Hallo,
mehrere Instanzen ist nicht dasselbe wie Multi-Instanzen.

Multi-Instanz heißt, dass du den FB in die Instanz eines anderen FB's intergrieren kannst, also keinen 2. I-DB benötigst sondern den von dem aufrufenden FB mitbenutzen kannst. Das haben aber andere Leute hier im Forum schön viel schöner erklärt wie ich jetzt. Vielleicht zu dem Thema mal die Suche bemühen.

Ansonsten: bei Einsatz von Block_FB und Block_DB bitte beachten, dass der I-DB zu dem FB nicht automatisch mit erzeugt wird. Den mußt du (oder der Anwender) dann seperat generieren. Ich halte das auch nicht unbedingt für praktisch - das trifft auch für deine andere Vorgehensweise zu.

Bei deinem beschriebenen Problem sehe ich im Moment keinen Widerspruch zu meinem Vorschlag mit dem symbolischen Aufruf. Du verlangst halt von dem Anwender, dass der Name deines Bausteins nicht geändert wird. Warum sollte der auch "gerne vom Anwender" geändert werden ...?

Gruß
LL
 
Hallo,

danke für die Hinweise! :D

Aber was ist eigentlich der genaue Sinn von "BLOCK_DB" und "BLOCK_FB"?
Ich kann doch einen DB anstelle von so:

...
VAR_INPUT
DB_NUMMER //Datentyp BLOCK_DB
END_VAR
...
AUF #DB_NUMMER
...

auch so öffnen:

...
VAR_INPUT
DB_NUMMER //Datentyp INT
END_VAR
...
L #DB_NUMMER
T #DB_NUMMER_ZWISCHENMERKER
AUF DB [#DB_NUMMER_ZWISCHENMERKER]
...

Ist im letzteren Fall halt ein bisschen mehr Tipp-Arbeit, bin aber dafür wesentlich flexibler in der Anwendung (DB- oder DI-Register etc.).


Ähnlich ist das auch mit BLOCK_FB.
Ich kann doch anstelle von so:

UC #FB_NUMMER //Datentyp BLOCK_FB

auch so:

UC FB [#FB_NUMMER] //Datentyp WORD

Oder sehe ich das falsch? :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
mit Block_FB habe ich noch nicht gearbeitet ... war noch kein Anwendungsfall dafür gegeben ...
Block_DB kannst du auch kannst du auch an einen FB-Aufruf anhängen :
Code:
DB_Test : Block_DB ;
 
call fb100 , DB_Test
Außerdem wird dir die DB-Parameterierung in der Referenz-Liste mitgeführt.
 
Hi,

komischerweise funktioniert:

CALL FB100, DB_NUMMER //Datentyp BLOCK_DB

aber nicht:

CALL FB_NUMMER, DB_NUMMER //Datentyp BLOCK_FB, BLOCK_DB

Schade! :twisted:
Das wäre nämlich genau die perfekte Lösung für mein Problem.

Soweit funktioniert mein SDO-FB mit meiner Bastellösung ja schon. Ich freue mich schon auf die nächsten Probleme... :mad:



In diesem Sinne...

Erst mal vielen Dank an alle! :)
 
Hallo Experten,

bei der Durchsuchung des Forums habe ich nichts passendes zu meinem Problem gefunden, deswegen meine Anfrage.

Das Problem ist folgendes:
Ich möchte einen bestimmten Funktionsbaustein (FB) und eine bestimmte Funktion (FC) in einem anderen Funktionsbaustein aufrufen. Der Aufruf soll aber indirekt erfolgen und die aufgerufenen Bausteine sollen mit Parametern versorgt werden. Ich würde als Eingangsparameter meines "Hauptfunktionsbausteines" die aufzurufende FB-Nummer verwenden, um einen speziellen Funktionsbaustein aufzurufen. Das funktioniert mit Datenbausteinen ja auch.

Wer kommt denn auf so eine Schnapsidee ? Wundere dich nicht,wenn du dir mit dieser Konstruktion gewaltig ins Knie schiessen tust :???:
 
Mir ist nicht klar, wieso man eine (FC/FB-)Bausteinnummer als Parameter übergeben muss. Den Aufruf kann man über den EN-Eingang notfalls unterdrücken - oder wenn's sein muss auch durch nen Sprung.
Die FC's musst du aber dann wahrscheinlich doch in die CPU laden, was dir, falls es sich nicht um eine Soft-SPS handelt ruckzuck deinen Speicher vollhaut.
Und wie stellst du dir den Aufruf des Master-FB's vor? Wieviel Parameter willst du denn übergeben?
Wie willst du bei der IBN deine FC's beobachten, wenn mal was nicht so tut wie's es soll?
Hast du schonmal mit lib's gearbeitet in S7?
 
Schnapsidee

meine Meinung - wenn auch nicht repräsentativ:

wer sowas macht gehört öffnentlich hingerichtet!!!!!!!!!!

Monty
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

anscheinend hab ich da ganz schön was losgetreten! :???:

Also nur zu Info:
Ich habe weder SPS-Technik gelernt, noch sonst irgendwie Kontakt zu irgendwelchen SPSen gehabt. Alles was ich über SPS/STEP7 etc. weiß, habe ich mir in den letzten 1,5 Jahren mühsam selbst beibringen müssen. Das man da natürlich nicht zum perfekten SPS-Programmierer aufsteigt und Fehler macht, ist doch irgendwie klar, oder?

Und jetzt hab ich eben das schon beschriebene Problem vor mir liegen und muss irgendwie eine Lösung finden. Deswegen fragt man doch Leute, die sich damit besser auskennen. Ich denke mir diese Probleme doch nicht aus.

Mir gefällt diese Lösung natürlich auch nicht. Ist irgendwie gepfuscht und ich hasse Pfuschlösungen, aber was soll ich denn sonst machen, wenns nicht anders geht? Ich lasse mich gerne eines besseren belehren. Für Lösungsvorschläge bin ich jederzeit offen. :)

@kiestumpe:
Wie ist das mit den Libs in S7? Was meinst du damit?

Grüsse! ;)
 
Ja, dann Beschreib doch mal die Anwendung, die du damit erschlagen willst-ich glaub, ich bin nicht der einzigste, der sich unter deinem Problem nichts drunter vorstellen kann.

Aber ich meine du bist irgendwie auf dem Holzweg, also nochmal wozu brauchst du diesen Bausteinnummernübergabe ???

Der Weg sich das meiste
"learning-by-doing" beizubringen ist übrigens nichts aussergewöhnliches
 
Ja, dann Beschreib doch mal die Anwendung, die du damit erschlagen willst-ich glaub, ich bin nicht der einzigste, der sich unter deinem Problem nichts drunter vorstellen kann.
Ich habe mir den Beitrag auch schon ein paar mal durchgelesen und mich gefragt was das soll:confused:

Darum auch meine Bitte an Supervisor: Beschreibe doch mal deine Aufgabestellung. Vielleicht gibt es ja noch andere, einfachere Lösungswege.
 
Zurück
Oben