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

Datenypen Objektdatenbank

2014-07-25
2023-08-17
  • CoDeSys123456 - 2014-07-25

    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

     
  • Pitsch - 2014-07-25

    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

  • Erik Böhm - 2014-07-25

    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:

    CarrierData[4].iCarrierState    := _PASS;
    CarrierData[4].iOpMode[2]   := 1;
    CarrierData[4].dwSeriennummer   := STRING_TO_DWORD(fbLC_BoardPermit.sPcbResCode);
    

    Gruß Erik

     
  • CoDeSys123456 - 2014-10-07

    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 1: BOOL;
            Variable 2: 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

     
  • Erik Böhm - 2014-10-07

    Mahlzeit

    Was soll denn das heissen ?

    Zitat:
    Nun mal meinen Versuch, dieser daran scheitert, dass ein Aufruf der Datentypen nicht einem Array-Aufgreif nicht gleichen darf:

    Ich würde dir ja gern helfen, wenn ich wüsste was das Problem ist.

    Gruß Erik

     
  • CoDeSys123456 - 2014-10-07

    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 Schreben

     
  • CoDeSys123456 - 2014-10-07

    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

     
  • Erik Böhm - 2014-10-07

    Servus

    Mir fallen da auf Anhieb mehrere Möglichkeiten ein.

    1. Du schreibst die Werte gleich als String in Struktur, also mit einem casting z.B. INT_TO_STRING()
      oder

    2. 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

    1. 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

     

    Related

    Talk.ru: 1

  • CoDeSys123456 - 2014-10-07

    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

     
  • CoDeSys123456 - 2014-10-09

    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

     
  • Erik Böhm - 2014-10-09

    Moin

    Ich kenne da keine Funktion. Das musst du dann schon 'von Hand machen'

    Gruß Erik

     
  • CoDeSys123456 - 2014-10-09

    Erik Böhm hat geschrieben:
    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.

     
  • Erik Böhm - 2014-10-09

    Bei Arrays drängt sich eine Schleife auf

     

Log in to post a comment.