A
Anonymous
Guest
-> Hier kostenlos registrieren
Hallo
Ich habe einen DB mit mehreren Datensätze. Diese haben alle die gleiche Struktur. Diese will ich in einer FOR-Schlaufe bearbeiten. Wie muss ich die Strukturen indirekte Adressieren damit ich auf die Daten zugreifen kann.
Ich habe ein Beispiel geschrieben um die indirekte Adressierung zu testen. Leider funktioniert es nicht. Was habe ich falsch gemacht?
MfG und zum Voraus vielen Dank
Leo Künzle
Ich habe einen DB mit mehreren Datensätze. Diese haben alle die gleiche Struktur. Diese will ich in einer FOR-Schlaufe bearbeiten. Wie muss ich die Strukturen indirekte Adressieren damit ich auf die Daten zugreifen kann.
Ich habe ein Beispiel geschrieben um die indirekte Adressierung zu testen. Leider funktioniert es nicht. Was habe ich falsch gemacht?
Code:
TYPE ParameterDefinition
STRUCT
DBNumber : WORD; // DB-Nummer der Daten
WordNumber : INT; // Startword erster Datentrecord
Number : INT; // Anzahl Datenrecord
Length : INT; // Datenlänge
Spare : INT; // Reserve, da es ein Compelierfehler gibt, wenn die Struktur nur 4 Word lange ist
END_STRUCT
END_TYPE
TYPE DataDefinition
STRUCT
TimeSet : INT; // Vorgabezeit
TimeActual : INT; // Aktuelle zeit
Length : INT; // Längemessung
Spare1 : INT; // Reserve, da es ein Compelierfehler gibt, wenn die Struktur nur 4 Word lange ist
Spare2 : INT;
END_STRUCT
END_TYPE
DATA_BLOCK ParameterDB
STRUCT
Parameter : ParameterDefinition; // Parameter
END_STRUCT;
BEGIN
END_DATA_BLOCK
DATA_BLOCK DataDB
STRUCT
Data_1 : DataDefinition; // Daten Element 1
Data_2 : DataDefinition; // Daten Element 2
Data_3 : DataDefinition; // Daten Element 3
Data_4 : DataDefinition; // Daten Element 4
Data_5 : DataDefinition; // Daten Element 5
END_STRUCT;
BEGIN
END_DATA_BLOCK
FUNCTION "TestDaten" : VOID
TITLE = 'Daten von 5 Elementen bearbeiten'
VERSION : '1.0'
AUTHOR : KLE
NAME : Test1
FAMILY : Exor
//KNOW_HOW_PROTECT
VAR_TEMP
Daten : DataDefinition;
pDaten AT Daten : ANY; // Pointer Daten
index : INT; // Schleifenzähler
END_VAR
BEGIN
pDaten := WORD_TO_BLOCK_DB(ParameterDB.Parameter.DBNumber).DW[ParameterDB.Parameter.WordNumber]; // Pointerzuweisung erster Datensatz
FOR index:=1 TO ParameterDB.Parameter.Number DO // In der Schlaufe werden alle Datensätzte bearbeitet.
Daten.TimeSet := 345 ; // Hier habe ich einfach einige Zuweisungen gemacht, dass ich testen kann.
Daten.TimeActual := Daten.TimeActual + 1; // Leider funktionieren die Pointer nicht.
IF Daten.TimeSet > Daten.TimeActual THEN
Daten.Length := 123;
END_IF;
pDaten := WORD_TO_BLOCK_DB(ParameterDB.Parameter.DBNumber).DW[ParameterDB.Parameter.WordNumber + (ParameterDB.Parameter.Length * index)]; // Pointerzuweisung nächster Datensatz
END_FOR;
END_FUNCTION
ORGANIZATION_BLOCK OB1
TITLE = 'Main Program (Cycle)'
VERSION : '0.0'
VAR_TEMP
OB1_EV_CLASS : BYTE ; //Ereignisklasse und Kennung
OB1_SCAN_1 : BYTE ; //B#16#01: Abschluss des Neustarts, B#16#02: Abschluß des Wiederanlaufes
OB1_PRIORITY : BYTE ; //Prioritätsklasse: 1
OB1_OB_NUMBR : BYTE ; //OB-Nummer, OB1
OB1_RESERVED_1 : BYTE ; //Reserviert
OB1_RESERVED_2 : BYTE ; //Reserviert
OB1_PREV_CYCLE : INT ; //Laufzeit des vorheriegen Zyklus
OB1_MIN_CYCLE : INT ; //Minimale Zykluszeit seit dem letzten Anlauf
OB1_MAX_CYCLE : INT ; //Maximale Zykluszeit seit dem letzten Anlauf
OB1_DATE_TIME : DATE_AND_TIME ; //Datum und Uhrzeit, zu dem der OB angefordert wurde
END_VAR
BEGIN
TestDaten(); // Aufruf FC
END_ORGANIZATION_BLOCK
MfG und zum Voraus vielen Dank
Leo Künzle