Variable Adressierung von IO`s zu einer Struktur ( Wie Wago IO-Checker)

CarWie

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

ich beschäftige mich zur Zeit mit Codesys und einer Wago 750-8203, sowie diversen Ein- und Ausgangskarten. Ich möchte ein Programm schreiben, dass den Bus ausliest, die Karten erkennt, die Adressen setzt und einer Variablen (Struktur) zuweist damit später darauf zugegriffen werden kann. Vom Prinzip wie die Software " IO-Checker " von Wago selbst nur das ich dieses über Codesys erreichen möchte. Ich möchte die manuelle Eingabe der Karten über die Steuerungskonfiguration umgehen und dieses automatisch realisieren. Mein Problem ist dabei die Adresszuweisung zu dem "symbolischen" Variablennamen da dieses variable ist. Es soll unabhängig von der Reihenfolge der Karten erfolgen da diese in verschiedenen Systemen unterschiedlich angeordnet sein können. Ich möchte in einer Struktur die Adresse festhalten und der Strukturvariablen zuweisen damit später darauf zugegriffen werden kann und ich die Ein- oder Ausgänge über die Variablennamen setzten kann. Bis jetzt habe ich das Programm soweit geschrieben, dass ich den Bus auslese, die Karten erkenne und den Pointer auf die nächste Adresse zeigen lassen kann. Dies tue ich über die Bibliothek "WagoLibKBUS.lib" womit ich über den Offset den Pointer auf die Karten zeigen lasse. Im Folgeden ist ein Code-Beispiel für eine digitale Eingangskarte. An der Stelle wo die einzelnen Bits über den Pointer zugewiesen werden möchte ich nicht den Zustand "TRUE oder FALSE" zuweisen sondern die jeweilige Adresse speichern. Ich hoffe mir kann hier weitergeholfen werden. Vielen Dank im voraus.

IF 34817 = ModulInfo.dwTypname [ i ] THEN (*Karte 750-430 = 34817*)
IF FirstInput = 0 THEN (* Abfrage ob erste Karte vorliegt*)
ptIN := ptIN; (*wenn ja, dann Startdresse zuweisen*)
FirstInput := i; (* Merken, dass bereits erste Karte geschrieben wurde*)
ELSE
ptIN := ptIN + ( ModulInfo.dwIPI_ByteOffset [ i ] - ModulInfo.dwIPI_ByteOffset [ LastInput ] ) ; (* Pointer auf die nächste Adresse zeigen lassen*)
END_IF;
HardwareIO.xDigitalInput [ HardwareIO.xDigitalInputCount + 1 ] := ptIN^.0; (* Im Moment zuweisung der Eingänge (TRUE OR FALSE) zur Struktur ob und wieviele Eingänge vorhanden sind *)
HardwareIO.xDigitalInput [ HardwareIO.xDigitalInputCount + 2 ] := ptIN^.1;
HardwareIO.xDigitalInput [ HardwareIO.xDigitalInputCount + 3 ] := ptIN^.2;
HardwareIO.xDigitalInput [ HardwareIO.xDigitalInputCount + 4 ] := ptIN^.3;
HardwareIO.xDigitalInput [ HardwareIO.xDigitalInputCount + 5 ] := ptIN^.4;
HardwareIO.xDigitalInput [ HardwareIO.xDigitalInputCount + 6 ] := ptIN^.5;
HardwareIO.xDigitalInput [ HardwareIO.xDigitalInputCount + 7 ] := ptIN^.6;
HardwareIO.xDigitalInput [ HardwareIO.xDigitalInputCount + 8 ] := ptIN^.7;
HardwareIO.xDigitalInputCount := HardwareIO.xDigitalInputCount + 8; (* Anzahl der Eingänge festhalten *)
LastInput := i; (*Merken der letzten gefunden analogen Inputkarte zum berechnen desOffsets*)
END_IF;
 
Hallo CarWie,
für den 750-880'er gibt es von Wago ein Beispiel- Prg. "Datenlogger".
Hier werden die Klemmen über "GetI0Config_PRG" ausgelesen usw.
Vielleicht ist das Interessant für Dich.

MfG aus OWL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für Deinen Hinweis. Ich habe mir von Wago die PDF zum Datenlogger durchgelesen und wenn ich es richtig verstanden habe dann erhalte ich nur Auskunft über die Werte der Kanäle und wie ich diese in einer CSV-Datei ablege. Vom Prinzip würde es mir glaube ich schon helfen, wenn ich zb" Variable AT %IW [] oder Variable AT % IB [].[]" verwenden kann. Dann könnte ich mit einem Schleifenindex und dem Byteoffset die Adresse angeben. Leider glaube ich das diese Art der Adressierung nicht möglich ist zumindest weiß ich nicht wie ich die Anweisung schreiben soll.
 
Zurück
Oben