Anypointer in UDT?

ssound1de

Level-2
Beiträge
351
Reaktionspunkte
27
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

hat schon mal jemand einen Anypointer per UDT in den Lokaldatenbereich gepackt?

Hintergrund wäre ein besser lesbarer Code, z.B.

Code:
      L     B#16#10                     
      T     #Source.S7_ID            //statt LB0

      L     B#16#2                     
      T     #Source.DatenTyp         //statt LB1

      L     10                             
      T     #Source.Wiederholfaktor  //statt LW2

      L     255                      //DBNr
      T     #Source.DB_Nr            //statt LW4

//Hier kommen meine Probleme, da das LD6 den Pointer auf die Daten und den Speicherbreich-Codierung
//enthällt
      L     P#228.0                  //Pointer Byte.Bit  
      T     #Source.???              //statt LD6

      L     B#16#84                  //Speicherbereich DB
      T     #Source.???              //statt LB6

Wie könnte man den Pointer in ein UDT packen?
Danke.

Gruß
 
Code:
      L     P#DBX 228.0              //Pointer Bereich:Byte.Bit
      T     #Source.Adr              //LD6

oder

      L     B#16#84                  //Speicherbereich DB
      TAD
      L     P#228.0                  //Pointer Byte.Bit
      OD
      T     #Source.Adr              //LD6

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du kannst hier keinen neuen Datentyp (3 Byte Länge erschaffen).
Du kannst den "LD6"-Bereich entweder als DWORD oder als 4 BYTE oder als 2 WORD's betrachten. Lediglich in SCL hättest du da die Möglichkeit mit der AT-Sicht ...

Gruß
Larry
 
Hi,

hat schon mal jemand einen Anypointer per UDT in den Lokaldatenbereich gepackt?

Hintergrund wäre ein besser lesbarer Code, z.B.

Dann wird es Zeit auf SCL umzusteigen.
Wie Larry schon schrieb gibt es dort sogenannte Views oder Sichten.
Damit kann man dein Problem (und noch viele andere) wunderbar lösen.

Gruß
Dieter
 
Danke für Eure Antworten.

Werde mich auf die Schnelle wohl für die Methode von Harald entscheiden :ROFLMAO:

Mit SCL hab ich mich bisher leider überhaupt nicht beschäftigt.
Für welche Gegebenheiten rentiert sich SCL? Sicher nicht für gewöhnliche Ablaufsteuerungen.
Eher für Berechnungen o.ä.? Hätte ich sicher schon öfter gebrauchen können.

Wenn ich das richtig sehe ist SCL Pascal ähnlich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit SCL hab ich mich bisher leider überhaupt nicht beschäftigt.
Für welche Gegebenheiten rentiert sich SCL? Sicher nicht für gewöhnliche Ablaufsteuerungen.
Eher für Berechnungen o.ä.? Hätte ich sicher schon öfter gebrauchen können.

Bei Berechnungen (ellenlange Formeln) spielt SCL natürlich seine Stärke aus.
Allerdings ich benutze es mittlerweile schon für alles mögliche. Denn auch bedingungsgebundene Konstruktionen sehen in SCL IMHO wesentlich übersichtlicher aus.

mfG René
 
Danke für Eure Antworten.

Werde mich auf die Schnelle wohl für die Methode von Harald entscheiden :ROFLMAO:

Mit SCL hab ich mich bisher leider überhaupt nicht beschäftigt.
Für welche Gegebenheiten rentiert sich SCL? Sicher nicht für gewöhnliche Ablaufsteuerungen.
Eher für Berechnungen o.ä.? Hätte ich sicher schon öfter gebrauchen können.

Wenn ich das richtig sehe ist SCL Pascal ähnlich.

SCL ist recht universell.
Manche machen alles damit, inklusive aller Abläufe, andere nur Berechnungen, Datenhandling und Kommunikation.
Ich denke dass muss jeder selber rausfinden und natürlich auch entsprechend den Kundenvorgaben einsetzen.

Aber sobald natürlich indirekte Adressierung, Anypointer und dergleichen ins Spiel kommen ist SCL sehr gut.
Du sparst immens Zeit und man macht - meiner Erfahrung nach - weniger Fehler.
Richtig zur Tragen kommen die Vorteile wenn du sauber symbolisch programmierst und deine Daten in Structuren und / oder UDTs hast.

Gruß
Dieter
 
... Aber sobald natürlich indirekte Adressierung, Anypointer und dergleichen ins Spiel kommen ist SCL sehr gut.
Du sparst immens Zeit und man macht - meiner Erfahrung nach - weniger Fehler.

Im Grunde hat Dieter das Wesentliche ja schon genannt. Vielleicht nur noch mal zu dem Zitierten : Bei richtiger Vorgehensweise kannst du dir durch SCL (eine Mischung aus Basic und Pascal) das ganze Pointer-Gedöns i.d.R. komplett ersparen.
Was allerdings den Einsatz und die Einsatzmöglichkeiten von SCL angeht : da bist du dann schnell wieder bei einer Grundsatz-Diskussion.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

muss hier leider nochmal nachhaken und Euch um Hilfe bitten.

Hab mich ja auf die Schnelle für die Methode von Harald entschieden.
Hab nen UDT angelegt und wie im Bild zu sehen eingebunden.

UDT.JPG

Gefüllt wird der Any-Pointer wie folgt...
Code:
      L     B#16#10                     //S7 ID
      T     #Source.S7ID
      L     B#16#2                      //Datentyp Byte
      T     #Source.DataType
      L     22                          //Wiederholfaktor
      T     #Source.Len
      L     255                         //DBNr
      T     #Source.DBNr
      L     P#DBX 50.0                  //Pointer DB.Byte.Bit
      T     #Source.Adr

//Senden
Send: CALL  FC   5                    //AG_SEND (CP343-1Lean)
       ACT   :=#SendAct
       ID    :=1
       LADDR :=W#16#140
       SEND  :=#Source
       LEN   :=#Source.Len
       DONE  :=#SendDone
       ERROR :=#SendError
       STATUS:=#SendState

Der FC5 liefert beim Senden den Status 8185H -> Parameter LEN größer als Quell-Bereich SEND.
Wenn ich statt dem UDT einen AnyPointer anlege und die Lokaldaten zuweise...
Code:
      L     B#16#10                     //S7 ID
      T     LB 0
      L     B#16#2                      //Datentyp Byte
      T     LB 1
      L     22                          //Wiederholfaktor
      T     LW 2
      L     255                         //DBNr
      T     LW 4
      L     P#DBX 50.0                  //Pointer DB.Byte.Bit
      T     LD 6
dann funktioniert das Senden mit dem FC5.

Das komische ist, in beiden Fällen sehen die Werte der 10 Lokaldatenbytes identisch aus.
Mit einfachem ANY-Pointer geht es, mit UDT nicht.

Habt ihr irgendeine Idee warum? Was mach ich falsch?

Danke im Voraus.
Gruß
 
Hallo,
der Unterschied ist die übergebene Variable und deren Typ.
Im einen Fall übergibst du als Adresse den Lokaldatenbereich von Source - Source ist hier kein ANY sondern einfach ein Speicherbereich mit einer Größe von 10 Byte. In den bekommst du die 22 zu übertragenden Bytes nicht hinein.
In dem anderen Fall übergibst du als Datentyp einen ANY und hier wird dann dessen Inhalt verwendet.

Hast du den Unterschied verstanden ?

Gruß
Larry
 
Hallo Larry,

hier liegt mein Denkfehler.
Die FC5 tut stupide ihre Arbeit, zerlegt den auf SEND übergebenen 10Byte langen Wert als Zeiger um auf die zu versendenden Quelldaten zuzugreifen.

Allerdings tut natürlich vorher schon der Step7-Compiler seine Arbeit und interpretiert den auf SEND gelegten Wert entsprechend dem dort liegenden Variablentyp. Es könnte ja auch eine Konstante übergeben werden.

Im Falle von meinem UDT "Source" betrachtet er diesen UDT schon als den zu versendenden Quelldaten-Bereich und übergibt der FC5 auf SEND den Zeiger auf UDT "Source" im Lokaldaten-Bereich.
Im Falle eines ANY-Pointers wird auf SEND der Inhalt des Pointers gelegt, und damit der tatsächliche Quelldaten-Bereich zugewiesen.
 
Zurück
Oben