#define in codesys?

HomerX

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

ich schreibe derzeit eine kleine Applikation für einen EtherCAT slave in TwinCAT um dessen Diagnosemeldungen über CoE auszulesen. Die ausgelesenen Fehlermeldungen (16-Bit Zahl) werden in einem File abgespeichert.

Anstatt nun im Handbuch nachschlagen zu müssen welche Fehlermeldung zu der jeweiligen Fehlernummer gehört, will ich nun direkt den passenden Textstring in das File schreiben.
Ich komme eher aus der C Ecke und mein erster Ansatz war einfach ein .h File zu erzeugen in dem per #define jeder Fehlernummer der passende Textstring zugeordnet wird.

#define Error1 "Fehlertext zu Error1"
#define Error2 "Fehlertext zu Error2"
...

Dieses File würde ich dann einfach includieren und per switch/case den passenden Textstring suchen.
Ist dies in TwinCAT möglich? Kann ich da beliebige .h-Files includieren und gibt es überhaupt defines in Codesys?
 
ich weiß nicht, ob ich dich richtig verstehe, aber kannst du nicht einfach String variablen anlegen, die eben genau deinen Error Text haben und die dann ausgeben?

error1 : STRING :='Fehlertext zu Error1';

dann baust du einen baustein, der jedem error eine Zahl zuweist und switched die dann durch!?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In c wird in diesem Beispiel nicht einer Fehlernummer ein Text zugeordnet, sondern es wird eine Textkonstante mit dem entsprechenden Inhalt definiert. Diese kann so nicht in einem switch verwendet werden.
 
Das ginge schon, ich will die Fehlertexte allerdings gerne in einem extra header file haben und nicht im Programm drin.

Falls sich texte ändern kann ich einfach das .h File beim Kunden tauschen, ohne dass der ans Programm rangehen muss.
 
In c wird in diesem Beispiel nicht einer Fehlernummer ein Text zugeordnet, sondern es wird eine Textkonstante mit dem entsprechenden Inhalt definiert. Diese kann so nicht in einem switch verwendet werden.

Das ist richtig, der switch/case würde aber auch nicht auf Error1/Error2 etc abfragen sondern auf die tatsächliche Fehlernummer

switch(Fehlernummer)
{
case 1: /*Error1 als String in File schreiben*/
break;
case 2: /* Error2 als String in File schreiben*/
break;

etc...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja, so wie ich das auch geschrieben habe. jedem string mit fehlertext eine fehlernummer zuweisen und die durch switchen.

Du kannst das Programm auch einfach auf deinem Rechner lassen und es dann beim Kunden austauschen, wenn sich was geändert hat. ob du jetzt ein header file austauscht oder das SPS Programm eben neue aufspielst. Zeitunterschied etwa 5 sekunden.
 
Du kannst das Programm auch einfach auf deinem Rechner lassen und es dann beim Kunden austauschen, wenn sich was geändert hat. ob du jetzt ein header file austauscht oder das SPS Programm eben neue aufspielst. Zeitunterschied etwa 5 sekunden.

Der unterschied ist der dass ich das .h File einem Kunden schicken kann und dieser das File einfach über das alte kopiert und es keine Probleme gibt... Wenn er ein neues Programm aufspielen muss tun sich manche schon schwerer.

Desweiteren bin ich eigentlich Entwickler (des EtherCAT Slaves von dem die Fehler ausgelesen werden) und werden später nicht viel mit Kundensupport etc zu tun haben. Die Applikation ist mehr eine Art Hilfestellung für eventuelle Kunden unseres Slaves um die Diagnose zu vereinfachen.

Gibt es keine defines in Codesys? Könnte ich evtl den Vorschlag von dir aufgtreifen und einfach Stringvariablen erzeugen, diese aber in einem seperaten headerfile? macht codesys da probleme wenn es Variablen verwenden soll die über ein headerfile includiert werden aber nicht im eigentlcihen Programm deklariert sind?
 
Das ist richtig, der switch/case würde aber auch nicht auf Error1/Error2 etc abfragen sondern auf die tatsächliche Fehlernummer

switch(Fehlernummer)
{
case 1: /*Error1 als String in File schreiben*/
break;
case 2: /* Error2 als String in File schreiben*/
break;

etc...

Mit dieser Methode bringt die h-Datei nicht viel. Wenn Fehler dazukommen oder wegfallen, muss der Programmcode geändert werden.
Unabhängiger wäre:
- eine Struktur definieren bestehend aus Fehlernummer und Fehlertext
- ein Array dieser Strukturen anlegen
- eine Fehlernummer als Listenende definieren (z.B. -1),
- einen Baustein schreiben, der die Liste nach der gewünschten Fehlernummer durchsucht und den zugehgörigen Text zurückgibt und das Endekennzeichen berücksichtigt
Grundsätzlich muss nach der Änderung der Fehlerdefinitionen das Programm neu compiliert werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich würde es mit einem Array machen das in eine CSV Datei geschrieben wird

Code:
fehlertext1,fehlertext2,fehlertext3,fehlertextn
Würde dann in der CSV Datei stehen, welche man einfach mit Excel ändern kann. Das ganze liest man im Programm aus, packt es in ein Array. Dann ruft man nur noch folgendermaßen auf:

Arrayname[fehlernummer(-1)]

Man muss vermutlich noch ein Offset von -1 aufrechnen da das Array von 0-n gefüllt wird, und deine Fehlernummern wohl 1-n sind. Außer 0 steht für ALLES OK, dann kannst du Array 0 leer lassen und somit nichts anzeigen.

Der Vorteil läge darin das die Maschine weiterläuft wenn sich die Fehlermeldungen ändern, da man nur via FTP auf das Filesystem zugreift.

MfG

Marcel
 
Mit dieser Methode bringt die h-Datei nicht viel. Wenn Fehler dazukommen oder wegfallen, muss der Programmcode geändert werden.

Das wäre in diesem Falle kein Problem da es eine maximale obergrenze für die Anzahl der Fehlermeldungen gibt und keine neuen hinzukommen könnten. Lediglich Texte könnten sich ändern.

- eine Struktur definieren bestehend aus Fehlernummer und Fehlertext
- ein Array dieser Strukturen anlegen (in h-Datei)
- eine Fehlernummer als Listenende definieren (z.B. -1),
- einen Baustein schreiben, der die Liste nach der gewünschten Fehlernummer durchsucht und den zugehgörigen Text zurückgibt und das Endekennzeichen berücksichtigt
Grundsätzlich muss nach der Änderung der Fehlerdefinition das Programm neu compiliert werden.

dies wäre natürlich auch eine Möglichkeit.

Aber du hast mir gerade klar gemacht dass ein Neucompilieren ja auch notwendig wird wenn sich ledigleich ein h File ändert... Da habe ich nicht richtig nachgedacht.

Eine Möglichkeit dies zu umgehen wäre wohl ein Textfile mit Fehlernummer+Fehlertext zu erzeugen und im TwinCat Programm per Filezugriffen die passenden Texte auszulesen... Dies ist vermutlich aber nur umständlich/langsam realisierbar oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wieso? Man müsste nur halt darauf achten das z.B. leere Fehlermeldungen in der CSV als '' stehen. Dann geht das wunderbar!
Oder es wird ein 2D Array nach dem motto :

Code:
fehlernummer, fehlertext
fehlernummer, fehlertext

Fehlerarray[fehlernummer,0] wäre dann der aufruf!

MfG

Marcel
 
ich würde es mit einem Array machen das in eine CSV Datei geschrieben wird


Code:
fehlertext1,fehlertext2,fehlertext3,fehlertextn
Würde dann in der CSV Datei stehen, welche man einfach mit Excel ändern kann. Das ganze liest man im Programm aus, packt es in ein Array. Dann ruft man nur noch folgendermaßen auf:

Arrayname[fehlernummer(-1)]

Man muss vermutlich noch ein Offset von -1 aufrechnen da das Array von 0-n gefüllt wird, und deine Fehlernummern wohl 1-n sind. Außer 0 steht für ALLES OK, dann kannst du Array 0 leer lassen und somit nichts anzeigen.

Der Vorteil läge darin das die Maschine weiterläuft wenn sich die Fehlermeldungen ändern, da man nur via FTP auf das Filesystem zugreift.

Das hört sich genau nach dem an was ich suche...

könntest du mir ein kleines Beispiel zeigen wie sowas auszusehen hat? Wie greife ich aus TwinCAT auf so ein CSV File zu?


Btw Dake für die schnellen Antworten hier :)

edit: ah ok gerade nochmal in ruhe durchgelesen... man liest also mit FB_FileGets String für String in ein Array ein und verwendet dann im Programm dieses Array.

Das einlesen müsste man dann in einem relativ langen zyklus wiederholen damit es im Falle einer Textänderung aktualisiert wird... oder?
 
Zuletzt bearbeitet:
Es ist zwar für Wago und Codesys, sollte aber bei Twincat auch klappen!

http://www.wago.com/wagoweb/documentation/app_note/a1141/a114100d.pdf

An deiner Stelle würde ich es machen die Rainer vorgeschlagen hat, das ersparrt Leereinträge wenn du keine fortlaufenden Fehlernummern hast.

Array[fehlernummer,fehlertext] sollte dein Mittel der Wahl sein!

MfG

Marcel

P.S: Schnelle Hilfe ist eigentlich selbstverständlich, man hofft sie selbst auch immer zu bekommen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Diese ReadCSVFile Funktion ist vermutlich eine WAGO eigene Funktion und nicht in den TwinCAT libs enthalten oder?

Aber gut das sollte kein Problem sein dann muss ich das einlesen eben "von Hand" durchführen mit den standard Filezugriff Funktionen von TwinCAT.
 
Zurück
Oben