Globales Struct bespeichern nicht möglich?

Robi123

Level-2
Beiträge
19
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag Zusammen,

Folgendes Problem: Ich habe mir innerhalb einer Bibliothek ein "ErrorStruct" gebaut welches eine Fehler Beschreibung enthält (ErrorID, ErrorType, TimeStamp).
Diese Bibliothek habe ich jede meiner anderen Bibliotheken eingebunden und kann so meine Fehler im ErrorStruct speichern.
Nun möchte ich falls ein Fehler auftritt (ErrorType<>0) diese in einem Projekt, welches auch die Bibliothek eingebunden hat mit dem Struct ein Globales Persistentes Array bauen, welches die Fehler aller Bausteine abspeichert.
Wenn ich nun aber im Hauptprojekt sage: ErrorStruct[Indext] := FB.ErrorStruct; sagt mit der Compiler "Cannot convert type ErrorStruct to type ErrorStruct". Also sind es auf eine Art die gleichen Struct, aber eigentlich nicht wirklich? Kann mir da jemand weiter helfen?

Grüße
 
Du solltest den gleichen Typ nicht zweimal bauen. Verwende im Hauptprojekt einfach den gleichen Typ aus der Bibliothek.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So mach ich das meines Verständis nach auch...
So initialisiere ich den Speicher im Hauptprojekt.
Code:
ErrorStorage : ARRAY[0..100] OF ErrorStruct;
Füllen möchte ich ihn dann folgendermaßen:
Code:
ErrorStorage[ErrorStorageIndex] := FB.CurrentError;

Wobei CurrentError Also Output Variable auch wieder das Struct "anspricht"
 
Hi,

konnte das Problem lösen. So, wie ich es programmiert hatte funktioniert es. Ich hatte nur eine alte Version der Bibliothek falsch eingebunden.
Danke trotzdem für die Hilfe.
 
Hat jetzt eigentlich nichts mit deinem Problem zu tun, aber warum kopierst du die Struktur um und greifst nicht über einen Zeiger darauf zu?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hat jetzt eigentlich nichts mit deinem Problem zu tun, aber warum kopierst du die Struktur um und greifst nicht über einen Zeiger darauf zu?
Da ich mich mit pointern noch nicht gut auskenne, bin ich noch gar nicht auf die Idee gekommen. Wie müsste der Zugriff dann aussehen?
 
Du könntest in deinem FB zum Beispiel die Struktur als Input Referenz deklarieren.

Code:
FUNCTION_BLOCK FB_MessageOperate
VAR_INPUT
    MessageSturct  : REFERENCE TO Struktur; 
END_VAR

Und dann im Aufruf sieht das so aus

Code:
//Zuweisung im Code
fbMessage.MessageStruct REF= GlobalMessageStruct;

//Zuweisung beim FB Aufruf
fbMessage(MessageStruct   := GlobalMessageStruct);


Hier kannst du auch noch etwas nachlesen: TwinCat REFERENCE
 
Du könntest in deinem FB zum Beispiel die Struktur als Input Referenz deklarieren.

Code:
FUNCTION_BLOCK FB_MessageOperate
VAR_INPUT
    MessageSturct  : REFERENCE TO Struktur;
END_VAR

Und dann im Aufruf sieht das so aus

Code:
//Zuweisung im Code
fbMessage.MessageStruct REF= GlobalMessageStruct;

//Zuweisung beim FB Aufruf
fbMessage(MessageStruct   := GlobalMessageStruct);


Hier kannst du auch noch etwas nachlesen: TwinCat REFERENCE

Jetzt verstehe ich, was du meinst. Vorteil davon wäre weniger Speicherbedarf, da der Zeiger eben auf den bestehenden Datenstand zeigt?

Funktioniert für meinen Fall aber glaube ich nicht ganz, da ich die Fehler in meinen FB's als output deklariere um später mein Fehlerarray zu befüllen. Das Array wiederrum soll persistent sein und dann die Fehler im HMI anzeigen und bei Bedarf auch löschen können.
Danke trotzdem für den Tipp, der hat noch eine Verständnislücke gefüllt :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Funktioniert für meinen Fall aber glaube ich nicht ganz, da ich die Fehler in meinen FB's als output deklariere um später mein Fehlerarray zu befüllen
Funktioniert natürlich genauso. Du gibst als Referenz das entsprechende Arrayfeld an. Du darfst dich nicht daran stören, dass es im Header als "Input" deklariert ist. Sobald du es referenziert hast, arbeitest du ja damit nicht mehr in deinem bausteinlokalen Speicher sondern direkt im Zielspeicher.
 
Funktioniert natürlich genauso. Du gibst als Referenz das entsprechende Arrayfeld an. Du darfst dich nicht daran stören, dass es im Header als "Input" deklariert ist. Sobald du es referenziert hast, arbeitest du ja damit nicht mehr in deinem bausteinlokalen Speicher sondern direkt im Zielspeicher.
Ah ja, ich verstehe. Finde ich aber irgendwie etwas unschön als Input :D
Andererseits wäre es etwas sauberer. Danke jedenfalls für die Hilfe.
 
Zurück
Oben