TIA Array mit verschiedenen Datentypen für SDO übertragung

Michl33

Level-2
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin gerade dabei eine Interroll Multicontrol Steuerung mittels WRRCE-Baustein über Profinet zu konfigurieren.
Das klappt soweit auch ganz gut wenn ich die zu übertragenden Daten einzeln einstelle.
Nun ist es so das ich eine Konfiguration der Daten vordefinieren möchte und dann alle Daten "auf einmal" mit Hilfe einer Schleife übertragen möchte.
Ich habe mir das so gedacht dass ich in einen Datenbaustein ein Art "array of struct" für den Index und die Daten definiere. (siehe Bild)
Jetzt habe ich aber das Problem das zwar der Index vom Datentyp immer gleich bleibt aber der Datentyp der einzelnen Daten unterschiedlich ist. (z.B. Sensortyp = Bool, IP-Adresse = udint)
Bei einem "array of struct" ist es aber so das der Datentyp für alle Variablen gleich ist.

Daher meine Frage: Gibt es eine Möglichkeit eine Art Array mit unterschiedlichen Datentypen zu erstellen?

Ich Hoffe das mir das mir da jemand weiterhelfen kann:)
mfg Michl

PS: Ich benutze TIA v14 und eine 1516F-3 PN/DP CPU
 

Anhänge

  • multi.jpg
    multi.jpg
    36,1 KB · Aufrufe: 20
Zuletzt bearbeitet:
Moin,
mal fernab von einem möglichen Lösungsansatz, ist der WR_REC (ich glaube den meinst du) nicht ein azyklischer Baustein dessen Ausführung auch mehrere Zyklen brauchen kann? Dann wäre es ja ohnehin nicht möglich alles in einer Schleife (also in einem Zyklus) zu schreiben, da du ja außerdem nach jeden Senden warten musst, bis der Sendevorgang beendet/der Baustein fertig ist. Und ggf. musst du das Senden ja auch noch wiederholen, falls was schiefgelaufen ist. :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ja du hast recht der WR_REC läuft asynchron, also wird das mit der Schleife nicht so funktionieren wie ich mir das gedacht habe.
Aber das ist ja nicht so schlimm wenn er mehrere Zyklen braucht.

Habe mir das mal ganz simpel so vorgestellt:

IF NOT #WRREC_Instance.DONE THEN

#WRREC_Instance(REQ := TRUE,
ID := 266,
INDEX := "MC_Data".Send.SDO[#i].INDEX,
LEN := "MC_Data".Send.LEN,
DONE => "MC_Data".Send.Done,
BUSY => "MC_Data".Send.Busy,
ERROR => "MC_Data".Send.Error,
STATUS => "MC_Data".Send.Status,
RECORD := "MC_Data".Send.SDO[#i].Data);

ELSE
#WRREC_Instance.REQ := FALSE;
#i := #i + 1;
END_IF;

Errorhandling würde ich dann später natürlich auch noch machen ist aber jetzt für mich noch uninteressant.

mfg Michl
 
Nein man kann in einem Array keine verschiedenen Datentypen anlegen.
Davon ab. WRREC sollte nicht bedingt ausgeführt werden sondern stetig.
Du kannst aber ausserhalb natürlich das done abfragen und entsprechend die Schnittstelle von WRREC beschalten.
Sie WRREC mehr wie ein Kommunikationsbaustein wie z.B. T_Send.
So will er auch behandelt werden.

Um die verschiedenen Konfigurationen nacheinander zu schicken würde ich statt einer normalen Schleife ein CASE nehmen.
Wenn nicht done, dann prüfe index. wenn index > 0 dann gehe in Case an die entsprechende stelle, kopiere die daten schreib sie auf das Feld für WRREC und setze req. auf true.

mfG René
 
ein Array ist per def. immer vom Gleichen Typ - also so wie du es denkst geht es nicht.
Was aber machbar wäre ist. ein "Array of Struct" mit Index und einem Byte Array für die Daten - evtl. noch eine Variable für den Typ - dann kann man mit sereilize/deserialize in den entsprechenden Typ umwandeln.
 
Zurück
Oben