Array of Struct anlegen und beschreiben

fk- princess

Level-1
Beiträge
112
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo...

ich möchte zur datensicherung ein array mit den entsprechenden daten befüllen. die daten setzen sich in form eines struct´s aus mehreren teildaten zusammen.
auf grund des mir nur begrenzt zur verfügung stehenden speichers möchte ich diese structe direkt in den datenbaustein schreiben, wo das "array of struct" angelegt ist.

ich bekomme jedoch eine fehlermeldung: " eine implizite Konvertierunf von Datentyp "Struct" nach "Struct" ist nicht möglich".

habe in der suche nachgelesen, aber einen ähnlichen fall nicht finden können.
programmiert wird mit TIA V11 und auf einer 1200er SPS in SCL

edit: das Array of struct im datenbaustein konnte ich nur als einfaches array anlegen: Messung: Array[1..1500] of struct; der innere Aufbau des structes fehlt da ja. das könnte evtl der fehler sein, aber ich weiss nicht recht, wie ich da rangehen soll

hier noch zur näheren erläuterung der Programmcode

Code:
// Zaehler Rücksetzen, bei Start einer neuen Pruefung
IF #Pruef_Start = True
  THEN  
    #Zaehl_Sp := 1;
END_IF;
   
//-------------------------------------------------------------------------------
// Beginn der Wertspeicherung in das "Array of Struct" im Datenbaustein Messwerte
//-------------------------------------------------------------------------------
IF #Pruef_Ein = TRUE AND #Empf_Trig = TRUE
  THEN
  
  IF #Zaehl_Sp <= 1500
    THEN
      
      #Einz_Mess.Zeit := #Zeit;
      #Einz_Mess.Druck := #Druck;
      #Einz_Mess.Durchm := #Durchm;
      
      "Messwerte".Messung[#Zaehl_Sp] := #Einz_Mess;
      
      #Zaehl_Sp := #Zaehl_Sp + 1;
      
  END_IF;
END_IF;
 
Zuletzt bearbeitet:
Sorry ... was willst du machen ? Das habe ich aus deiner Beschreibung nicht herauslesen können.
Als Einziges vielleicht : eine dynamische Belegung des Speichers läßt die SPS nicht zu. Du kannst dein Array_of_Struct nicht unterschiedlich groß sein lassen ... werder von den Indexen her noch von den Inhalten ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich möchte drei zusammenhängende daten abspeichern (druck, druchm und zeit). diese stehen in einem struct, damit sie zuordbar sind.
das wiederholt sich 1500 mal.

ich dacht mir halt, das ich ein array anlege, in welchem die 1500 structe stehen.

ich könnte ja auch ein array anlegen, in dem keins structe stehen, sondern arrays

edit: zudem habe ich das problem, das die datentypen unterschiedlich sind. einmal TOD und zweimal REAL. deswegen bin ich ja auf struct gekommen.

also wenn das nicht dynamisch funktioniert, muss ich nich etwa 1500 structe in meinem DB erzeugen, per hand??? oooooje
 
Zuletzt bearbeitet:
habe mir jetzt in der Funktion, wird wohl noch ein funktionsbaustein, ein array of struct als temp variable erzeugt. dort kann ich ja die struct-Datentypen angeben. Wie im code zu sehen beschreibe ich diese strukte auch, je nach variablenindex. nur ich bekomme dieses array einfach nicht in den DB... mmmmh

ich glaub ich schreibe das alles in einen funktionsbaustein und nehme die gesamten Messdaten aus dem instanzbaustein. ob das nun in nem globalen oder in einem instanzbaustein liegt, is bei der zusammenstellung der übertragungsnachricht an das tableau egal...

Code:
//-------------------------------------------------------------------------------
// Beginn der Wertspeicherung in das "Array of Struct" im Datenbaustein Messwerte
//-------------------------------------------------------------------------------
IF #Pruef_Ein = TRUE AND #Empf_Trig = TRUE
  THEN
  
  IF #Zaehl_Sp <= 1500
    THEN
      
      #Einz_Mess.Zeit := #Zeit;
      #Einz_Mess.Druck := #Druck;
      #Einz_Mess.Durchm := #Durchm;
      
      #Messung[#Zaehl_Sp].Zeit := #Zeit;
      #Messung[#Zaehl_Sp].Druck := #Druck;
      #Messung[#Zaehl_Sp].Durchm := #Durchm;
      
      "Messwerte".Messung := #Messung; // auch hier ist es wieder mit der selben Fehlermeldung rot markiert
      
      
      #Zaehl_Sp := #Zaehl_Sp + 1;
      
  END_IF;
END_IF;
 
Hallo,
na in dem Fall sollte das allerdings schon gehen - ich bin jetzt allerdings nicht mit S7-1200 unterwegs ...
Du legst dir in dem DB eine Variable an (z.B. meinArray), die vom Typ array ist. Der Datentyp des Array's wäre dann Struct und in der Struct legst du dann die Variablen Zeitstempel als TOD und Messwert1 und Messwert2 jeweils als REAL (die Namen sind hier natürlich ziemlich beliebig).
So, wie du es im STAT-Bereich eines FB deklarierst, so kannst du es auch in einem Global-DB deklarieren.
Wenn du mit dem Kram allerdings schick in SCL arbeiten willst dann ist das mit dem Global-DB schon wieder so eine Sache ... da kannst du nämlich eigentlich nur die Speicher-Adressen ansprechen. Das wäre bei deiner Instanz schöner ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
"Messwerte".Messung := #Messung; // auch hier ist es wieder mit der selben Fehlermeldung rot markiert

Das musst du mit einem Blockmove machen, da du keine Variable sondern einen Bereich übergibst.Ansonsten müsste im TIA-Portal auch in SCL die Variablendeklaration tabellarisch zu machen sein.Ggf. solltest du die Struct aber als Datentyp deklarierenund dann ein Array dieses Datentyps deklarieren.MfG MK
 
habe das gerade getestet. im instanzbaustein werden alle structe so beschrieben wie ich das auch vor hatte. da das "array of struct" im bereich STATIC liegt, bleibt der wert auch erhalten..
an den ollen BLK_MOV habe ich garnicht mehr gedacht :) . werd ich gleich mal mit einbauen... dank euch für die hilfe
 
Zurück
Oben