Scl-any Pointer

johnij

Level-1
Beiträge
823
Reaktionspunkte
75
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
noch einmal eine Frage zum Any Zeiger:
Beisp:

Quelle : ANY;
QuellPointer AT Quelle : STRUCT
SyntaxID : BYTE;
Datentyp : BYTE;
db_Nummer : INT; // Das entspricht 2 Byte
BytePointer : DWORD;// Das entspricht 4 Byte
END_STRUCT;

// D.h QuellPointer soll 1+1+2+4=8 Byte belegen ????

Begin
Quelle:= DB2.DBX0.0

...
Ist es richtig in dem Fall zu sagen :
p#DB2.DBx0.0 Byte 8 (AWL-mäßig) und dass:
SyntaxID, Datentyp (Byte0,Byte1):=DB2.DBW0 [grob geschrieben]
db_Nummer :=DB2.DBW2
BytePointer :=DB2.DBW4
????????????

Danke im Voraus

johnij
 
Hallo,
wenn du an deinen Baustein per ANY-Pointer "P#DB2.DBX0.0" übergibst, dann steht :
im Byte 0 : 10h
im Byte 1 : 01h
im Byte 2,3 als WORD = 0
im Byte 4,5 als WORD = 02 (für DB 2)
im Byte 6 : 84h
im Byte 7,8,9 = 0 (für DBX 0.0)

besser erklären würde sich wenn du übergibst "P#DB2.DBX5.4 Byte 10"
Dann würdest du erhalten :
m Byte 0 : 10h
im Byte 1 : 01h
im Byte 2,3 als WORD = 10 (Anzahl der Bytes)
im Byte 4,5 als WORD = 02 (für DB 2)
im Byte 6 : 84h
im Byte 7,8 = 0
im Byte 9 = b#101100 (für DBX 5.4)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
noch einmal eine Frage zum Any Zeiger:
Beisp:

Quelle : ANY;
QuellPointer AT Quelle : STRUCT
SyntaxID : BYTE;
Datentyp : BYTE;
db_Nummer : INT; // Das entspricht 2 Byte
BytePointer : DWORD;// Das entspricht 4 Byte
END_STRUCT;

// D.h QuellPointer soll 1+1+2+4=8 Byte belegen ????

Begin
Quelle:= DB2.DBX0.0

...
Ist es richtig in dem Fall zu sagen :
p#DB2.DBx0.0 Byte 8 (AWL-mäßig) und dass:
SyntaxID, Datentyp (Byte0,Byte1):=DB2.DBW0 [grob geschrieben]
db_Nummer :=DB2.DBW2
BytePointer :=DB2.DBW4
????????????

Danke im Voraus

johnij

Ähm, ich würde sagen falsch.
Scheint, du hast das noch nicht richtig verstanden.
Der Any-Typ ist nur ein Zeiger auf einen Datenbereich, wobei er so universell ist, daß er Beginn, Länge, Typ gleich mit in sich enthält.
Du hast das so aufgeschrieben, als würde der Zeiger auf sich selbst zeigen, was man im Extremfalle natürlich machen kann, was aber auch wenig Sinn hat.


Im Normalfall geht man so vor:

Anlegen eines Any als IN oder TEMP (was anderes geht auch nicht) eines FC oder FB.
Füllen der Daten des Any-Pointers, also

SyntaxID : BYTE;
Datentyp : BYTE;
db_Nummer : INT;
BytePointer : DWORD;

Aufruf z.Bsp des SFC20 (BlkMove), der diesen Typ als Input erwartet.
 
Im Normalfall geht man so vor:

Anlegen eines Any als IN oder TEMP (was anderes geht auch nicht) eines FC oder FB.
Füllen der Daten des Any-Pointers, ...

... oder wenn man mit SCL und dem Befehl AT herumspielen möchte, dann eine SCL-Function einen Pointer übergeben, ihn mit Hilfe von der AT-Sicht "zerhacken" in Einzel-Variablen und sich die zurückgeben lassen, damit man sieht, was daraus wird ...
 
Danke an alle,
ich habe bissel bei Siemens reingeguckt. Ich habe jetzt keine Angst mehr
vor dem ANY-Zeiger :ROFLMAO: .

Prima Forum.

Gruß johnij
 
Ist es den nun möglich mit dem "AT" Befehl oder einem anderen Befehl Manipulationen im ANY vorzunehemen?

wie ist es beispielsweise möglich aus den DBX5.4 ein 7.0 zu machen?

Gruß
Flo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, das ist möglich, kann man doch aus den Beiträgen oben ersehen, oder? Zuerst muß man aber dazu wissen, wie man mit dem Any selbst umgehen kann (siehe dazu in unserer FAQ, da ist ein super Beitrag drin, der das erklärt). Dann nimmt man den AT-Befehl und legt damit eine Sicht auf seinen Any, schnappt sich die Variable Bytepointer und addiert da 12 dazu (von 5.4 bis 7.0 sind es 12 Bit, der Bytepointer stellt ja schon die Adresse inkl. Bits dar, siehe FAQ).
 
AnyPointer in SCL

Ich hab das mit dem AnyPoibter so gemacht (funktioniert tatsächlich).

Am Anfang hatte ich auch den ANY "von Hand" gefüllt - und mir fast jedesmal "einen abgebrochen". Das braucht manb gar nicht, der SCL-Compiler macht das alles automatisch :)

Die Typen von Siemens kennen sich da teils auch überhaupt nicht aus ....

Code:
[FONT=Courier New]TYPE AnyPointer
    STRUCT
        byId    : BYTE;
        byTyp   : BYTE;
        iCount  : INT;
        iDbn    : INT;
        dwPtr   : DWORD;
    END_STRUCT;
END_TYPE
[/FONT]


.....
[FONT=Courier New]VAR_TEMP
    AnyPniRx  : AnyPointer;
    pAnyRx  AT AnyPniRx : ANY;
    
    pAnyRx := "Glob".TcpRxFsm.RxBuf.Daten;
                
    AG_RECV (ID      := 1,
             LADDR   := #16#0100,
             RECV    := pAnyRx,
             NDR     := bDone, 
             ERROR   := bError, 
             STATUS  := wStatus,
             LEN     := iLen
    );

[/FONT]
 
@Kandiszucker:
Das mit der TYPE-Deklaration in deinem Code-Beispiel finde ich interessant. Leider funktioniert das (bei mir) nicht.
Wo machst du diese Deklaration ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo LarryLaffer!

Was hast Du für Probleme mit dem Type?


Die TYPE Deklaration ist in SCL ja nichts anderes als die Deklaration eines UDT.

Man muß natürlich in der Symboltabelle das Symbol eintragen.

Ansonsten hab ich das in einer eigenen SCL-Quelle gemacht, in der auch der Datenbereich "Glob" definiert wurde.

Durch die Zuweisung von

pAnyRx := "Glob".TcpRxFsm.RxBuf.Daten

füllt der Compiler den AniPniRx mit *allen* Infos über (das Array) "Glob".TcpRxFsm.RxBuf.Daten, also DB, Länge, Typ usw.

Damit braucht man "von Hand" den AnyPointer nicht zu füllen.

Ich hab das probiert, man kann auch Datenbereiche im InstanzDB oder auch in den lokalen Variablen (also Stack) angeben.


Ich hab übrigens S7 SCL V5.3 SP3 (vor kurzem erst angeschafft).










 
Danke für die Rückmeldung ...
Leider hast du die Frage anscheinend nicht verstanden.
Du brauchst mir nicht zu erklären wie der AT-Befehl in SCL funktioniert und auch nicht wie man den ANY-Pointer auf diesem Weg anwendet oder zuweist. Selbstverständlich weis ich als alter Pascal-Programmierer auch, was TYPE bedeutet.

Ich habe dein TYPE-Beispiel mal in einen FB von mir eingebaut. Wenn ich das dann übersetze erhalte ich die Meldung "Der neue Bausteinbeginn ist vor dem Bausteinende. Baustein: xAnyPointer".
xAnyPointer ist dem dem Fall mein TYPE.

Vielleicht haber ich mich jetzt klarer ausgedrückt ...
 
Hallo Larry!

Was ist denn das für eine merkwürdige Meldung

"Der neue Bausteinbeginn ist vor dem Bausteinende. Baustein: xAnyPointer".

Damit kann ich nun nix anfangen.

Ich hab den Codeauschnitt so aus meinem Prog rauskopiert. Hier nochmal komplett:

Code:
FUNCTION TcpFSM : VOID
VAR_TEMP
    AnyPniRx  : AnyPointer;
    pAnyRx  AT AnyPniRx : ANY;
    
    AnyPniTx  : AnyPointer;
    pAnyTx  AT AnyPniTx : ANY;
    
    bDone   : BOOL;
    bError  : BOOL;
    wStatus : WORD;
    iLen    : INT;
    ch      : CHAR;
    i       : INT;
        
END_VAR
VAR
END_VAR
........

Deine Fehlermeldung kann ich mir nun wirklich nicht erklären. Tut mir leid ....
 
...?
Selbstverständlich habe ich BEIDE Varianten schon einmal ausprobiert.
So schnell gebe ich auch nicht auf ...
Wie deklarierst du deinen TYPE denn symbolisch ? Vielleicht ist das ja der Schlüssel ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Larry!

Hallo Larry,

symbolisch definiere ich das im Symboleditor als UDT 2, siehe Anhang.

Müßte normalerweise kein Problem sein....

Wenn ich das Symbol nicht definiert habe, kriege ich eine andere Fehlermeldung als Du: "Symbolischer Bausteinname nicht bekannt..." oder ähnlich.

Welche SCL-Version benutzt Du denn? Vielleicht liegts da dran?
Benutzt Du denn überhaupt TYPEs?

Am Anfang hatte ich in etwa auch folgendermassen rumexperimentiert. Den AnyPointer muss man nicht unbedingt als TYPE definieren.
(In Wirklichkeit ist der Anypointer eigentlich eine struct, m.E.) Den Funktionen wird eigentlich ein Pointer auf so eine struct übergeben (aus C Sichtweise heraus)


Code:
//------------------------------------------------------------------------------------------------------
//
//  NumberOfElements
//
//  Liefert Anzahl Arraykomponenten zurück.
//
//------------------------------------------------------------------------------------------------------
FUNCTION NumberOfElements : INT     //sizeof FC90
VAR_INPUT
    pArrayName:ANY;
END_VAR
VAR_TEMP
    pAny : ANY;
    MyAny AT pAny : STRUCT
            ID  : BYTE;
            TYP : BYTE;
            NUM : INT;
            DBN : INT;
            PTR : DWORD;
        END_STRUCT;
END_VAR
BEGIN
    pAny := pArrayName;
    NumberOfElements := Myany.NUM;
END_FUNCTION
 

Anhänge

  • SclSymbol.jpg
    SclSymbol.jpg
    24,8 KB · Aufrufe: 66
Am Anfang hatte ich in etwa auch folgendermassen rumexperimentiert. Den AnyPointer muss man nicht unbedingt als TYPE definieren.
(In Wirklichkeit ist der Anypointer eigentlich eine struct, m.E.) Den Funktionen wird eigentlich ein Pointer auf so eine struct übergeben.

... so habe ich das bisher auch gehandhabt. Das mit dem TYPE hatte mir ganz gut gefallen und da dachte ich "da hak' doch mal nach ...".
Das Ding als UDT in der Symbolik zu hinterlegen ist mir natürlich noch nicht eingefallen ...

SCL habe ich übrigens wie du ...

Gruß
LL
 
Zurück
Oben