Pointer in SCL (kein any)

jck0815

Level-1
Beiträge
28
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,
ich habe mal wieder ein Problem und hoffe irgendwer kann / mag mir helfen :)

Es geht um folgendes:

Ich muss einen geschützeten FC benutzen, der mir Daten verändert. Dazu bekommt er als Eingangsparameter zwei Pointer (kein ANY-Pointer) und ein Int. Der erste Pointer zeigt auf die Daten die verändert werden sollen, das Int wieviele und der zweite Pointer, wo die veränderten Daten hingeschrieben werden sollen. Wenn ich in KOP/FUP/AWL zwei Pointer anlege funktioniert das einwandfrei!

Das Problem ist, ich MUSS SCL verwenden.

Laut Hilfe ist ein DB-Pointer 6 Bytes lang:
Code:
Byte: 0        1       2                 3         4                5 
      |    DB-Nummer   | Speicherbereich |      Byte Addr.               | Bit

Nun möchte ich P#DB307. DBB 25 anlegen, meines Verständnisses nach habe ich ein Struct aus Int und DWORD mit folgenden Daten angelegt:

Int (also Byte 0+1) : 307
Dword (also Byte 2-5) : W#16#8400_00C8
(also 84 für den DB-Speicherbereich AND 25*8Bit für die Adresse)

Leider funktioniert es nicht, was mache ich falsch?

Grüße
Jens

P.S.: Leider fand ich hier im Forum nur Posts zu Any-Pointern, so habe ich einen neuen Thread erstellt, ich hoffe ich habe nichts übersehen und poste somit eine Frage doppelt.
 
Zuletzt bearbeitet:
Hallo,

hoffe ich habe die Frage richtig verstanden.
Um das zu machen brauchst Du zusätzlich einen Datentyp vom Typ Pointer.

Bsp:
Code:
Zeiger1 : POINTER;
Zeiger2 : POINTER;

Mittels AT kann dann eine zusätliche Sicht auf die Variable erstellt werden.
Bsp:
Code:
Zeiger1 : POINTER;
    _Zeiger1 AT Zeiger1 : STRUCT
        DBNr: WORD;
        Adr: DWORD;
    END_STRUCT;
hier kann dann auf die einzelnen Bereiche des Pointer zugegriffen werden mit _Zeiger1.DBNr

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort.

Solch ein Konstrukt hatte ich mir auch überlegt, nur darf ich leider im
VAR - END_VAR - Teil keine Variable des Types POINTER anlegen.
(Deklaration einer Aufrufinstanz oder verwendeter Parametertyp in diesem Vereinbarungsblock nicht zulässing)

im VAR_OUT - END_VAR - Teil ist wiederum das AT- Konstrukt nicht zulässig.

(Bei Any-Pointern funktioniert der beschrieben Code ohne Probleme, nur leider mit pointer micht)

Was mache ich falsch, oder geht das nicht?

Grüsse
Jens
 
Zuletzt bearbeitet:
Hallo,

ich denke mal das geht so nicht. Wenn du an einen Baustein einen Pointer übergeben willst musst du die absolute Adresse übergeben und nicht eine Speicheradresse dessen Inhalt den Pointer enthält. In dem Fall würde ja die Lokaldatenadresse übergeben werden.
Deswegen ist es wahrscheinlich von vorn herein schon nicht gestattet im temp Bereich Pointervar. anzulegen.

oder so ähnlich...;)
 
Ja sowas befürchte ich auch, nur kann ich irgendwie den FC in SCL aufrufen (im Notfall auch mit festen Adressen), also sowas wie:

Code:
FC4711( INPUT:= P#DB305.DBB 0,
        LENGTH: 25,
        OUTPUT:= P#DB305.DBB 26);

Leider kann ich P#... nicht in SCL verwenden...
Hat da noch wer ne Idee oder muss ich da nen AWL-Teil einfügen und ne Diskussion anfangen, weil nur SCL verwendet werden soll !? Ich hoffe es gibt noch ne Lösung, aber mir gehen leider die Ideen aus :(

Selbst wenn keiner mir weiterhelfen kann danke ich Euch allen ganz herzlich für die Mühe!

Grüsse
Jens
 
Hallo,
leider ist es so, dass das beschriebene Problem unter SCL so nicht zu lösen geht. Ich hatte das auch schon einmal versucht und bin daran gescheitert.
Die Frage, die sich hier für mich allerdings stellt, ist :
Wenn du sowieso die Start-Adresse und die Länge des Bereichs angeben willst (nur halt in 2 Parametern ... warum machst du es dann nicht mit dem ANY, mit dem genau das gehen würde und der von auch von SCL zerlegen liesse (wie du es ja selbst auch schon festgestellt hast) ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja,
ich habe den Baustein vom Kunden bekommen und muss ihn nutzen. Weitere Anforderung war SCL.
Also werde ich mich mit dem Kunden nochmal auseinander setzen müssen.

In meinen Augen gibts dann 3 Möglichkeiten:
- den Baustein offen legen, dass ich ihn auf ANY umbauen kann
- der Kunde baut ihn auf ANY um
- ich muss ihn per AWL/FUP/KOP aufrufen

DANKE für Eure Mühe!

Grüsse
Jens
 
Also ich habe es auch mit einem FB getestet und er wollte auch dort im VAR-Teil keine VAriable vom Typ Pointer anlegen :( Ich habe nun einen kleinen FC in AWL geschrieben und rufe die besagte Funktion damit auf. Ist zwar nicht das was ich wollte, aber es funktioniert... Wie sagt man: Nicht schön, aber selten :)
 
Ha, komisch SCL gibt wieder Rätsel auf.

Code:
FUNCTION_BLOCK FB10

VAR_IN_OUT
    INPUT : POINTER;
    LENGTH : INT;
    OUTPUT : POINTER;
END_VAR

BEGIN

FC2(INPUT :=  INPUT, LENGTH := LENGTH, OUTPUT := OUTPUT);

END_FUNCTION_BLOCK

und es geht doch.

Gruss Daniel
 
Und als FC auch.

Code:
FUNCTION FC10: VOID

VAR_IN_OUT
    INPUT : POINTER;
    LENGTH : INT;
    OUTPUT : POINTER;
END_VAR

BEGIN

FC2(INPUT :=  INPUT, LENGTH := LENGTH, OUTPUT := OUTPUT);

END_FUNCTION

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So nach weiteren Test FC geht nicht da kein AT auf Pointer möglich ist.
Mit einem FB und im INPUT Bereich geht es.

Code:
FUNCTION_BLOCK FB10

VAR_INPUT
    INPUT : POINTER;
        _INPUT AT INPUT : STRUCT
           DBNr: WORD;
           Adr: DWORD;
        END_STRUCT;    
    OUTPUT : POINTER;
        _OUTPUT AT OUTPUT : STRUCT
           DBNr: WORD;
           Adr: DWORD;
        END_STRUCT;    
END_VAR
VAR
    LENGTH : INT;
END_VAR    

BEGIN

FC2(INPUT :=  INPUT, LENGTH := LENGTH, OUTPUT := OUTPUT);

END_FUNCTION_BLOCK

Gruss Daniel
 
Code:
FUNCTION_BLOCK FB10

VAR_INPUT
    INPUT : POINTER;
        _INPUT AT INPUT : STRUCT
           DBNr: WORD;
           Adr: DWORD;
        END_STRUCT;    
    OUTPUT : POINTER;
        _OUTPUT AT OUTPUT : STRUCT
           DBNr: WORD;
           Adr: DWORD;
        END_STRUCT;    
END_VAR
VAR
    LENGTH : INT;
END_VAR    

BEGIN

_INPUT.DBNr := w#16#131;        // DB305
_INPUT.Adr := DW#16#8400_0000;  // DBX0.0

_OUTPUT.DBNr := w#16#131;       // DB305
_OUTPUT.Adr := DW#16#8400_00C8; // DBX25.0

FC2(INPUT :=  INPUT, LENGTH := LENGTH, OUTPUT := OUTPUT);

END_FUNCTION_BLOCK

Gruss Daniel
 
Hallo Daniel,
Danke dir für deine Bemühungen.
Auf diese Weise hatte ich es bislang nicht probiert ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist beim längeren nachdenken auch irgendwie logisch das es als INPUT geht da es ja ein POINTER (Zeigt auf irgendwas) ist.
Es ist ja lediglich nur die Adresse auf die geschrieben oder von der gelesen werden soll, aber warum geht es nicht als STAT oder TEMP.

Meiner Meinung nach Käse. :confused:

Gruss Daniel
 
Zurück
Oben