# #define in codesys?



## HomerX (24 Juni 2010)

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?


----------



## Mattin81 (24 Juni 2010)

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!?


----------



## Rainer Hönle (24 Juni 2010)

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.


----------



## HomerX (24 Juni 2010)

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.


----------



## HomerX (24 Juni 2010)

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


----------



## Mattin81 (24 Juni 2010)

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.


----------



## HomerX (24 Juni 2010)

> 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?


----------



## Rainer Hönle (24 Juni 2010)

HomerX schrieb:


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



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.


----------



## Matze001 (24 Juni 2010)

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


```
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


----------



## Rainer Hönle (24 Juni 2010)

Das kann funktionieren, wenn die Fehlernummern schön aufsteigend und ohne Lücken sind


----------



## HomerX (24 Juni 2010)

> 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?


----------



## Matze001 (24 Juni 2010)

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 : 


```
fehlernummer, fehlertext
fehlernummer, fehlertext
```

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

MfG

Marcel


----------



## HomerX (24 Juni 2010)

> ich würde es mit einem Array machen das in eine CSV Datei geschrieben wird
> 
> 
> Code:
> ...


 
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?


----------



## Matze001 (24 Juni 2010)

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


----------



## HomerX (24 Juni 2010)

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.


----------

