arrays mit udt...

rausgefunden...

habs mal wieder rausgefunden...

"DB100".myarray[2].Sollwert

ist damit auch eine indirkete adressierung a la
"DB100".myarray[mw10].Sollwert
möglich???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
scl...

will aber kein scl verwenden...

gibts keine möglichkeit??? (dnke nein). gibt es eine möglichkeit das mir step7 bei meinen anypointer die größe (also byte 10 beispielsweise) durch die größe meines udts ersetzt (als beispweise byte sizeof(udt1)). wäre ja eigendlich keine steuerungtechnische sache, sondern nur ne compiler angelenheit...
 
SCL-Beispiel

@ KSK :wink:


hier ein kleiner Ausschnitt aus unserer Produktionsdatenerfassung:

Code:
// UDT-Typdefinitionen

TYPE TYP_E1Kopf

  STRUCT    
   .....
   auftrnr      : DINT;                    // Auftragsnummer
   masch        : INT;                     // Maschinennummer
   fertlen      : REAL := 6.0;             // Soll-Fertigungslänge [m]
   .....
  END_STRUCT;
END_TYPE


TYPE TYP_AdKomp

  STRUCT    
   SapMat  : DINT;                          // Materialnummer
   Bez     : STRING [12] := '            '; // Bezeichnung
   Sollgew : REAL;                          // Sollgewicht
   Mischnr : INT;                           // Mischungsnummer
   Farbnr  : INT;                           // Farbnummer
  END_STRUCT;
END_TYPE


TYPE TYP_E1Meld

 STRUCT
  Kopf    : TYP_E1Kopf;                 // E1-Kopfdaten
  AnzKomp : INT;                        // Anzahl aktiver Komponenten
  Komp    : ARRAY[1..10] OF TYP_AdKomp; // Komponentendaten
 END_STRUCT;
END_TYPE


// Datenbaustein-Definition

DATA_BLOCK E1Buffer
TITLE =  Puffer für E1-Meldungen

 STRUCT
   E1   : ARRAY [0..15] OF TYP_E1Meld;   
  END_STRUCT ;  
BEGIN
END_DATA_BLOCK


// Ausschnitt aus einer Funktion, die indirekt darauf zugreift

FUNCTION    CreateE1 : BOOL
TITLE = 'Neue E1 aus Auftragsdaten erzeugen'

// Erzeugen neuer E1-Meldung aus Auftragsdaten, alte Istwerte werden gelöscht

VERSION : '0.2'

VAR_INPUT
 AktBuf  : INT;
END_VAR
VAR_TEMP
 i       : INT;
 RetBool : BOOL;
END_VAR

BEGIN

  ......

  // Werte aus Auftrag übernehmen
  E1Buffer.E1[AktBuf].Kopf.auftrnr    := ProdAuft.Auft[0].Kopf.auftrnr;
  E1Buffer.E1[AktBuf].Kopf.masch      := ProdAuft.Auft[0].Kopf.masch;
  E1Buffer.E1[AktBuf].Kopf.fertlen    := ProdAuft.Auft[0].Kopf.Fertlen;
  ......

  // und hier mit mehrfach-indirekt-Zugriff !
  FOR i := 1 TO 5 BY 1 DO
    E1Buffer.E1[AktBuf].Komp[i] := ProdAuft.Auft[0].Komp[i];
  END_FOR;
  .....

END_FUNCTION

wenn ich mir das in AWL zusammenpfriemeln müsste hätte ich noch mehr Graue Haare :lol:

Gruß Jörg
 
Ist auf jeden Fall recht übersichtlich, aber letzhin in AWL nichts anderes als ein BLKMOV, wenn man Quelle und Ziel kennt. Das ist manchmal das Problem, warum einfach, wenn es auch komliziert geht und wie ein "richtiges" Programm aussieht.

Bitte nicht falsch verstehen, ich mach das hin und wieder auch in SCL, weil es einfach übersichtlicher und nachvollziebarer für andere ist.

ralle
 
Hi Ralle,

stimmt, ich geb Dir in soweit recht, daß es im Endeffekt nur ein BLKMOV ist.
Aber das Zusammengepopel der Any-Pointer in AWL ist ab einer gewissen Komplexität nicht unbedingt der Bringer.
Ändert man was an den Datenstrukturen (will unsere Produktion öfters :cry: ) muss man durch's ganze Programm eiern und die Adressen und Array-Größen anpassen.
Beim SCL wird halt nur die Struktur geändert, Compilerlauf drüber und fertig.

Auch die Lesbarkeit der Programme für einen selbst (!) ist halt deutlich besser.
Was nützen fein definierte Variablennamen und Symbole, wenn das AWL-Programm dann mit L DBD[AR1, P#4.0] drauf zugreift :shock: ( ähm... welcher Wert war das doch gleich mal :? )

Wir haben die gleiche Funktionalität auch in diversen S5-Steuerungen drin, dort natürlich in AWL.
Wenn ich da so alle halbe Jahre mal was ändern muß, dauert es trotz ausführlicher Dokumentation 'ne ganze Weile, bis ich mich im eigenen Programm wieder ganz zurechtfinde :oops:

Als wir dann auf die S7 in Neuanlagen umgestiegen sind, war ich heilfroh, daß es SCL gab.

Soll jetzt nicht heißen, daß ich alles in SCL mache, so'n simpler SFC20-Aufruf ist auch mal in AWL drin :wink:

Gruß Jörg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tja, das sind halt die Vorzüge einer gescheiten Hochsprache.

Aber, sagt der 300er 400er Serie "DANKE" das du ARRAY und STRUCT kennst. bei der 200er kannste das mal ganz dezent vergessen. Ich freue mich schon auf die erste Änderung, die dann 30 mal X mal durchgeführt werden muss..

pt
 
Re: scl...

Hallo Jochen,

Jochen Kühner schrieb:
....gibt es eine möglichkeit das mir step7 bei meinen anypointer die größe (also byte 10 beispielsweise) durch die größe meines udts ersetzt...

Diese Möglichkeit gibt es!
Wenn du ein ARRAY oder STRUCT als Variable an einen ANY-Parameter anlegst, generiert der Editor einen ANY-Zeiger auf das ARRAY oder auf die Struktur. Der Typ des ANY ist dann immer Byte! Die Anzahl der Bytes kannst du aus dem ANY-Pointer auslesen. Diese Anzahl entspricht dann in deinem Fall der Anzahl Bytes deines UDTs. Somit kannst du die Bit-Länge deines UDTs ermitteln und über Adressregister indirekt adressieren.

Code:
      CALL  FC    23
       MY_ARRAY:="DB_ARRAY".MY_ARRAY[1]

Die Variable kann nur Symbolisch an den Parameter gelegt werden!


Gruß, Onkel
 
@Onkel Dagobert

Ja, das funktioniert, kannst du evtl. mal ein Beispiel geben, wie ich dann an die Einzelteile dieses generierten Any-Pointers rankomme ? Geht das dann nur im FC23 selbst ?

ralle
 
Hi Jochen,

Zugriff geht über die hier beschriebene Mimik.
Der Any-Pointer verhält sich genauso, wie der im Beispiel verwendete DATE_AND_TIME Parameter.

Gruß Jörg
 
Zurück
Oben