Aktionen zu FB's und Lokale Variablen

Majestic_1987

Level-1
Beiträge
270
Reaktionspunkte
22
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

Also, folgendes ist mein Vorhaben:

Ich habe einen FB, welcher ein Gerät abbildet. Dieses Gerät wird deswegen von einem FB abgebildet, weil es konfiguriert werden muss. Die Konfigurationsdaten müssen natürlich über die Laufzeit hinaus erhalten bleiben.

Darüber hinaus benötige ich dieses Gerät sehr häufig.

Daher habe ich sämtliche Daten innerhalb des FB gekapselt.

Beispiel:

VAR
bEinschalten AT %I*: BOOL; (*Ein Einschalt-Bit aus der Peripherie*)
iConfig: INT; (*Eine beispielhafte Variable zur Konfiguration*)
END_VAR

Jetzt gibt es ein Problem:

Die Konfigurationsvariablen möchte ich von aussen beeinflussbar machen. Ich müsste also auf diese aus dem aufrufenden Baustein/Programm auf diese zugreifen können.

Als VAR_INPUT kann ich die nicht deklarieren, da ich die Geräte als Array erzeuge

Geraete: ARRAY[1...10] OF Geraet;

und die Konfiguration eines spezifischen Geräts über den Index dieses Geräts anpassen können will/muss:

Geraete[1].iConfig := 5;
Geraete[2].iConfig := 7;
....

Wie kann ich das realisieren? Kann ich mir da irgendwie die Aktionen, welche man für einen FB erzeugen kann, zu Nutze machen?

Wäre super, wenn jemand eine Idee hat.

Gruß

Sven
 
Hallo Sven,
so ganz habe ich dein Vorhaben nicht durchblickt.
Was mir aber spontan dazu einfällt :
- den von außen manipulierbaren Bereich könntest du als IN_OUT deklarieren.
- wenn du mit mehreren Geräten arbeitest, dann doch wahrscheinlich immer nur mit einem auf einmal. Du könntest das gewünschte Gerät durch eine von außen an den FB angelegte Index-Nummer anwählen.

Du würdest dann, wenn du nach meinem Vorschlag vorgehst, den FB mit der gleichen Instanz im Programm öfters aufrufen - nur halt mit unterschiedlichem Index.

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Sven

Zugriff auf Lokale Variablen von auserhalb des Bausteins ist nur über Pointer Möglich.

Meine Lösung wäre:
1. Die Daten wo zugegriffen werden sollen in einer Strucktur Programmieren
2. Im Baustein diese als Variable Deklarieren.
sData := MyDataType ;
3. ein Pointer im Baustein Deklarieren der auf die Strucktur Zeigt
pData : Pointer TO MyDataType ;
4. im Baustein die Adresse Zyklisch zuweisen
pData := ADR (sData);

jetz kannst du die Daten von außen Schreiben.
fbx.pData^.MyVariable := xy ;

mfG Jochen
 
Also Larry,

das wäre mir auch in den Sinn gekommen, ist aber nich so einfach machbar.

Das ganze soll so funktionieren:

Ich habe, zum Beispiel, 100 Pumpen.
Jede Pumpe kann konfiguriert werden....z.B. Motor-Nennleistung, Maximale Drehzahl, Minimale Drehzahl, Elektrische Bezeichnung,...

Ich habe also eine Struktur:

TYPE tPumpInterface
Struct
iNominalPower: UINT;
iMaxSpeed: UINT;
iMinSpeed: UINT;
strElecDesignation; STRING(20);
End_Struct
END_TYPE

Diese ist Lokaldatum des für die Pumpe erstellten FB. Der Sinn: Ich habe ja 20 Verschiedene Pumpen....und jede muss, zu jeder Zeit, funktionsfähig sein. Die Konfiguration der Pumpe ist natürlich für deren Funktion unabdingbar.

Ich möchte aber von extern an eine Instanz des FB zu parametrierenden Variablen unabhängig sein. Das hat mehrere Gründe:

1. Je mehr Pumpen ich habe, desto mehr Variablen brauche ich. Das frisst unnötig Performance und Speicher, weil die wichtigen Informationen ja bereits mit der Instanz der Pumpe "geliefert" wurden.

2. Möchte ich nicht 100 Aufrufe explizit ausprogrammieren. Sondern z.B. im MAIN (PRG):

VAR
Pumpen: ARRAY [1..100] OF FB_Pump;
END_VAR

FOR i := 1 TO 100 DO
Pumpen;
END_FOR

Das heißt, prinzipiell möchte ich eine Art "Objektorientiertes" Verhalten erzeugen.

Geht auch um ne Leitsystemanbindung:

Ich möchte eine Klasse für die Pumpe erzeugen, welche die Verbindungen für die zugehörigen Variablen kapselt.
Deswegen hätte ich gern einen Zugriff über

.MAIN.Pumpen[x].tPumpInterface.iMaxSpeed

Zu J Schohaus Vorschlag:

Wie genau meinst du, das zu deklarieren? Was im Aufrufenden Baustein, was im FB?
Hatte über Pointer auch schon nachgedacht, aber die Frage ist halt unter anderen, ob ich auch über ADS damit ordentlich arbeiten kann...
 
Auf Lokale Variablen des FBs zugreifen

Wenn Du keinen globalen Speicher für deine Konfiguration der Pumpen zur Verfügung stellen willst, dann ists mit ADS wahrscheinlich nur schwer oder nicht möglich, auf diese Konfiguration (lokale Variable) im Baustein zuzugreifen.
Der Gedanke Speicher sollte doch bei Beckhoff, so nehme ich an, keine Rolle mehr spielen, es sei denn, du verwendest einen BX,BC ext.
Am einfachsten ist es, einen globalen Speicher fder Konfiguration für alle Pumpen anzulegen und dem FB einen Zeiger auf diesen bereich zu geben
also ADR(GlobPara) + (x-1)*SizeOf(tMyStruct);
Im FB hast dann nur den Konfig : Pointer to tMyStruct.
Damit kannst du mit ADS ohne Probleme auf den globalen Bereich zugreifen. VISU z.B

Ich arbeite auch schon mit der CodeSys V3.3, da kann man einiges über Properties lösen, aber das Problem ist immer eine Visu, die auf interne Daten im FB zugreifen will (soll), es sei denn mit der Targetvisu on board.
Ich hatte ja das gleiche Problem wie du, ich habe 1..n Regalfahrzeuge, die als ein FB je Gerät getrimmt sind, die aber auch Eingänge und Ausgänge zur Visu wie Parameter ect. haben. Ich habe es auf die oben beschriebene Weise gelöst, da es auch hier keinen anderen Ansatz gibt.
Es gibt auch in höheren objectorientierten Programmiersprachen keine Möglichkeit, an lokale Variablen eines Objectes heranzukommen, es sei denn, sie sind public und Properties.
 

Anhänge

  • RBG.jpg
    RBG.jpg
    60,9 KB · Aufrufe: 20
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, in .NET kanst du ja in deiner Klasse folgendes tun:


private int iVariable;

...

public int IVariable {get; set;}

Wodurch dann jedes andere Objekt auf die Properties des Objekts deiner Klasse zugriff hätte.

In CoDeSys 3 sollte das doch genau so funktionieren, oder?

Und dann könnte ich auch über ADS auf das Property zugreifen.

Naja egal. TwinCat 3 ist noch nicht auf dem Markt, also anders rangehen.

Das Problem bei deiner Lösung ist eben, dass ich dann wieder ein Globales Array anlegen muss, welches die Konfigurationen enthält...und ich muss dem FB den Index "seiner" Konfig-Struktur geben....wobei ich das ja auch in einer Schleife tun kann....

Ich werde die Variante mal Probieren.
Danke schonmal im Voraus. Schade, wenn das System limitiert xD (Wobei ich für CoDeSys und seie Möglichkeiten enorm dankbar bin....ich mag kein Step7 mehr, seit ich CoDeSys kenne xD)
 
Ja, Step 7 ist einfach zu limitiert und das AWL Gehacke ist auch nicht meines. InstanzDBs, ect. DBs, totale Scheisse, man schlägt sich mit sovielen Sachen herum, die total unnötig sind, man verliert sich in Problemen, wenn man ein Programm mal im Schrittbetrieb debuggen muss ect.
CodeSys V3.x ist schon ganz toll, fehlen aber noch einige Sachen, aber man schoon ganz toll strukturiert und objectorientiert programmieren und hat ne super performance, von der eine S7 nur träumen kann.
Ich persönlich ziehe Beckhoff wegen seiner großen Busvielfalt an, die haben eigentlich alles und es wird sicher super, wenn die auf V3 umspringen, da gehts dann richtig zur Sache.
COdesys ist leider bei der IO-Anbindung etwas im Rückstand, denen fehlt eine Systemmanager wie bei Beckhoff.
Beides zusammen ist dan sicher eine super Sache.
lg aus Österreich
 
Ich hoffe es hilft Dir weiter

FUNCTIONBLOCK FB_Pump

VAR
sData : tPumpInterface ; (* Meine Daten *)
pData : POINTER TO tPumpInterface ;
END_VAR


// PROGRAMM FB_Pump
pData := ADR( sData ) ;
.. Anwenderprogramm



Programm Aufruf

VAR
Pumpen: ARRAY [1..100] OF FB_Pump;
END_VAR

FOR i := 1 TO 100 DO
Pumpen.pData^.iMaxSpeed := 1 ;
(* Zugriff auf die Instanz alle Pumpen den wert 1 zuweisen *)
END_FOR

Pumpen[1].pData^.iMaxSpeed := 2 ;
(* oder Pumpe 1 den Wert 2 zuweisen *)

jochen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jochen,

also deine Version wird mir nicht viel bringen, denn ich kann über ADS sehr wahrscheinlich keine Pointer dereferenzieren.

Habe das Problem jetzt erstmal mit einer IN_OUT-Variable vom Typ "Array of MyStruct" gelöst...funktioniert so, auch wenns mir nicht soooo gut gefällt....
 
Zurück
Oben