# Pointer in SCL (kein any)



## jck0815 (6 Januar 2009)

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:

```
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.


----------



## dalbi (6 Januar 2009)

Hallo,

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

Bsp:

```
Zeiger1 : POINTER;
Zeiger2 : POINTER;
```

Mittels AT kann dann eine zusätliche Sicht auf die Variable erstellt werden.
Bsp:

```
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


----------



## jck0815 (6 Januar 2009)

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


----------



## Simatiker (6 Januar 2009)

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...


----------



## jck0815 (6 Januar 2009)

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


```
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


----------



## Simatiker (6 Januar 2009)

Hallo,

wenn du das P# einfach weglässt??? Spielt in AWL ja auch keine Rolle, der Typ Pointer bestimmt das ja schon automatisch.


----------



## jck0815 (6 Januar 2009)

Das geht leider auch nicht.


----------



## Larry Laffer (6 Januar 2009)

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


----------



## jck0815 (6 Januar 2009)

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


----------



## dalbi (6 Januar 2009)

Sorry, war nur Truthahn essen,

mw +2 Kg 

Aber mit einem FB ist es möglich.

Gruss Daniel


----------



## jck0815 (6 Januar 2009)

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


----------



## dalbi (6 Januar 2009)

Ja, Du hast natürlich recht, habe es auch gerade mal probiert Funktioniert nur bei Datentyp ANY.

Gruss Daniel


----------



## dalbi (6 Januar 2009)

Ha, komisch SCL gibt wieder Rätsel auf.


```
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


----------



## dalbi (6 Januar 2009)

Und als FC auch.


```
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


----------



## dalbi (6 Januar 2009)

So nach weiteren Test FC geht nicht da kein AT auf Pointer möglich ist.
Mit einem FB und im INPUT Bereich geht es.


```
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


----------



## dalbi (6 Januar 2009)

```
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


----------



## Larry Laffer (7 Januar 2009)

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

Gruß
LL


----------



## dalbi (7 Januar 2009)

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. 

Gruss Daniel


----------

