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

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

Thema: Pointer Vergleich AWL -> SCL??

  1. #1
    Registriert seit
    19.07.2007
    Beiträge
    78
    Danke
    14
    Erhielt 2 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    es gibt zwar einen Beirtag der die Frage schon mal beantwortet, aber ehrlich gesagt versteh ich die Antwort dort nicht. Deshalb noch mal die Frage:

    Es geht um einen Bausteinaufruf die Variable Data einen Speicherbereich zugewiesen bekommen soll!

    In AWL würde ich schreiben:
    Data := P#M 20.0 BYTE 100

    Jetzt hab ich aber einen DB und ein Array mit 100 Byte Länge und dem Namen "DB_TCP_OBE".DATA_SEND.
    Wenn ich nun in SCL schreibe:

    Data := "DB_TCP_OBE".DATA_SEND

    Macht mir SCL dann das Gleiche daraus wie AWL im Beispiel oben?

    Danke jetzt schon!
    Grüße Carsten
    Zitieren Zitieren Pointer Vergleich AWL -> SCL??  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Hallo,
    ein ANY-Pointer ist in SCL das Gleiche wie in AWL. In beiden Fällen mußt du den erst zerlegen um dann mit den übergebenen Daten arbeiten zu können.

    Was willst du denn überhaupt machen ? Nach meiner Meinung ist das Angefragte gar nicht das, was du eigentlich haben willst ...

    Gruß
    Larry

  3. #3
    Registriert seit
    19.07.2007
    Beiträge
    78
    Danke
    14
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Ich möchte eine TCP Verbindung herstellen und brauche dafür FB63-66

    Einer davon ist der TSEND FB. Der Aufruf sieht in SCL so aus:

    Code:
    TSEND.DB63(REQ := M63.3 // IN: BOOL
                    ,ID := W#16#1 // IN: WORD
                    ,LEN := 100  // IN: INT
                    ,DATA := DB100.DATA_SEND // INOUT: ANY
                    ); 
         M63.0  := DB63.DONE; // OUT: BOOL
         M63.1  := DB63.BUSY; // OUT: BOOL
         M63.2  := DB63.ERROR; // OUT: BOOL
         MW104  := DB63.STATUS; // OUT: WORD
    Die Zuweisung des Bereichs in dem die zusenden Daten stehen ist Data := ...

    In AWL hab ich das so gehabt:

    Code:
          CALL  FB    63 , DB63
           REQ   :=M63.3
           ID    :=W#16#1
           LEN   :=100
           DONE  :=M63.0
           BUSY  :=M63.1
           ERROR :=M63.2
           STATUS:=MW104
           DATA  :=P#M 20.0 BYTE 100
    Jetzt soll ich das aber in SCL schreiben...

    Danke euch
    Carsten
    Geändert von Carsten77 (16.08.2011 um 10:01 Uhr)

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    ... dann nutze doch vielleicht auch SCL richtig dafür ...

    Was hältst du davon, den TSend mit in deinen SCL-FB einzulagern ?
    Warum gibst du die Rückgabe des Bausteins nicht in einen Datenbereich des SCL-FB's zurück (das geht nämlich auch) ?

    Gruß
    Larry

  5. #5
    Registriert seit
    19.07.2007
    Beiträge
    78
    Danke
    14
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Das hab ich eigentlich so geplant. Die Aufrufe sind alle in einem FB. Allerdings hab ich nen Schnellschuss gemacht um das zu testen und jetzt den zugehörigen DB noch nicht genutzt. Deshalb auch die doofen Merker.

    Aber für die Zeile in der der Bereich der zu sendenden Daten angegeben wird ändert sich dann doch nichts oder?

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Ich würde den Empfangspuffer und den Sendedaten-Puffer auch in der Instanz des Haupt-FB's abbilden. Dann kannst du die Daten-Array's bzw. Struct's (je nachdem, wie du das aufbaust) direkt an den TSend (z.B.) übergeben - SCL baut dir dann den ANY und kümmert sich darum.

    Verstehst du, wie ich es meine ?

  7. #7
    Registriert seit
    19.07.2007
    Beiträge
    78
    Danke
    14
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Nein, ehrlich gesagt nicht wirklich

    Ich hab den FB jetzt mal umgeschrieben damit ich den Instanz DB nutze.
    Das ist mein FB:

    Code:
    //TCP VERBINDUNG 
    VAR_INPUT
        TCONREQ         : BOOL;         // STEIGENDE FLANKE FÜR VERBINDUNGSAUFBAU
        TCONID          : WORD;         // VERBINDUNGS ID TCON   
        TCONConnect     : UDT77;        // VERBINDUNGSPARAMETER UDT77
        
        TSENDREQ        : BOOL;         // STEIGENDE FLANKE FÜR SENDE DATEN
        TSENDID         : WORD;         // VERBINDUNGS ID TSEND
        TSENDLEN        : INT;          // LÄNGE DER DATEN
        
        TRCVEN_R        : BOOL;
        TRCVID          : WORD;
        TRCVLEN         : INT;
        
        TDISCONREQ      : BOOL;
        TDISCONID       : WORD;
    END_VAR
     
    VAR_OUTPUT
        TCONDONE        : BOOL;         // 1 SOBALD VERBINDUNG STEHT
        TCONBUSY        : BOOL;         // 1 WÄHREND DES VERBINDUNGSAUFBAUS
        TCONERROR       : BOOL;         // 1 IM FEHLERFALL
        TCONSTATUS      : WORD;         // RÜCKGABEWERT STATUS DER VERBINDUNG FB65
        
        TSENDDONE       : BOOL;         // 1 SOBALD ALLE DATEN GESENDET
        TSENDBUSY       : BOOL;         // 1 WÄHREND DATEN GESENDET WERDEN
        TSENDERROR      : BOOL;         // 1 FALLS EIN FEHLER BEIM SENDEN AUFTRITT
        TSENDSTATUS     : WORD;         // STATUS FB63
        
        TRCVNDR         : BOOL;
        TRCVBUSY        : BOOL;
        TRCVERROR       : BOOL;
        TRCVSTATUS      : WORD;
        TRCVDATALEN     : INT;
        
        TDISCONDONE     : BOOL;
        TDISCONBUSY     : BOOL;
        TDISCONERROR    : BOOL;
        TDISCONSTATUS   : WORD;
    END_VAR
    VAR
        CONNECTED       : BOOL;  
    END_VAR
    BEGIN
    TCONID      := W#16#1;
    TSENDID     := W#16#1;
    TRCVID      := W#16#1;
    TDISCONID   := W#16#1;
    // AUFRUF FB65 VERBINDUNG AUFBAUEN
    TCON.DB_TCON(REQ    := TCONREQ      // IN: BOOL
               ,ID      := TCONID       // IN: WORD
               ,CONNECT := TCONConnect  // INOUT: ANY
               ); 
     TCONDONE   := DB_TCON.DONE;        // OUT: BOOL
     TCONBUSY   := DB_TCON.BUSY;        // OUT: BOOL
     TCONERROR  := DB_TCON.ERROR;       // OUT: BOOL
     TCONSTATUS := DB_TCON.STATUS;      // OUT: WORD
     
     IF TCONDONE THEN
        TCONREQ     := FALSE;
        CONNECTED   := TRUE;
     END_IF;
     IF CONNECTED THEN
        // AUFRUF FB63 DATEN SENDEN
        TSEND.DB_TSEND(REQ := TSENDREQ   // IN: BOOL
                    ,ID := TSENDID       // IN: WORD
                    ,LEN := TSENDLEN     // IN: INT
                    ,DATA :=  MW100      // INOUT: ANY
                    ); 
         TSENDDONE  := DB_TSEND.DONE;    // OUT: BOOL
         TSENDBUSY  := DB_TSEND.BUSY;    // OUT: BOOL
         TSENDERROR := DB_TSEND.ERROR;   // OUT: BOOL
         TSENDSTATUS:= DB_TSEND.STATUS;  // OUT: WORD
     END_IF;
     
     IF TSENDDONE THEN
        TSENDREQ    := FALSE;
     END_IF;    
    // AUFRUF FB64 DATEN EMPFANGEN     
    TRCV.DB_TRCV(EN_R := TRCVEN_R // IN: BOOL
               ,ID := TRCVID // IN: WORD
               ,LEN := TRCVLEN // IN: INT
               ,DATA := MW102 // INOUT: ANY
               ); 
     TRCVNDR    := DB_TRCV.NDR;         // OUT: BOOL
     TRCVBUSY   := DB_TRCV.BUSY;        // OUT: BOOL
     TRCVERROR  := DB_TRCV.ERROR;       // OUT: BOOL
     TRCVSTATUS := DB_TRCV.STATUS;      // OUT: WORD
     TRCVDATALEN:= DB_TRCV.RCVD_LEN;    // OUT: INT
    // AUFRUF FB66 VERBINDUNG BEENDEN
    TDISCON.DB_TDISCON(REQ := TDISCONREQ// IN: BOOL
                  ,ID := TDISCONID      // IN: WORD
                  ); 
     TDISCONDONE  := DB_TDISCON.DONE;   // OUT: BOOL
     TDISCONBUSY  := DB_TDISCON.BUSY;   // OUT: BOOL
     TDISCONERROR := DB_TDISCON.ERROR;  // OUT: BOOL
     TDISCONSTATUS:= DB_TDISCON.STATUS; // OUT: WORD
     
     IF TDISCONDONE THEN
        TDISCONREQ := FALSE;
        CONNECTED  := FALSE;
     END_IF;
    END_FUNCTION_BLOCK
    Ich muss drei Strings senden.
    - Firmenname
    - Typ
    - Zeichnungsnummer

    Ich hab an den Stellen an den ich nun nicht weiter komme einfach mal zwei MW`s eingetragen damit ich mal übersetzen konnte.
    Wie meinst du muss ich den die Variable nun definieren.
    ARRAY OF [1..3] STRING ??
    und wie gebe ich das dann beim Aufruf an?

    Danke und Grüße
    Carsten

  8. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    ... ich meinte es erstmal so :
    Code:
    zusätzlich zu deinen schon vorhandenen Deklarationen im Bereich VAR :
     
    TConnect : FB65 ;
    TDisConnect : FB66 ;
    TSenden : FB63 ;
    TEmpfangen : FB64 ;
     
    und dann im Code (am Beispiel vom Connect) :
     
    TConnect (REQ := TCONREQ , ID  := TCONID , CONNECT := TCONConnect ); 
    
    die Erfolgs-Bits brauchst du nun nicht mehr abbilden sondern kannst die aus der eingelagerten Instanz verwenden (Beispiel) :
     
    IF TConnect.DONE THEN
        TCONREQ     := FALSE;
        CONNECTED := TRUE;
     END_IF;
    nun willst du etwas senden - den Sende-String hast du auch schon in deinem FB :
    Code:
    IF CONNECTED THEN
        // AUFRUF FB63 DATEN SENDEN
        TSenden (REQ := TSENDREQ   // IN: BOOL
                     ,ID := TSENDID       // IN: WORD
                     ,LEN := TSENDLEN     // IN: INT
                     ,DATA :=  meinFirmenName ); 
    end_if ;
    
    // meinFirmenName ist hier ein String im Bereich VAR, dessen Inhalt passend zugewiesen ist. In demFall könntest du dann sogar bei LEN die tatsächliche Länge des Strings eintragen (Length(meinFirmenName))
    Jetzt etwas klarer ?

  9. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Carsten77 (16.08.2011)

  10. #9
    Registriert seit
    19.07.2007
    Beiträge
    78
    Danke
    14
    Erhielt 2 Danke für 1 Beitrag

    Standard

    Ok, heisst das ich muss den FB63 3 mal hinter einander aufrufen um die drei verschiedenen Strings zu senden?

    Wenn das so ist, dann hab ich es verstanden.

  11. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ... das kommt darauf an, was mit den Daten weiter passiert.
    Wenn sie der Empfänger auch zusammenhängend versteht dann kannst du sie (die 3 Teilstrings) auch miteinander verbinden (Stringlänge max. = 254 Zeichen) und sie als einen String versenden.
    Wie läuft das denn in dem AWL-Baustein jetzt ? 3 einzelne Send's ? Dann mußt du es sehr wahrscheinlich in SCL auch so machen ...

    Gruß
    Larry

    Nachsatz:
    Mir ging es hier vor Allem darum, dass du beim Einsatz von SCL den "neuen" Code auch ein bißchen näher an SCL erstellst ...

Ähnliche Themen

  1. Struct vergleich mit pointer und sizeof
    Von hago10 im Forum CODESYS und IEC61131
    Antworten: 17
    Letzter Beitrag: 31.01.2011, 18:22
  2. Bausteine Vergleich
    Von datasys im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 03.01.2011, 15:05
  3. Bausteine Vergleich
    Von kfz im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 29.07.2010, 15:49
  4. Vergleich AWl <--> SCL
    Von nobug im Forum Programmierstrategien
    Antworten: 6
    Letzter Beitrag: 11.03.2008, 20:11
  5. Vergleich auf Char
    Von lord.paddington im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 01.05.2006, 17:30

Lesezeichen

Berechtigungen

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