Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
leider konnte ich zu nachfolgendem "Problem" leider nichts gescheites im Netz finden.
Also ich habe ein Duzend Variiabeln, mit folgenden Kombinationen:
Bisher habe ich die Variabeln alle (unübersichtlich) in die Globalen Variablenliste (mehrere) eingefügt. Ihr habt mir freundlicherweise bereits vor längerer ZEit erläutert, ich könne die Variabeln auch in der Reiterkarte atentypen (oder so ähnlich) anlegen.
Nun habe ich z.B.
type: Variablenheader
struct:
Variable25, of ARRAY[1..25];
End
ENd
-Also wie es in der Hilfe erläutert ist (die Schreibweise stimmt hier nicht ganz; habe Codesys aber gerade nicht vorliegen)
In einem Programm (Name: Variablenheader) habe ich:
Variablenheader.Variable25 = 35;
Nun bekomme ich den Fehler 3701.
Könnt Ihr mir mal bitte (für einen Laien verständlich) die Vorgehensweise dieses Struct-Datenbank erläutert (sowie bitte um ein Beispiel, mit Var. in mehreren Prgs. (das auf der Hilfe-Seite bringt mich leider nicht weiter).
Vielen Dank für Eure Rückmeldung
Grüße und ein schönes Wochenende
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
So wie das hier aussieht, ist deine Variable ein Array. Das hat also mehrere Felder (25 in diesem Fall). Nun greifst Du aber in deinem Beispiel, direkt auf das Array als ganzes zu. Das wird nicht funktionieren.
Du musst auf die einzelnen Felder zugreifen.
Deine Anweisung müsste z.B. so aussehen:
Variablenheader.Variable25[1] = 35;
Beim lesen, geht das genau gleich.
Dann wird es funktionieren.
Mit freundlichen Grüssen! Pitsch
vielen Dank für Eure Hilfe. Habe es nun endlich hinbekommen.
Ich möchte nun die Eingaben, die in der Visu von einem Bediener eingegeben werden, in einem Array speichern; sodass es einem Log-Buch gleicht.
->>>Es gibt wohl keine andere Funktion wie die Logbuch-Funktion und diese kann wohl die Änderung von Variablen nicht aufzeichnen nur Force-Änderungen?
Nun mal meinen Versuch, dieser daran scheitert, dass ein Aufruf der Datentypen nicht einem Array-Aufgreif nicht gleichen darf:
TYPE Datentypen_VAr_1_12
STRUCT
Variable1:BOOL;Variable2:STRING;
....
Variable 11: BYTE;
END_STRUCT
END_TYPE
Log_Werte: OF Datentypen_VAR_1_12; (...im Register retain und perisitent )
Log_SpeicherArray: ARRAY [0..750]....
Prograamteil mit dem Problempunkt Datentype mit Array/Zahlöer aufrufen:
....
FOR Zahel:= 0 TO 12 BY 1 DO
(prüfen ob die Stringlänge überschritten wird und gegebenenfalls eine neue "Zeile" starten)
IF( (LEN(Log_WErte[Zahel**]) + LEN (Log_Werte.[Zaehl]) ) < 255 )
THEN
Log_WErte[Zeile] := CONCAT ( Log_WErte[Zaehl], '_.' );(Zwischenpunkt setzten);
Log_WErte[Zeiel] := CONCAT ( Log_WErte[Zaehl], Log_SpeicherArray[Zaehl]);(Zwischenpunkt setzten);
ELSE
Zeile:=Zeile+ 1;
Log_WErte[Zeiel] := CONCAT ( Log_WErte[Zaehl], Log_SpeicherArray[Zaehl]);(Zwischenpunkt setzten);
Zeile ++;
DAnke Euch für Hilfe.
Viele Grüße
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
CoDeSys123456 hat geschrieben:
Hallo Erik,
danke für Deine Rückmeldung.
Ich versuchs nochmal:
Ich habe ein Datentyp mit zwölf Variablen 8BOOL; BYTE, STRING] definiert.
Dieses habe ich als Variable deklariert Of Datentyp...
-> Nun möchte ich mit einer For-SChleife die Werte, die in diesen 12 Variablen stehen in einen String übertragen.
Also deklariert: WErte OF Datentypen
For-Schleife :
WErte[Zaehler_Schleife] -> Probelm die Datentypenelemente bestehen nicht aus Zaheln sonder aus Wörtern
-> Sodass eine ART log-Datei entsteht; evtl. gibt es auch schone ein vorgefertigter Baustein hierfür???
Vielen Dank und Danke für´s Verstädnis bzgl. schlechte Schreiben/Erläutern
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Mir fallen da auf Anhieb mehrere Möglichkeiten ein.
Du schreibst die Werte gleich als String in Struktur, also mit einem casting z.B. INT_TO_STRING()
oder
Du greifst auf die Struktur mit einem Pointer zu.
Also pStruct := ADR(Log_Werte[1])
und holst dir die Inhalte Byteweise wieder raus mit byLog[i] := pStruct+i;
Das ist natürlich maximal unflexibel, weil du den Byte-Zähler immer der Struktur anpassen musst.
oder was ich machen würde
Du logst die Werte direkt bei Änderung als String.
Also immer wenn sich ein Wert ändert wird eine Neue zeile ins Logfile geschrieben.
Das kannst du ja parallel in einem anderen, nieder priorisierten Task machen.
Wenn du Fileoperationen ausführst, solltest du das sogar machen, da diese immer eine gewisse Zeit blockieren.
Erik Böhm hat geschrieben:
3. Du logst die Werte direkt bei Änderung als String.
Also immer wenn sich ein Wert ändert wird eine Neue zeile ins Logfile geschrieben.
Das kannst du ja parallel in einem anderen, nieder priorisierten Task machen.
Wenn du Fileoperationen ausführst, solltest du das sogar machen, da diese immer eine gewisse Zeit blockieren.
Gruß Erik
Hallo Erik,
so würde ich es auch gerne machen; dass bestimmte Variabeln und Datenarrays (ca. 200 Stück) bei Änderung automatisch gespeichert werden.
Wie sieht diese Funktion aus oder welche Einstellungen müssen hierfür getroffen werden; bitte entschuldige meine fehlenden Kenntnisse.
Das mit den Tasks und den Prioritäten weiß ich gerade noch
Vielen Dank und Grüße
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Guten morgen beisammen,
leider konnte ich zu nachfolgendem "Problem" leider nichts gescheites im Netz finden.
Also ich habe ein Duzend Variiabeln, mit folgenden Kombinationen:
Bisher habe ich die Variabeln alle (unübersichtlich) in die Globalen Variablenliste (mehrere) eingefügt.
Ihr habt mir freundlicherweise bereits vor längerer ZEit erläutert, ich könne die Variabeln auch in der Reiterkarte atentypen (oder so ähnlich) anlegen.
Nun habe ich z.B.
type: Variablenheader
struct:
Variable25, of ARRAY[1..25];
End
ENd
-Also wie es in der Hilfe erläutert ist (die Schreibweise stimmt hier nicht ganz; habe Codesys aber gerade nicht vorliegen)
In einem Programm (Name: Variablenheader) habe ich:
Variablenheader.Variable25 = 35;
Nun bekomme ich den Fehler 3701.
Könnt Ihr mir mal bitte (für einen Laien verständlich) die Vorgehensweise dieses Struct-Datenbank erläutert (sowie bitte um ein Beispiel, mit Var. in mehreren Prgs. (das auf der Hilfe-Seite bringt mich leider nicht weiter).
Vielen Dank für Eure Rückmeldung
Grüße und ein schönes Wochenende
Hallo
So wie das hier aussieht, ist deine Variable ein Array. Das hat also mehrere Felder (25 in diesem Fall). Nun greifst Du aber in deinem Beispiel, direkt auf das Array als ganzes zu. Das wird nicht funktionieren.
Du musst auf die einzelnen Felder zugreifen.
Deine Anweisung müsste z.B. so aussehen:
Variablenheader.Variable25[1] = 35;
Beim lesen, geht das genau gleich.
Dann wird es funktionieren.
Mit freundlichen Grüssen! Pitsch
Related
Talk.ru: 1
Mahlzeit
Eine Typ-Definition einer Struktur sieht z.B. so aus:
TYPE sCarrierData:
STRUCT
iCarrierState: STATES;
strProductCode: STRING(20);
strHousingCode: STRING(20);
dwSeriennummer: DWORD;
strFehlercode: STRING(4);
iOpMode: ARRAY[1..4] of INT;
bProcessDone: BOOL;
END_STRUCT
END_TYPE
Deklaration der Variable dann so:
CarrierData: ARRAY[1..DEF_MAX_CONVEYOR] OF sCarrierData;
Und Zugriff so:
Gruß Erik
Guten Morgen beisammen,
vielen Dank für Eure Hilfe. Habe es nun endlich hinbekommen.
Ich möchte nun die Eingaben, die in der Visu von einem Bediener eingegeben werden, in einem Array speichern; sodass es einem Log-Buch gleicht.
->>>Es gibt wohl keine andere Funktion wie die Logbuch-Funktion und diese kann wohl die Änderung von Variablen nicht aufzeichnen nur Force-Änderungen?
Nun mal meinen Versuch, dieser daran scheitert, dass ein Aufruf der Datentypen nicht einem Array-Aufgreif nicht gleichen darf:
TYPE Datentypen_VAr_1_12
STRUCT
....
Variable 11: BYTE;
END_STRUCT
END_TYPE
Log_Werte: OF Datentypen_VAR_1_12; (...im Register retain und perisitent )
Log_SpeicherArray: ARRAY [0..750]....
Prograamteil mit dem Problempunkt Datentype mit Array/Zahlöer aufrufen:
....
FOR Zahel:= 0 TO 12 BY 1 DO
(prüfen ob die Stringlänge überschritten wird und gegebenenfalls eine neue "Zeile" starten)
IF( (LEN(Log_WErte[Zahel**]) + LEN (Log_Werte. [Zaehl]) ) < 255 )
THEN
Log_WErte[Zeile] := CONCAT ( Log_WErte[Zaehl], '_.' );(Zwischenpunkt setzten);
Log_WErte[Zeiel] := CONCAT ( Log_WErte[Zaehl], Log_SpeicherArray[Zaehl]);(Zwischenpunkt setzten);
ELSE
Zeile:=Zeile+ 1;
Log_WErte[Zeiel] := CONCAT ( Log_WErte[Zaehl], Log_SpeicherArray[Zaehl]);(Zwischenpunkt setzten);
Zeile ++;
DAnke Euch für Hilfe.
Viele Grüße
Mahlzeit
Was soll denn das heissen ?
Ich würde dir ja gern helfen, wenn ich wüsste was das Problem ist.
Gruß Erik
Hallo Erik,
danke für Deine Rückmeldung.
Ich versuchs nochmal:
Ich habe ein Datentyp mit zwölf Variablen 8BOOL; BYTE, STRING] definiert.
Dieses habe ich als Variable deklariert Of Datentyp...
-> Nun möchte ich mit einer For-SChleife die Werte, die in diesen 12 Variablen stehen in einen String übertragen.
Also deklariert: WErte OF Datentypen
For-Schleife :
-> Sodass eine ART log-Datei entsteht; evtl. gibt es auch schone ein vorgefertigter Baustein hierfür???
Vielen Dank und Danke für´s Verstädnis bzgl. schlechte Schreben
Servus
Mir fallen da auf Anhieb mehrere Möglichkeiten ein.
Du schreibst die Werte gleich als String in Struktur, also mit einem casting z.B. INT_TO_STRING()
oder
Du greifst auf die Struktur mit einem Pointer zu.
Also pStruct := ADR(Log_Werte[1])
und holst dir die Inhalte Byteweise wieder raus mit byLog[i] := pStruct+i;
Das ist natürlich maximal unflexibel, weil du den Byte-Zähler immer der Struktur anpassen musst.
oder was ich machen würde
Also immer wenn sich ein Wert ändert wird eine Neue zeile ins Logfile geschrieben.
Das kannst du ja parallel in einem anderen, nieder priorisierten Task machen.
Wenn du Fileoperationen ausführst, solltest du das sogar machen, da diese immer eine gewisse Zeit blockieren.
Gruß Erik
Related
Talk.ru: 1
Hallo Erik,
so würde ich es auch gerne machen; dass bestimmte Variabeln und Datenarrays (ca. 200 Stück) bei Änderung automatisch gespeichert werden.
Wie sieht diese Funktion aus oder welche Einstellungen müssen hierfür getroffen werden; bitte entschuldige meine fehlenden Kenntnisse.
Das mit den Tasks und den Prioritäten weiß ich gerade noch
Vielen Dank und Grüße
Hallo nochmals,
ich hoffe Ihr könnt mir das erläutern, mit dieser Funktion; die alle Parameter auf Änderungen prüft.; gerade im Bezug auf Arryas und Datenstrukturen.
Oder ist dies strikt ein Programm das die Paramter speicher?
Danke Euch und viele Grüße
Moin
Ich kenne da keine Funktion. Das musst du dann schon 'von Hand machen'
Gruß Erik
Hallo Erik,
wie würdest Du das angehen und gerade mit den Arrays
Vielen Dank für Dein Verständnis.
Bei Arrays drängt sich eine Schleife auf