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

Variabel Name ermitteln ...

mactoolz
2011-02-21
2011-02-28
  • mactoolz - 2011-02-21

    Hallo,

    gibt es eine Möglichkeit den Variabelname auszulesen und als String speichern zu können. ???

    MacToolz

     
  • NetFritz - 2011-02-22

    Hallo
    Wenn Du die Variablen in eine Datei haben möchtest um sie weiter zu bearbeiten oder auszudrucken,
    Kannst du unter eine 'Extras' 'Doku-Vorlage erstellen'.
    Der Befehl steht zur Verfügung, wenn ein Objekt der Globalen Variablen geöffnet ist.
    Gruß NetFritz

     
  • mactoolz - 2011-02-22

    Hi,

    ne das meinte ich leider nicht. Ich würde gerne die Variabeln als Variabelname selber wegschreiben wollen als
    Ersatz für die Watchliste weil die leider nicht sauber funktioniert. Wenn dort mehr als ca. 800 Zeilen geschrieben werden sollen
    dann ist halt die lange Laufzeit nicht akzetabel.

    Abe gut so wie es aussieht muss ich mir selber eine Funktion schreiben die eine String in Byte Konvertierung vornimmt
    und dann selber wegschreibe. Muss halt den Vairbaelnamen dann selber übergeben + Wert
    und das ganze dann schön als Zeigerarithmetik etc.....

    MacToolz

     
  • KlOis - 2011-02-23

    Hi MacTools,

    du kannst, wenn du nur ein paar Werte wegspeichern willst, auch eine Struktur mit allen wichtigen Werten erstellen und diese bei bedarf in eine Datei schreiben.
    Als Pointer übergibst du der Filefunktion direkt die Adresse deiner Struktur (ADR(STRUKTUR)) und als Größe die Strukturgröße.

    Wenn du die Datei wieder ausliest, kannst du den Inhalt wieder direkt auf die Struktur schreiben.

    Ich hoffe mal das du so dein Problem "erschlagen" kannst, oder wolltest du die Daten extern der Steuerung auswerten?

    Gruß
    KlOis

     
  • mactoolz - 2011-02-23

    Hi,

    es geht mir nicht direkt um die Werte sondern auch um die Variabel Namen, die sind ja mit das wichtigste wenn diese
    wieder zurück gelesen werden.

    Naja ich muss mir da was überlegen, habe da schon eine Idee. Ich dachte nur nicht dass ich das Rad nochmal erfinden muss.

    MacToolz

     
  • KlOis - 2011-02-23

    Servuz MacToolz,

    MacToolz hat geschrieben:
    es geht mir nicht direkt um die Werte sondern auch um die Variabel Namen, die sind ja mit das wichtigste wenn diese
    wieder zurück gelesen werden.

    Bei der von mir oben genannte Variante würdest du die Werte nicht selber zuweisen müssen.

    Bsp.

    TYPE ST_UHRZEIT :
    STRUCT
       usiHour:         USINT;
       usiMin:         USINT;
    END_STRUCT
    END_TYPE
    VAR
       stUhrzeit:         ST_UHRZEIT;
       stUhrzeit2:         ST_UHRZEIT;
    END_VAR
    (*   Datei schreiben   *)
    dwHandle:=SysFileOpen('Data.dat',w);
    SysFileWrite(dwHandle, ADR(stUhrzeit), SIZEOF(stUhrzeit));
    SysFileClose(dwHandle);
    (*   Datei lesen   *)
    dwHandle:=SysFileOpen('Data.dat',r);
    SysFileWrite(dwHandle, ADR(stUhrzeit2), SIZEOF(stUhrzeit2));
    SysFileClose(dwHandle);
    

    Nach einmal Schreiben und einmal Lesen würde in stUhrzeit2 das gleiche stehen wie in stUhrzeit.
    Wie die Variablen heißen kann dir egal sein.
    Oder hab ich dein Anliegen falsch verstanden

    Gruß
    KlOis

     
  • mactoolz - 2011-02-23

    Hi,

    ich glaube ich stehe auf dem Schlauch oder wir reden aneinander vorbei oder die Lösung gefällt mir nicht

    Den Namen der Variabel muss ich haben weil, was soll ich denn machen wenn es hier um ca. 300 verschiedene Variabeln geht.
    Die stehen ja nicht alle in einer Struktur etc. Vom Typ her sind alle Variabeln vorhanden.

    Vom Prinzip her hast du Recht. Wenn eine Struktur vorhanden ist, die Adresse an SysFileWrite übergeben und beim lesen wieder an die Adresse wieder zurück schreiben.

    Aber vom Prinzip her soll es so werden wie die Watchliste bei CoDeSys, für den Fall das man auch über die Watchliste verschiedene Dateien (Rezepturen)
    extern bearbeiten kann und wieder einspielen kann.

    MacToolz

     
  • Anonymous - 2011-02-23

    Originally created by: blackenslaver666

    Nabend.
    Um nochmal etwas Licht ins Dunkel zu bringen: Ich glaube was du willst ist die symbolischen Bezeichner, sprich den Varnamen, ermitteln und wegspeichern. So hab ich das verstanden.

    Zur Aufgabe:
    Leider gibt es glaube ich keine Möglichkeit dies zu tun. Ich brauchte das auch mal und hab einen Kollegen gefragt der sich sehr gut mit CoDeSys auskennt. Die Antwort war: Leider gibt es das nicht. Sollte es doch eine Möglichkeit geben würde es mich auch sehr interessieren wie...

    Gruß

     
  • mactoolz - 2011-02-23

    Hi,

    ok dann habe ich mich was falsch ausgedrückt. Ja genau so meine ich das.

    Ich habe da aber schon eine Idee. Man erstellt eine Struktur die beinhaltet
    den

    Variabel Namen als String
    Variabel Typ, z.B. aus einer Enumeration
    Adresse zu der Variabel

    Array von dieser Struktur, ein Element entspricht eine Variabeln

    Dann eine Funktion die dann über die Enum den Typ ermitelt damit der Wert dann in ein String konvertiert wird + den Variabelnamen & Wert als String in das Array of Byte Byteweise ablegt.

    So mal die ersten Gedanken.

    MacToolz

     
  • KlOis - 2011-02-24

    Moin,

    MacToolz hat geschrieben:
    Aber vom Prinzip her soll es so werden wie die Watchliste bei CoDeSys, für den Fall das man auch über die Watchliste verschiedene Dateien (Rezepturen)
    extern bearbeiten kann und wieder einspielen kann.

    Das würde mit meiner Variante schwer werden ^^
    Die Variablennamen scheinst du auch nicht raus zu bekommen, damit wird dein Vorhaben schwer, wenn du eine allgemein gültige Watchliste nachbilden willst.

    MfG
    Klaus

     
  • Anonymous - 2011-02-24

    Originally created by: blackenslaver666

    Moin.
    Ich weiss nicht ob dir das hilft, aber evt. ist es auch eine Option: Man kann in CodeSys auch mit einer Kommandodatei arbeiten. Suchwort "Kommandodatei (Cmdfile)-Befehle". Damit könnte man sich eine Batchdatei schreiben und z.B. eine Watchliste speichern oder laden. Mit Batchdatein haben wir auch schon gearbeitet, wenn wir z.B. ASCII-Prozessdaten von der Steuerung saugen und in ein Excelfile importieren. Die Batchdatei wird dann über eine CodeSys-Vis aufgerufen. Wir benutzen die Watchliste nicht, ich weiss daher nicht wie die Datei letztlich ausschaut. Aber evt. kannst du damit die Namen abgreifen und auch extern manipulieren. Was auch immer du damit dann anstellen willst. Vielleicht hilft dir das ja.

    Gruß

    Ps: Deinen Ansatz hatten wir damals auch durchdacht, aber letztlich ist das ja 2-3-facher Aufwand, der sich nicht wirklich lohnt mMn.

     
  • mactoolz - 2011-02-24

    Hallo,

    wie greift ihr denn auf die Variabeln über die Batchdatei zu, OPC ???

    Was macht denn genau die VIS Datei. Kenne ich garnicht.

    MacToolz

     
  • Anonymous - 2011-02-24

    Originally created by: blackenslaver666

    Das hast du falsch verstanden. Die Batch-Datei liegt nicht auf dem Controller sondern lokal auf deinem Programmiergerät. In unserem Falle hat diese Datei das ASCII-File von der Flash auf das PG via FTP transportiert und die Daten in ein Excel-File zur Auswertung importiert.

    Die VIS sind die Visualisierungsmasken im Register "Visualisierung". Ich benutze die regelmäßig zum Echtzeit-Trending von Prozesswerten. Die Visualisierung ersetzen auch zum Großteil mein HMI weil ich darüber alles ebenso einstellen kann (Maschine starten/stoppen, Fehler quittieren etc.). Optional kann man dort per Tasterdruck auch ein Programm starten, z.B. besagtes Batchfile.

    In dem Watchlist-File werden übrigens die Varnamen so wie du sie brauchst abgespeichert. Allerdings ist mir immer noch nicht ganz klar was du damit überhaupt willst. Soll das eine Rezepturverwaltung werden?

    Gruß

     
  • mactoolz - 2011-02-24

    Hi,

    ja so soll es sein, nur das Problem ist mit der Watchliste dauert das ewig.

    Ich werde mal das selber machen. Werde dann mal präsentieren.

    MacToolz

     
  • Anonymous - 2011-02-24

    Originally created by: blackenslaver666

    Nabend.
    Für Rezepte ist bei uns der IPC/HMI zuständig, dort werden diese in lesbarer Form gespeichert. Wenn ein Rezept geladen werden soll werden alle diese Werte auf den Treiber gelegt und in die Steuerung runter geschrieben. Es gab (ist schon länger her) allerdings auch mal eine Rezepturverwaltung auf der Steuerung. Hier mal die Punkte von denen ich denke dass sie wichtig sind und dir helfen könnten:
    - Lege dir zwei globale benutzerdefinierte Datenstruktur an, diese kannst du mit deinen gewünschten Variablen füllen. Vorteil: Im Onlinemodus hast du diese dann alle in einem Fenster wie in der Watchliste!
    - Arbeite in deinem Programm ebenfalls mit einer dieser Rezeptstruktur.
    - Die zwei Rezeptstrukturen kannst du unterschiedlich benutzen. Mit der 1. arbeitet dein Steuerungsprogramm. Die 2. ist für Reviewung & Modifizierung gedacht, d.h. du lädst dein gewünschtes (binäres) Rezeptfile in diese Struktur damit du dir die Werte angucken bzw. ändern kannst. Anschließend kannst das auch wieder wegschreiben. Ist dann halt alles online, aber das sehe ich nicht als Nachteil.
    - Lege nur eine einzige Rezeptstruktur an! Grund: Da läufst du nicht Gefahr unbenutzte Variablen NICHT zu beschreiben. Das ist bei einer Auswahl aus X Variablen sonst öfters passiert.
    - Speichern kannst du ein Rezept unter einem Filename mit dem "BinaryWriter". Nachteil ist, dass die Files binär codiert sind, d.h. nicht lesbar / manipulierbar, aber dafür geht das Laden/Speichern um etliches schneller als mit dem "ASCIIWriter". Wir haben beides im Einsatz wobei komplexe Strukturen binär gespeichert werden.
    - Nachteil der Lösung ist dass du die Liste nicht offline bearbeiten kannst. Dafür läuft man aber auch nicht Gefahr, eine nicht existente oder gelöschte Var im Rezept zu haben. Sonst meckert der Compiler.
    - In diesem Fall entfällt die ganze Varnamen-Geschichte, du speicherst und lädst direkt die Varwerte aus deinem File in deine Rezeptstruktur.

    Evt. regen dich diese Punkte ja nochmal an. Nichtsdestotrotz bin/wäre ich auf deine Umsetzung gespannt.

    Gruß

     
  • mactoolz - 2011-02-25

    Hi,

    mhhh, ja auch gut. Aber halt alle Varibel in die Struktur legen und dann immer den Strukturnamen. Gut macht nichts.

    Aber der "BinaryWriter" ??? Wo kommt der her ???

    MAcToolz

     
  • Anonymous - 2011-02-27

    Originally created by: blackenslaver666

    Aus unserer Lib. Der "BinaryWriter" nutzt die Systemfunktion "WriteToFile" und ermöglicht byteweises Schreiben von Daten in eine Datei ohne Konvertierung.

    Hast schon Code am Start?

     
  • mactoolz - 2011-02-28

    Hi,

    achso, das ist eine eigene LIB.???

    Sowas habe ich mir auch schon als Funktion programmiert wo ich über Zeiger alle Datentypen in ein Datenspeicher wie ein Array of Byte Byteweise schreibe.

    Ne leider noch nicht. Ist zeitlich was schwierig, kleine Schritte mal zwischendurch.

    MacToolz

     

Log in to post a comment.