# Funktionsbaustein löschen mit Strukurierten Text ST



## GatherKnowledge! (17 Mai 2019)

Hallo zusammen,
ich würde gerne mit ST innerhalb von Programm1 einen Funktionsbaustein in Programm2 löschen.

Hintergrund:
 Ich habe zwei Funktionsbausteine, die nicht koexistieren können ( so was wie ein Instanzlimit).
Damit soll verhindert werden, dass zwei Handler den gleichen USB Anschluss bearbeiten.
Allerdings ist benötige ich unbedingt beide Funktionsbausteine (am besten in unterschiedlichen Programmen)
Ich programmiere gerade in ST.
Nachdem ich einen FB schon im ersten Programm aufgerufen habe, gehe ich, mithilfe einer weiteren Visu per Visuframe wechsel, zum zweiten Programm.
Jetzt kann ich dort den FB nicht richtig ausführen, weil scheinbar das Instanzlimit überschritten worden ist.
Also müsste ich jetzt erst den alten FB löschen um den neuen aufzurufen.
Allerdings scheint sowas in Codesys nicht vorgesehen zu sein.
Ist ja im Prinzip auch nicht besonders logisch, nur bei meinem Projekt explizit gefordert.

Was ich verwende: Codesys 3.5.14 

Falls jemand dazu was weiß (muss nicht unbedingt ST sein) und es hier reinschreiben könnte oder wenigstens einen Link reinhauen könnte, wäre das super!
Ansonsten bin ich auch offen für alternative Herangehensweisen, irgendwie beide FBs aufzurufen, ohne den einen zu löschen.

Code Fragmente:
so sieht meine Main aus. Hier rufe ich die verschiedenen Programme aus.

```
case page of
  0:prg_home()
  1:prg_test1()
  2:prg_test2()
end_case
```

so sieht mein erstes Programm aus:

```
program test1
var
  meinFB:Bibliothek.USBHandler;
end_var
init();
setFBInputs();
meinFB();
```

so sieht mein zweites Programm aus:

```
program test2
var
  meinFB:Bibliothek.USBHandlerMulti;
end_var
init();
setFBInputs();
meinFB();
```


----------



## Guga (17 Mai 2019)

Der einzige mögliche Ansatz wäre das du den Baustein dynamisch instanziierst/löschst.
also mit __New bzw __Delete.


Aus Interesse: Was für einen HW-Bezug hat den dein USB-Handler-Baustein das er eine bzgl. diese Resource nur einmal nutzen kann? 

Guga


----------



## PN/DP (17 Mai 2019)

Ich habe mit Codesys V3 keine Erfahrung, doch ich wundere mich: Wieso sollten nicht zwei FB-Instanzen gleichzeitig existieren können? Wo ist da das Problem? Reicht es nicht, einfach immer nur eine der beiden FB-Instanzen aufzurufen (oder aufrufen zu lassen)? Oder kann vielleicht nur eine/selbe Instanz abwechselnd von 2 Programmen genutzt werden? Muß die SPS-Anwendung überhaupt auf mehrere sich gegenseitig ausschließende Programme aufgeteilt werden?

Harald


----------



## GatherKnowledge! (23 Mai 2019)

Danke für die schnellen Antworten!


@Guga:den exakten HW Bezug kann ich leider nicht einsehen, da die beiden FBs aus einer Bibliothek kommen, in die ich keine Einsicht habe.
Die Bibliothek wurde mir nur vorgeschrieben, damit ich überhaupt mein Projekt machen kann.
Ich vermute mal, dass beide FBs gerne eine Vorbereitungs-flag bei der Deklaration im Gerät setzen wollen, dann aber was vom anderen FB merken und erst gar nicht mit dem arbeiten anfangen wollen.  
Dein Ansatz scheint mir interessant und durchführbar. Ich lese mich gleich ein und probiere das mal bei mir aus.


@Harald:
Die FB Instanz kontrolle machen die FBs intern aus. Wenn einer was vom anderen merkt, gibt der als Output immer eine Fehlermeldung zurück.
Bis jetzt hatte ich ja zwei verschiedene Programme, (siehe Programm 1 und Programm 2)die einen der beiden FBs hatte und nur ausgeführt wurde, wenn man gerade die jeweilige Seite (switch case mit page) aufgerufen hatte.
Theoretisch hätte Programm1 gut laufen sollen. Programm2 wurde nie aufgerufen, FB2 wurde damit auch nie verwendet, FB1 wurde zum ersten mal verwendet.
Trotzdem hat der FB von Anfang an gestreikt. Also muss bereits bei der Compilierung, bzw bei der deklaration in der HW was passiert sein, damit beide FBs sich bemerkt haben, noch vor allen Aufrufen. (Bei dem Teil bin ich mir nicht 100% sicher, da ich mich bei Compilierung, Deklaration, Definition & co. und wann wer bereits was machen kann, in Codesys nicht so genau auskenne)

Grüße,
GatherKnowledge!


----------



## Guga (23 Mai 2019)

@Harald.
Es gibt in CoDeSys die Möglichkeit über FB_Init kann Initialisierungs-User-Code aufzurufen.
Möglicherweise hat der Architekt der Bibliothek irgendwelche Resourcen (z.B. globale Variablen der Bibliothek) "konfiguriert" in der Annahme "es kann nur einen geben".

Das ist halt leider der Preis das man viel machen kann. Und jeder hat halt eine Lernkurve mit entsprechenden Konsequenzen.

Guga


----------



## PN/DP (23 Mai 2019)

Gibt es denn in Codesys eine Möglichkeit, mit nur einer FB-Instanz für beide "program" zu arbeiten? Warum ist das Programm hier auf 2 "program" aufgeteilt (die sich anscheinend gegenseitig nicht "mögen") - muß das sein?

Harald


----------



## Guga (23 Mai 2019)

Die Bezeichnung hier "Program" ist hier eine POU (IEC-Name) = Programmable Organisation Unit....

Nach dem was ich Gatherknowledge verstanden habe benutzen bei zwei unterschiedlichen instanziierten Bausteinen eine Resource (Fehlermeldung von Baustein 1 wird in Baustein 2 ausgegeben).
Da es nun möglich ist das die Bausteine wiederum andere Elemente der Bibliothek zu nutzen kann es schon sein das es zu Konflikten kommt wenn die Bausteine die Resourcen "allokieren".
FB_Init() wird 1x automatisch aufgerufen wenn eine Instanz existiert.
Wenn nun z.B. Referenzen über FB_Init() gesetzt werden oder oder oder hätte man genau das Verhalten.

Guga


----------



## oliver.tonn (24 Mai 2019)

Sollen denn beide Programme auf den selben USB-Anschluss zugreifen?


----------



## IBFS (3 Juni 2021)

wie ist den die Aufruf Hierarchie dieser Bausteine komplett?

mit

IF (...)
THEN
   Aufruf1();
ELSE
   Aufruf2();
END_IF

oder

CASE  ...

0:    .. kein Aufruf/MemSet aller Datenfelder/Init 
1:    ..    Aufruf1();
2:    ..    Aufruf2();

sollte es doch gehen, oder?


----------



## JSEngineering (3 Juni 2021)

Moin,

wäre interessant, wenn Du schreibst, was die Bausteine denn auf der USB-Schnittstelle machen...

Aus dem wenigen, was ich bisher sehe, folgere ich Folgendes:

Du hast einen Controller, auf dem Du mehr als ein Programm ausführen kannst.
Damit solltest Du in der Lage sein, neben Deinen beiden Hauptprogrammen ein drittes Programm zu laden.
In dieses dritte Programm würde ich nun den USB-FB auslagern und da ein Handling drum rum bauen, so daß die beiden anderen Programme jeweils nur abwechselnd drauf zugreifen können. Dann hast Du nur einen FB, der auf USB zugreift, hast aber das Handling, wer wann was macht, in der Hand.

Ich mache Ähnliches beim Schreiben auf USB: Das Schreiben auf USB frißt bei meiner CPU eine Menge Ressourcen und wenn mehr als 1 Schreibvorgang gleichzeitig stattfindet, kann das schonmal einen Watchdog auslösen. Also habe ich nur eine universelle Schreiibfunktion, die das Schreiben erledigt. Die anderen Programmteile bzw. Tasks schreiben jetzt in einen FIFO bzw. bekommen reihum einen Token. So ist sichergestellt, daß es nicht mehr als einen Schreibzugriff gleichzeitig gibt.


----------



## DeltaMikeAir (3 Juni 2021)

Ob das den TE nach >2 Jahren noch interessiert. Er war auch schon über 2 Jahre nicht mehr online


----------



## JSEngineering (3 Juni 2021)

DeltaMikeAir schrieb:


> Ob das den TE nach >2 Jahren noch interessiert. Er war auch schon über 2 Jahre nicht mehr online


Hab ich nicht gesehen, hab nur das Thema unter Aktuelles gesehen  
Hast wohl recht, aber vielleicht hilfts ja in Zukunft jemand über die Suchfunktion...


----------

