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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: S7-1500 SCL Any Pointer auf UDT zuweisen

  1. #11
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von kamikaaze Beitrag anzeigen
    Zu Vorschlag A:
    Bei deinem Vorschlag müsste ich den "Session-Bearbeiten"-FC mehrfach aufrufen?
    Nein, nicht mehrfach aufrufen, sondern einen Baustein als "Wrapper" um die FC-Aufrufe legen und das Kopieren von #SESSION zur Arbeitskopie und zurück zu #SESSION im selben Baustein, und dazwischen die *_Add_*-Bausteine aufrufen:
    Code:
    FUNCTION FCxxx : VOID
    
    VAR_IN_OUT
      SESSION : tHSC_Session;
    END_VAR
    
      "MyTempDB".Arbeitskopie := SESSION; //Session-Start
    
      HSC_Session_Add_Any(...);
      HSC_Session_Add_Bool(...);
    
      SESSION := "MyTempDB".Arbeitskopie; //Session-End
    
    END_FUNCTION
    (classic SCL)

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  2. #12
    kamikaaze ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.06.2009
    Beiträge
    11
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Ok. Habs jetzt verstanden

    Nicht böse sein, wenn ich das so nicht umsetzen will, da ich mit Kollegen Arbeite, die SCL "verfluchen" und daher mit der Lösung nicht einverstanden sind... Die brauchen halt ihre klötzchen
    Und ich müsste dann für jede Session einen extra Wrapper-FC erstellen, bzw. sogar 2, da das auswerten der Session am Programmende, nach dem gleichen Prinzip funktioniert.

    Ich bin auf jeden Fall noch weiter am basteln. Vielleicht finde ich ja eine andere Lösung

  3. #13
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.349
    Danke
    452
    Erhielt 692 Danke für 517 Beiträge

    Standard

    Hmm.. unabhängig davon was für die Anwendung die beste Lösung ist.

    Das erzeugen eines ANY von einem UDT am FC-IN geht tatsächlich nicht auf der 1500. Auch wenn man ein 300er-Projekt (wo es so geht), auf eine 1500er migriert, geht es dann nicht mehr.
    Das dürfte beim Migrieren von 300er-Programmen öfters Probleme machen, ich würde mal den Support darauf ansprechen. So kann das ja auch nicht richtig sein, oder?
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  4. #14
    kamikaaze ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.06.2009
    Beiträge
    11
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    falls es noch wen interessiert hier mal der aktuelle Status.

    Der Support von Siemens sagt, dass das erzeugen eines ANY Pointers möglich sein muss!
    Laut deren Aussage, funktioniert das ganze momentan mit TIA V13 nur in einem FB, nicht aber wie in meinem Fall in einem FC, aufgrund eines Fehlers im Compiler.

    Mit etwas Glück wird der Fehler in einer der nächsten Versionen (V14?) behoben.

    Als temporärer workaround habe ich mir einen FC in AWL geschrieben. Hier funktioniert das ganze. Die Lösung mit dem FB war nicht möglich wegen dem benötigten Instanz DB.

    Hier mal der Code für den FC, der mir jetzt einen ANY Pointer erzeugt:
    Code:
    FUNCTION "MOVE_ANY" : Void
    { S7_Optimized_Access := 'FALSE' }
    VERSION : 0.1
       VAR_INPUT 
          IN : Any;
       END_VAR
    
       VAR_OUTPUT 
          OUT : Any;
       END_VAR
    
    
    BEGIN
    NETWORK
    TITLE = Move Any Pointer
          L P##IN;
          LAR1;
    
          L P##OUT;
          LAR2;
    
          L W[ AR1, P#0.0];
          T W[ AR2, P#0.0];
          L D[ AR1, P#2.0];
          T D[ AR2, P#2.0];
          L D[ AR1, P#6.0];
          T D[ AR2, P#6.0];
    NETWORK
    TITLE = Set ENO
          SET;
          SAVE;
    END_FUNCTION
    Aufruf im Programm:
    Code:
    FUNCTION "HSC_Session_Add_Start" : Void
    { S7_Optimized_Access := 'FALSE' }
    VERSION : 0.0
       VAR_IN_OUT 
          SESSION : "tHSC_Session";
       END_VAR
    
       VAR_TEMP 
          pSession : Any;
          _pSession AT pSession : Struct
             ID : Word;
             NBR : Int;
             DBN : Int;
             PTR : DWord;
          END_STRUCT;
       END_VAR
    
    
    BEGIN
        
        (* Save the Pointer to the Session *)
        "MOVE_ANY"(IN := #SESSION, OUT => #pSession);
        "DB_HSC".Temp.pSession := #_pSession;
    
    END_FUNCTION

  5. Folgender Benutzer sagt Danke zu kamikaaze für den nützlichen Beitrag:

    RONIN (19.10.2015)

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 20.04.2015, 15:30
  2. Antworten: 5
    Letzter Beitrag: 13.03.2015, 12:00
  3. Pointer auf udt laden...
    Von Jochen Kühner im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 24.12.2013, 15:12
  4. SCL: Pointer auf Struct in DB
    Von DunderHEAD im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 13.08.2010, 10:05
  5. ANY-Pointer auf UDT mit Bestimmter Länge
    Von RONIN im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 07.08.2009, 07:16

Lesezeichen

Berechtigungen

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