TwinCat Load Symbol Data @camper
-
5.) Ein Pointer to Array mit konstanten als Grenzen
VAR CONSTANT minIndex:INT := 1; maxIndex:INT := 20; END_VAR VAR pointer_array_constant : POINTER TO ARRAY [minIndex..maxIndex] OF BYTE; END_VAR
endet darin das ansstatt wie sonst "POINTER TO ARRAY [1..20] OF BYTE " im TypeName nun POINTER TO "ARRAY [MININDEX..MAXINDEX] OF BYTE" steht. Und davon aber auch keine Informationen der Subsymbols über ADS bereit gestellt werden.
Workaround mit regular expressions -> Keine Dimensions mehr anlegen wenn keine Grenzen bekannt sind.Nervig. Erst recht, falls Sachen wie POINTER TO ARRAY[FOO^[1]..BAR[2]] (mit FOO, BAR ebenfalls solchen Arrays mit unklaren Grenzen) möglich sind. Man müsste wohl tatsächlich bei allen Arrays, die unbekannte Grenzen haben, diese Grenzen notieren, und versuchen, die jeweiligen Konstanten in einem weiteren Schritt auslesen (evtl. mehrfach, falls diese Konstanten eben selbst Arrayelemente sind). Mit TwinCAT3 könnte man evtl. auch Attribute heranziehen, um die Arraygrenzen zu ermitteln (nur in einfachen Fällen, weil ja Verschachtelungen eh nicht richtig gehandhabt werden).
@booster sagte in TwinCat Load Symbol Data @camper:
Meiner Meinung nach wäre es wohl für die Zukunft besser einen Pharser zu schreiben um die ganzen Fälle im Typename feld zu ermitteln und einfacher erweitern zu können.
Die meiste funktionalität steckt bei dir aktuell im Konstruktor von AdsData. Nicht gerade übersichtlich.Urspünglich ging es ja auch nur darum, die bereitgestellten Daten auszulesen und zugänglich zumachen. Der Einbau von Workarounds wegen Bugs war nicht geplant
Aktuell habe ich noch das Problem dass du in AdsVarData nur den shortName abspeicherst ohne den prefix. Wenn ich den ganzen Namen benötige muss ich selbst den prefix mit übergeben. Das Konzept dahiner habe ich noch nicht verstanden.
Hier geht es darum, unnötige Duplikate zu vermeiden (schon um nicht unnötig Speicher zu verschwenden). Ein Element einer Struktur existiert ja für jede einzelne Instanz dieser Struktur; die Definition des Elementes erfolgt aber nur einmal - dieser einzelnen Definition kann aber logischerweise dann kein vollständiger Name zugeordnet werden, sondern nur der Kurzname, anhand dessen das Element innerhalb der Struktur identifiziert wird.
Wenn ich mich recht erinnere, war das ja mit ein Teil des Problems, dass im ursprünglichen Code, den du hattest, der Speicherverbrauch enorm war, weil bei Arrays aus Strukturen auch die einzelnen Strukturelemente für jedes Arrayelement dupliziert wurden und der vollständige Name ja u.U. recht lang sein kann.
-
@camper sagte in TwinCat Load Symbol Data @camper:
Urspünglich ging es ja auch nur darum, die bereitgestellten Daten auszulesen und zugänglich zumachen. Der Einbau von Workarounds wegen Bugs war nicht geplant
Nun ja. Ich sag mal so die ganze string fumelei wurde ja nur gemacht weil die ADS Schnittstelle voller bugs ist. Das alles war also sowieso schon ein workaround weil Beckhoff die meisten Informationen in dem feld Typename als string codiert und hier mehr ausnahmen drin sind als Regeln.
@camper sagte in TwinCat Load Symbol Data @camper:
Wenn ich mich recht erinnere, war das ja mit ein Teil des Problems, dass im ursprünglichen Code, den du hattest, der Speicherverbrauch enorm war, ...
Ja klar lag es daran, aber ich habe ja nichts davon wenn ich einfach Informationen weglasse die ich benötige nur damit ich den Speicherverbrauch reduziere. Ich muss in meiner Liste nach einem Vollständigen Namen suchen können.
-
@camper sagte in TwinCat Load Symbol Data @camper:
Wenn ich mich recht erinnere, war das ja mit ein Teil des Problems, dass im ursprünglichen Code, den du hattest, der Speicherverbrauch enorm war, ...
Ja klar lag es daran, aber ich habe ja nichts davon wenn ich einfach Informationen weglasse die ich benötige nur damit ich den Speicherverbrauch reduziere. Ich muss in meiner Liste nach einem Vollständigen Namen suchen können.
Es wird ja gerade keine Information weggelassen: eine Liste aller Variablen kann jederzeit leicht generieren werden, es muss nur beachtet werden, dass eine einfache Schleife nicht ausreicht, sondern (zweckmäßigerweise) rekursiv gearbeitet werden muss (einige meiner simplen Testprogramme tun genau das).
Welche konkrete Funktionalität vermisst du?
-
Unser Konzept war bisher so dass ich mir alle Symbole aus der SPS lade und nur von den benötigten Symbolen Instanzen erzeuge für den lesenden und schreibenden Zugriff.
Für dieses erzeugen der Klassen haben wir eine Factory geschrieben die Informationen über den Datentypen des Symbols benötigt. Da wir nur zugriff auf ein paar bestimmte Datentypen benötigen ist das mit den vielen ausnahmen im typename gar nicht aufgefallen bzw. war uns auch egal.
Das Regelwerk hat für uns ausgereicht. Unser vorhaben war eigentlich nie die Intigrität der SPS zu prüfen. Sowieso nicht über die fehlerhafte ADS Schnittstelle.Was natürlich nicht optimal war, war das auslesen und aufbereiten der Symbole was ja aber größenteils von Beckhoff war.
Hier hast du mir ja sehr viel geholfen.Nun zu deiner Frage:
Ich will ja keine Liste aller Variablen generieren sondern nur die Informationen von ein paar benötigten Variablen anfordern.
Und hier möchte ich ja nicht über alles interieren.Aber: Ich habe nun denn fullname zum test mit in AdsData abgelegt. Und muss sagen mein Speicher steigt nicht wirklich deutlich an.
Speichverbrauch beim Start meines Programmes : 12.000 KB
Speichverbrauch Nach dem laden aller Symbole : 18.000 KBVon dem her sieht das doch gut aus.
-
Würde nun gerne die AdsVarData Instanz einer Ads Variablen in meiner Zugriffsklasse auf die Ads Variable speichern. Aber dazu natürlich keine Kopie der AdsVarData anlegen. Hätte dies jetzt als shared_ptr auf die adsVardata Instanz ablegen.
Du hast in deinem Code keinen shared_ptr verwendet.
Weiß jetzt nicht wie ich nun von deinen zurückgelieferten AdsVarData Objekten keine kopien ablege sondern nur Zeiger darauf.
Kannst du mir da nochmals helfen?
-
Wie wär's wenn du die Sprache lernst bevor du Auftragsarbeiten annimmst?
-
@Swordfish sagte in TwinCat Load Symbol Data @camper:
Wie wär's wenn du die Sprache lernst bevor du Auftragsarbeiten annimmst?
Danke für die harten Worte. Würde jetzt zwar nicht sagen dass ich ganz ungelernt bin. Aber mit dem Code von Camper habe ich etwas zu kämpfen.
Aber nur weil nun ein paar Dinge Unklar sind darf ich hier nicht nachfragen? Genau aus den Antworten von hier lerne ich ja dazu.
-
Hm? Zeig mal wo du nicht Pointer machen kannst?
-
@booster sagte in TwinCat Load Symbol Data @camper:
Weiß jetzt nicht wie ich nun von deinen zurückgelieferten AdsVarData Objekten keine kopien ablege sondern nur Zeiger darauf.
Nun ja Pointer kann ich schon machen. Die Frage war eigentlich eher an Camper wieso seine Klasse eine Kopie auf adsvardata zurückliefert und keinen Zeiger darauf.
-
Ah, uh, ah
-