Pointer Vergleich AWL -> SCL??

Carsten77

Level-1
Beiträge
78
Reaktionspunkte
2
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuletzt bearbeitet:
... 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
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ?
 
Nein, ehrlich gesagt nicht wirklich :confused:

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
 
... 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 ?
 
... 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 ...
 
Ok, das heisst ich hab jetzt im Prinzip ne Multiinstanz und brauche meine Instantz-DB`s für die FB' 63-66 nicht mehr richtig?
Danke dafür schon mal...

In AWL hab ich ja den Pointer der mir den Beginn des Datenbereichs der zu sendenden Daten zeigt. z.B.

DATA :=P#M 20.0 BYTE 100

Ich hab das so verstanden, dass nun ab M20.0 die folgenden 100Byte gesendet werden. Richtig?

Wenn ja dann war meine Frage, wie ich das genau in SCL darstelle.
 
Zurück
Oben