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

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

Thema: verschachtelte Übergabe von Variablen (Datenstrukturen)

  1. #1
    Registriert seit
    14.01.2013
    Beiträge
    2
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe ein Programmierproblem und hoffe, dass mir hier vielleicht jemand einen Lösungstip gibt.

    (Programmiert wird in Step 7 mit SCL)


    Ich versuche mal mein Problem zu schildern :

    In einem Global-DB sind mehrere UDT-Variablen gespeichert, der UDT fasst mehere Eigenschaften eines Objektes zusammen.

    Aus dem OB1 wird ein FB aufgerufen und als In_Out-Paremter wird eine (UDT-)Variable aus dem Global-DB übergeben.
    In dem FB wird jetzt die Variable verändert. Nach dem FB Aufruf steht jetzt im Global-DB die veränderte Variable zur Verfügung.
    Soweit funktioniert alles wie gewünscht.

    Jetzt sollen einzelne Funktionen zur Manipulation der Variable in einen FC ausgelagert werden.
    D.h. im FB wird jetzt ein FC aufgerufen, dem wieder als In_Out_Parameter die (Struktur)Variable übergeben werden soll.
    Allerdings wird der Versuch die SCL-Quelle zu übersetzen, mit der Fehlermeldung "Parameterübergabe nicht korrekt" abgebrochen.

    Als erste Hilfe wird jetzt die dem FB übergebene Variable in eine lokale Variable des FB kopiert, diese lokale Variable dem FC übergeben und am Ende die lokale Variable wieder zurück in die übergebene kopiert.

    Das Funktioniert zwar, ist aber natürlich nicht sehr elegant und bläht den Instanz-DB unnötig auf, da es jetzt die Variablen ja quasi doppelt gibt.

    Hoffentlich ist die Erklärung so halbwegs verständlich, und einer von euch kann mir bei der Lösung helfen.

    MfG
    Jasper
    Zitieren Zitieren verschachtelte Übergabe von Variablen (Datenstrukturen)  

  2. #2
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.476
    Danke
    1.140
    Erhielt 1.238 Danke für 971 Beiträge

    Standard

    Die Übergabe an den FB mit InOut ist nur eine Referenz. Deshalb kannst du sie - meines Wissens - nicht im FB an die FC weitereichen.
    Ich löse solche Aufgaben auch immer mit einer lokalen Kopie. Frisst zwar Speicherplatz, ist aber übersichtlich und nachvollziehbar.

    Du kannst das "Problem" vielleicht übergehen indem du Any-Pointer zur Übergabe nutzt.
    Daraus kannst du dann die Adressen im Global-DB ermittlen.

    Gruß
    Dieter

  3. Folgender Benutzer sagt Danke zu Blockmove für den nützlichen Beitrag:

    jasper (15.01.2013)

  4. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Egal ob SCL oder AWL oder ... - das Durchreichen eines zusammengesetzten Datentyps von IN_OUT ist nicht möglich.
    Es geht nur per Umkopieren über eine bausteineigene Variable (TEMP oder STAT).

    Nachteil bei einer Übergabe per ANY-Pointer: die Symbolik und die Datentypen gehen verloren. Deshalb müsste man erst wieder auf einen lokalen UDT kopieren. Und der ANY selber muß zum Durchreichen auch erst kopiert werden. Und man muß selber darauf achten, daß der am ersten Baustein übergebene STRUCT nicht in TEMP liegt.

    Zitat Zitat von jasper Beitrag anzeigen
    bläht den Instanz-DB unnötig auf
    Lege die lokale Kopie der Variable in den TEMP-Bereich, dann vergrößert es nicht den Instanz-DB.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    jasper (15.01.2013)

  6. #4
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.476
    Danke
    1.140
    Erhielt 1.238 Danke für 971 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Lege die lokale Kopie der Variable in den TEMP-Bereich, dann vergrößert es nicht den Instanz-DB.
    Damit hab ich heut selber einen Griff ins Klo getätigt ... Man muß dabei natürlich Schachtelungstiefe und max. Lokaldatengröße beachten.
    Da ich den Instanz-DB in diesem Fall nicht bei laufender Anlage ändern konnte, bin ich entgegen meiner Gewohnheit auf Lokaldaten ausgewichen.
    Tja, manchmal verliert man und manchmal gewinnen die anderen

    Gruß
    Dieter

  7. #5
    Registriert seit
    07.09.2011
    Beiträge
    101
    Danke
    17
    Erhielt 16 Danke für 12 Beiträge

    Standard

    Zitat Zitat von Blockmove Beitrag anzeigen
    Man muß dabei natürlich Schachtelungstiefe und max. Lokaldatengröße beachten.
    Hallo Dieter,

    kommt da keine Fehlermeldung?
    Da steige ich lieber wieder auf Assembler um…

    Der Wutbürger

  8. #6
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.476
    Danke
    1.140
    Erhielt 1.238 Danke für 971 Beiträge

    Standard

    Zitat Zitat von Wutbürger Beitrag anzeigen

    kommt da keine Fehlermeldung?
    Da steige ich lieber wieder auf Assembler um…
    Doch, im Diagnosepuffer Sprich wenn der Prozessor steht.

    Gruß
    Dieter

  9. #7
    jasper ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.01.2013
    Beiträge
    2
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo zusammen,

    vielen Dank für eure Antworten und Unterstützung.

    Mit dem vermeintlichem "Notbehelf", dem kopieren in eine lokale-Variable, lebe ich jetzt schon länger.
    Jetzt wo ein neues größeres Projekt vor der Tür steht, sollten die FBs mal aktualisiert werden und dieses Kopieren erschien mir schon länger als nicht optimale Lösung.

    Ein kopieren in den Temp-Bereich kommt leider nicht in Frage.

    MfG
    Jasper

  10. #8
    Registriert seit
    28.07.2008
    Beiträge
    68
    Danke
    1
    Erhielt 33 Danke für 19 Beiträge

    Standard

    Hallo zusammen.
    Ich hätte eine Lösung des Problems anzubieten. Allerdings nur für AWL. Ob dies auch in SCL möglich ist, kann ich nicht
    sagen. Hierzu sollte sich dann einer unserer SCL Spezialisten äußern.
    Nun aber:
    Wenn wir einen FB haben, der einen INOUT vom Typ UDT besitzt, so wird dieser wie alle anderen Parameter im IDB des FB
    abgelegt. Da es ein INOUT ist, wird allerdings nicht die ganze Struktur, sondern nur ein Pointer abgelegt, und dieser übergeben.
    Wird in diesem FB nun ein FC aufgerufen, der ebenfalls einen INOUT vom Typ UDT besitzt, kann dieser Pointer nicht direkt an den
    FC weitergegeben werden. Beim FC CALL wird ein Pointer aufgebaut. Dieser sollte nun den Inhalt des FB Pointers bekommen, nicht aber
    einen Pointer auf einen Pointer bilden. Dies ist der Grund, warum ich diesen Parameter nicht weitergeben kann.
    Die Lösung ist nun, dem FC einen Pointer zu geben, der nicht auf einen Pointer zeigt, sondern den Inhalt des FB Pointer enthält.
    Dies kann allerdings nur über eine AWL Quelle programmiert werden, da ein UC Call mit Parametern nicht im Editor versorgt werden kann.
    Code:
    FUNCTION_BLOCK FB 1
    VAR_IN_OUT
      IN_OUTUDT : UDT 1; 
    END_VAR
    VAR_TEMP
      VKE_SPEICHER : BOOL;
      AR1_SPEICHER : DWORD;
      AR2_SPEICHER : DWORD;
      POINTER_DB   : WORD;
      POINTER_ADDR : DWORD;
    END_VAR
    BEGIN
    NETWORK
          =     VKE_SPEICHER;
          TAR2  AR2_SPEICHER; 
          TAR1  AR1_SPEICHER; 
          L     P##IN_OUTUDT;
          LAR1;
          L     DIW [AR1,P#0.0]; 
          T     POINTER_DB; 
          L     DID [AR1,P#2.0]; 
          T     POINTER_ADDR; 
          LAR1  AR1_SPEICHER;
          
          UC    FC     1 { P#POINTER_DB };
          LAR2  AR2_SPEICHER;
    END_FUNCTION_BLOCK
    Dies ist nun der FB, der den FC aufruft.
    Dabei wird aus dem IDB des FB der Inhalt des Pointers in einen temporären Pointer des LSTACK des FC aufgebaut.
    Da im TEMP Bereich kein Pointertyp projektiert werden kann, wird der Pointer getrennt definiert.
    Das AR2 Register muss vorher gesichert und nach dem UC wieder restauriert werden. Das AR1 wird kurzfristig benutzt und wieder
    restauriert.
    Hiermit wird nur ein Pointer übergeben, es muss nicht die ganze Struktur umkopiert werden.
    Alle Adressen sind nicht absolut sondern relativ verwendet.
    Daher sollte dieses Beispiel allgemeingültig sein!
    Da ein Pointer auf den IDB geladen wird, ist dieses Beispiel noch NICHT multiinstanztauglich.
    In diesem Fall muss noch das AR2 Register berücksichtigt werden.
    VORSICHT!
    Wenn der FC1 ausser dem UDT noch weitere Parameter besitzt, müssen diese für den UC Call in korrekter Form
    übergeben werden! Dies ist hier nicht beschrieben!
    mfg
    Linus

  11. Folgende 2 Benutzer sagen Danke zu LinusAM4V für den nützlichen Beitrag:

    Blockmove (15.01.2013),Thomas450 (23.04.2013)

  12. #9
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.476
    Danke
    1.140
    Erhielt 1.238 Danke für 971 Beiträge

    Standard

    Wie sieht das ganze eigentlich in AWL nach dem überstetzen aus?
    Ist der "Trick" nur, dass in AWL-Quellen der Editor die Parameter beim Einfügen eines FCs nicht einfordert?

    Gruß
    Dieter

  13. #10
    Registriert seit
    28.07.2008
    Beiträge
    68
    Danke
    1
    Erhielt 33 Danke für 19 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Blockmove.
    Der Umweg über die Quelle ist notwendig, um den Parameter am UC anzuparametrieren.
    In AWL sieht der Call dann identisch der Quelle aus.
    Der Call selber hat dann auch 2 Zeilen:

    UC FC1
    P#L10.0

    Die zweite Zeile ist mit dem Editor nicht machbar, und sollte auch nicht versucht werden zu editieren!
    mfg
    Linus

  14. Folgender Benutzer sagt Danke zu LinusAM4V für den nützlichen Beitrag:

    Blockmove (15.01.2013)

Ähnliche Themen

  1. WinCC Übergabe von Variablen
    Von Shino im Forum HMI
    Antworten: 2
    Letzter Beitrag: 18.02.2009, 10:13
  2. Antworten: 17
    Letzter Beitrag: 14.08.2008, 14:45
  3. FUP Kopieren von Datenstrukturen
    Von dinner4one im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 10.06.2008, 17:29
  4. Antworten: 3
    Letzter Beitrag: 07.03.2008, 11:09
  5. Übergabe von Parametern
    Von Thomas86 im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 17.04.2007, 08:57

Lesezeichen

Berechtigungen

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