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

Ergebnis 1 bis 9 von 9

Thema: Aktionen zu FB's und Lokale Variablen

  1. #1
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard


    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
    Zitieren Zitieren Aktionen zu FB's und Lokale Variablen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    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

  3. #3
    Registriert seit
    01.06.2007
    Beiträge
    56
    Danke
    0
    Erhielt 20 Danke für 20 Beiträge

    Standard

    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

  4. #4
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard

    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[i];
    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...

  5. #5
    Registriert seit
    02.09.2007
    Ort
    Wels, Austria
    Beiträge
    61
    Danke
    0
    Erhielt 11 Danke für 9 Beiträge

    Standard

    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.
    Angehängte Grafiken Angehängte Grafiken
    • Dateityp: jpg RBG.jpg (60,9 KB, 17x aufgerufen)
    Zitieren Zitieren Auf Lokale Variablen des FBs zugreifen  

  6. #6
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard

    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)

  7. #7
    Registriert seit
    02.09.2007
    Ort
    Wels, Austria
    Beiträge
    61
    Danke
    0
    Erhielt 11 Danke für 9 Beiträge

    Standard

    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

  8. #8
    Registriert seit
    01.06.2007
    Beiträge
    56
    Danke
    0
    Erhielt 20 Danke für 20 Beiträge

    Standard

    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[i].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

  9. #9
    Majestic_1987 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.07.2008
    Ort
    Aachen
    Beiträge
    270
    Danke
    2
    Erhielt 21 Danke für 20 Beiträge

    Standard


    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....

Ähnliche Themen

  1. Lokale Variablen und Instanz DBs ersetzen
    Von zandour im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 22.05.2011, 17:39
  2. lokale Variablen auf Client
    Von derwestermann im Forum HMI
    Antworten: 0
    Letzter Beitrag: 06.03.2009, 13:47
  3. Lokale Variablen
    Von Mujo im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 23.08.2007, 18:53
  4. Lokale Variablen in SCL
    Von Climber im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 05.02.2007, 11:57
  5. Pointer für lokale Variablen erstellen
    Von neuer_user im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 10.10.2006, 12:02

Lesezeichen

Berechtigungen

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