B&R: Sys. Werte (Datenobjekte, rem. Variable)

fighter

Level-1
Beiträge
29
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
Habe wiedermal eine kleine Frage, wo ich als Programmieranfänger nicht weiter komme:
Ich habe einige Systemwerte (Zeiten, Parameter usw.) die ich über eine Visualisierung ändern möchte.
Bis jetzt hatte ich die Definitionen nur als Variablen im INIT Bereich definiert. Aber nachdem ja auch die Werte, die man in der Visu. ändert gespeichert bleiben sollten, geht ja dies mit meiner Variante nicht mehr. Wie kann ich diese auch über einen Neustart des Systems behalten. mit Remantente Variable wäre sowas auch möglich, aber ist dieser Weg der beste? Oder wäre vielleicht ein Datenobjekt besser? Bzw. wo sind überhaupt die Haupteinsatzbereiche von Datenobjekte? In der Hilfe ist ja das realtiv kurz gehalten.

mfg
 
Hallo fighter,
damit Variablen ihren Wert beibehalten müssen sie das Attribut remanent besitzen. Remanente Variablen sind warmstartsicher, du kannst remanente Variablen in den permanenten Speicher verschieben, damit werden sie kaltstartsicher. Die Speicheraufteilung stellst du in den CPU Eigenschaften ein, das Attribut setzt du in der Deklarationsliste.

Datenobjekte sind, wie der Name schon sagt, Objekte in denen Daten lesend/schreibend gehalten werden können. Bei diesen Daten handelt es sich bei uns meistens um Textlisten auf die wir nur lesend zugreifen oder zB. um dynamisch erzeugte in denen Messdaten geschrieben werden.

Datenobjekte für remanente Daten? Halte ich für unpassend, ausser bei SG3 DOs die im Fixram gehalten werden.

Grüsse, harrylask
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um einige Variablen auch kaltstartsicher zu halten, empfiehlt sich die Verwendung von Permanenten Variablen. Um diesen Bereich halbwegs übersichtlich zu halten, haben wir bei uns festgelegt, dass im Permanentbereich nur Datentypen und Datenstrukturen aus 4 Byte-Datentypen zulässig sind, deren Läge durch 40 teilbar ist (somit lässt sich die Speicherorganisation leichter überschauen).

Für größere Datenmengen würde ich in jedem Fall Datenobjekte empfehlen, welche (bei SG4) auf der CF Karte liegen. Falls es Dir was bringt hätte ich eine passende Library dazu (zwar mit schlechter Doku, aber das Ding funktioniert zuverlässig). Es ist aber notwendig, diese Datenobjekte regelmäßig zu sichern, um aktuellen Datenstände im Offline-Projekt zu halten. Abgesehen davon hab ich noch kein Tool, welches diese Daten wieder lesbar machen kann.

mfg Maxl
 
HI,
bei mir handelt es sich um ca 50 Variablen. was ist da zu empfehlen?

mfg
Wie wichtig bzw. unwiederbringlich sind die Werte?

Sprich: handelt es sich um Einstelldaten, welche nur 1 mal eingegeben werden?
Handelt es sich um "Rezeptdaten" (ist bei 50 Var. eher unwahrscheinlich)?
Sind es Stückzähler und solche Daten?
Kalibrierdaten?

Ach ja: welche AS-Version?
 
In diesem Fall würde ich die Variablen zumindest im Permanentspeicher ablegen (und vorm Verlassen der Baustelle den gesamten Permanentbereich in ein Watch-Archiv sichern).

Ein Datenobjekt hätte natürlich noch den Vorteil, dass (SG4 vorausgesetzt) es auf der CF-Karte liegt und daher auch einen CPU-Totalabsturz bzw. -tausch überlebt.
 
Hallo zusammen,
ich habe erst einmal auf DOs zurückgegriffen um Variablen darin zu speichern, aber nur weil ich mich, hätte ich sie im permanten Speicher integriert, auf eine fixe Grösse festlegen hätte müssen.

Vielleicht eine kleine Zusammenfassung:

VT permanter Speicher:
unkompliziert, schnell eingerichtet, keine Programmänderung nötig wenn ich eine Variable in den perm. Speicher verschiebe.

NT permanter Speicher:
ist batteriegepuffert, Batterieabfrage angeraten

VT DOs:
sicherer Speicher wenn es im USERROM (CF) liegt (nullspannungssicher), kann leicht auf eine andere Maschine übertragen werden (CutnPaste)

NT DOs:
ich finde den Programmieraufwand nicht unbeträchtlich (asynchrone Funktionen :-x), regelmässige Sicherung der Daten in das DO nötig

Betreff Sicherung von Variablen: Schau dir mal den Archivmodus (Watchfenster) an. Gib alle Variablen die du sichern willst ein und aktiviere den Archivmodus. Sichere das Watchfenster, gegebenfalls mit neuen Namen BlaBlaBackup oder so. Danach kannst du das Fenster schliessen. Wenn du es wieder öffnest (falls du einen neuen Namen vergeben hast drücke Watch-Konfiguration laden). Das AS fragt dich dann ob du denn Archivmodus aktivieren willst, drücke ja. Anschliessend kannst du die Werte mit Schreibe Werte übertragen. Ganz nützlich wenn du mal ein grösseres Update durchführst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Nachteil des nicht unbeträchtlichen Programmieraufwandes ist unübersehbar. Ich hab mir daher eine Library zusammengestöpselt, welche die Verwaltung von Datenobjekten komplett erledigt. (Doppelte Datenhaltung, automatische Vergrößerung/Verkleinerung, Speichern/Laden, Fehlerauswertung)

Zum Abspeichern von Maschinendaten (Positionen, Geschwindigkeiten usw.), Rezepturverwaltung, usw. kommen bei mir fast ausschließlich Datenobjekte zum Einsatz.
Im Permanentspeicher sind i.d.R. nur Daten abgelegt, welche sich ständig ändern können (Servo-Kalibrierdaten, Zähler, ...)

mfg Maxl
 
Der Nachteil des nicht unbeträchtlichen Programmieraufwandes ist unübersehbar. Ich hab mir daher eine Library zusammengestöpselt, welche die Verwaltung von Datenobjekten komplett erledigt. (Doppelte Datenhaltung, automatische Vergrößerung/Verkleinerung, Speichern/Laden, Fehlerauswertung)

Zum Abspeichern von Maschinendaten (Positionen, Geschwindigkeiten usw.), Rezepturverwaltung, usw. kommen bei mir fast ausschließlich Datenobjekte zum Einsatz.
Im Permanentspeicher sind i.d.R. nur Daten abgelegt, welche sich ständig ändern können (Servo-Kalibrierdaten, Zähler, ...)

mfg Maxl

Hallo Maxl,

sorry dass ich diesen alten Beitrag aus dem keller hole, aber eine solche Library wäre für mich sehr interessant

Grüße

Klaus
 
Hallo Maxl,
sorry dass ich diesen alten Beitrag aus dem keller hole, aber eine solche Library wäre für mich sehr interessant
Hast Du ein konkretes Projekt, bei dem Du sowas benötigst, oder möchtest Du einfach mal vorsorglich eine solche lib haben??
Das Problem dabei ist, dass die lib dem Copyright meines ehemaligen Arbeitgebers unterliegt, und ich sie deshalb nicht so mir nix dir nix aus der Hand geben kann.

mfg Maxl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast Du ein konkretes Projekt, bei dem Du sowas benötigst, oder möchtest Du einfach mal vorsorglich eine solche lib haben??
Das Problem dabei ist, dass die lib dem Copyright meines ehemaligen Arbeitgebers unterliegt, und ich sie deshalb nicht so mir nix dir nix aus der Hand geben kann.

mfg Maxl

Ein konkretes Projekt dafür habe ich im Moment nicht, nur könnte ich damit einige Dinge die ich auf meiner TODO Liste für zukünftige Softwareversionen habe, Deiner Beschreibung nach, bequem realisieren.

Programmierung ist nur eine meiner Aufgabe und von C hab ich bis jetzt noch sehr wenig Ahnung, was mir die Erstellung von Libraries doch deutlich erschwert...

Aber Danke trotzdem für eine prompte Antwort! Das Problem mit dem Copyright kann ich absolut nachvollziehen..

Ich sollte mich doch auch mal mit C auseinander setzen (wenn der Tag 40 Stunden hat)


Grüße

Klaus
 
Die Library hab ich (soweit ich mich erinnern kann) sogar noch in Automation Basic geschrieben, bin erst im Laufe des dann folgenden Projektes nach und nach auf C umgestiegen (weil's für die CNC notwendig war). Ein paar Grundgedanken zum Thema dieser Library kann ich Dir aber gerne geben:

1. Prinzip der Uploadbarkeit von Datenmodulen
Ein generelles Problem bei Datenobjekten ist, dass man diese zwar uploaden kann, ein upgeloadetes Datenobjekt aber nicht mehr verändern kann. Das Uploaden ist aber wünschenswert, um Damit Rezepturdaten usw. zu sichern.

2. Prinzip der doppelten Module (Deklaration / Datenhaltung)
Um dennoch uploaden und nachträglich die Deklaration (speziell die Kommentare) verändern zu können, ist jedes Datenobjekt doppelt am Zielsystem vorhanden. Das offline deklarierte Modul wird zwar aufs Zielsystem geladen, allerdings wird darin keine Datenhaltung vorgenommen. Für die eigentliche Datenhaltung legt die lib online eine Kopie des originalen Datenobjektes an, auf das die eigentlich lese- und schreibzugriffe erfolgen - dieses Objekt kann nun zur Datensicherung hochgeladen werden

3. Funktion der Library
Die Library enthält im wesentlichen 3 Eingangsparameter
- Name des Deklarations-Datenobjektes
- Name des Datenhaltungs-Datenobjektes (welches dann online erzeugt wird)
- Zeiger auf den Speicherbereich, über den dann das Anwenderprogramm zugreift
zusätzlich gibt es noch eine Reihe weitere Parameter zum lesen/schreiben/neu initialisieren/Fehlerauswertung usw.

Beim Hochlauf der CPU läuft im wesentliches folgendes Schema ab:
- Prüfung, ob Deklarations-Datenobjekt vorhanden
- Prüfung, ob Datenhaltungs-Datenobjekt vorhanden (wenn nein: neu erzeugen und Daten aus Deklarations-Datenobjekt in Datenhaltungs-Objekt kopieren)
- alle Daten aus Datenhaltungs-Objekt in den Bereich im RAM kopieren, der über einen Zeiger übergeben wurde (ob dies nun eine Datenstruktur oder ein freier Bereich im DRAM ist obliegt dem Programmierer)

Der Zugriff des Anwenderprogramms erfolgt ganz normal per Datenstruktur oder Zeiger - mit einem boolschen lib-Eingangsparameter wird das Schreiben auf das Datenobjekt angestoßen. Zusätzlich hab ich noch Mechanismen eingebaut, die mir erlauben, nur Teile des Datenbereiches aufs Datenobjekt zu schreiben bzw. Teile vom Datenobjekt wieder nachzuladen.

Noch ein sehr wichtiger Punkt war mir die Möglichkeit, Datenobjekte im nachhinein zu vergrößeren/verkleinern (weil z.B. statt 200 plötzlich 500 Rezepte gebraucht werden). Dies wird ebenfalls beim Hochlauf der CPU überprüft: unterscheiden sich die Längen des Deklarations-Datenobjektes und des Datenhaltungs-Objektes, wird zuerst online eine Sicherung des Datenhaltungs-Objektes angelegt (um nicht allzu kreativ bei der Namensgebung sein zu müssen, kann man den Umstand ausnutzen, dass online Objektnamen eine Länge von 10 Zeichen haben dürfen), anschließend wird das ursprüngliche Datenhaltungs-Objekt gelöscht und mit der neuen Länge wieder angelegt, schlussendlich werden die zuvor gesicherten Daten wieder aufs Datenhaltungs-Objekt kopiert und die Sicherzungskopie gelöscht.
Warum der Aufwand mit dem Sicherungs-Objekt: man stelle sich vor, man kopiere die original-Daten "nur" ins RAM und während dem löschen und neu Anlagen des Datenhaltungs-Objektes fällt die Versorgungsspannung aus....
Auch bei der Variante mit Sicherheitskopie muss man sich überlegen, welche Zustände auftreten können, wenn während dem herumsichern/-kopieren die Versorgungsspannung ausfällt, und was man alles ausprogrammieren muss um dennoch immer konstistente Zustände zu erhalten.

mhm, was hab ich vergessen?
Ach ja, die lib immer in Taskklasse 8 anwenden, und bei der Programmierung darauf acht geben, dass nicht zu viele Aufrufe gleichzeitig laufen (wobei: ich habs mal auf einem APC620 mit AR106 getestet, da gabs bei ca. 35 gleichzeitig beim Hochlauf aktiven Instanzen keinerlei probleme), die größten Datenobjekte die ich damit verwaltet habe sind 96k groß - hier war es allerdings notwendig, für den Zugriff aus dem Anwenderprogramm heraus mit des lib ASMem eigene Speicherblöcke zu allokieren, bevor ich die Datenobjekt-Library anwenden konnte.

mfg Maxl


edit:
Ach ja: Zeitaufwand für die lib ca. 4-5 Tage (3 Tage 2005 fürs Grundkonzept, und nochmals 1-2 Tage letztes Jahr zum Verfeinern)
 
Zuletzt bearbeitet:
Zurück
Oben