On Fri, 10 Jun 2005 23:34:31 +0200 Andreas Gohr <andi@xxxxxxxxxxxxxx> wrote: > Well these changes did correct the output for me so i can't be all wrong ;-) I attaced the complete text I use for testing. It is a little bit longer than the first one I sent. Tell me if it works for you. Best Regards Matthias
====== ESD Datenbank2 ====== In der ESD Datenbank werden drei Typen von Daten gespeichert: - Elektroniken - Stecker - Testabläufe Verifizierte Daten sollen in eine System-ESD-Datenbank gespeichert werden, die nur von autorisierten Benutzern verändert werden kann. Dadurch soll sichergestellt werden, da� diese Daten zuverlässig und geprüft sind und reproduzierbar verwendet werden können. Diese Datenbank soll unter /usr/share/ESD-Datenbank angelegt werden. Eine evtl. Unterteilung soll in der Konfigurationsdatei definiert werden: - path_Devicedata Definition von Geräten - path_Testdata Definition von Testabläufen - path_Plugdata Definition von Steckern Um den Mitarbeitern die Möglichkeit zu geben Ihre Daten zu testen und z.B. Testablaüfe für ihre eigenen Zwecke zu definieren, soll zusätzlich das aktuelle Verzeichnis durchsucht und dort gefundenen Daten der drei oben genannten Kategorien ebenfalls zur Auswahl angeboten werden. Der Systemdatenbank wird jedoch vor den privaten Dateien Priorität eingeräumt, sofern Namensgleichheit herrscht. ===== Konfiguration ===== Die Konfiguration des Programms wird in einer Konfigurationsdatei gespeichert, die global in /etc gespeichert wird. Die Modifikation ist nur dem Administrator gestattet. Persönliche Anpassung des Programms ist nicht möglich und auch nicht erforderlich. ===== Daten der letzten Messung ===== Der aktuelle Stand eines Prüfablaufs soll z.B. bei Unterbrechungen gespeichert werden. Wird eine entsprechende Datei bei Programmstart im aktuellen Verzeichnis gefunden, wird die Fortsetzung der Messung angeboten. Die Sicherung dieser Datei gegen �berschreiben durch andere Benutzer bleibt dem Benutzer überlassen. Es (snapshot.c) wird eine Liste aller Variablen und deren Inhalt geführt. Die einzelnen Module können nun die Variablen lesen und schreiben. Wird eine bestehende Variable geschrieben, ändert sich der Inhalt. Wird eine neue Variable geschrieben, wird sie der Liste hinzugefügt und bei Programmende automatisch gesichert. Gelesen werden können ausschlie�lich Variablen, die bereits in der Liste existieren. ===== Der Datenflu� ===== Einzelne Programmteile (Module) haben Fähigkeiten oder bieten Dienste, die andere Programmteile in Anspruch nehen können. Dafür mu� allerdings ein potentieller Nehmer dem Geber sageb können, was er benötigt und die Information mu� auch wieder zurücklie�en. Wir haben vier Hauptmodule, die folgende Dienste anbieten: <code> Datenbank < ECU Daten struct < Testdaten struct ESD Tester > Lüfter ein/aus bool > ESD Puls auslösen bool > Fahrfreigabe geben bool > Polarität einstellen bool < Puls (nicht) ausgelöst bool RLC Brücke < Me�wert C float < Me�wert R float < Identifikation der Brücke string < Me�frequenz float < Ersatzschaltbild bool < Me�spannung AC float < Me�spannung DC float Roboter > Bewegungsbefehle struct < Statusinformationen string </code> Aus der Vielfalt der Eingangs- und Ausgangsvariablen kann man schlie�en, da� ein einfachen statisches Komandomodell nicht geeignet ist. Vielmehr müsssen dynamisch allokierte Daten ausgetauscht werden. Da es prinzipiell Punkt-zu-Punkt Verbindungen zwischen Anforderer und Lieferant sind, scheint ein Verteilsystem nicht zweckmä�ig. Ein Schachtsystem, bei dem es eine Liste an verfügbaren Informationen oder Aufgaben gibt für die sich dann jeweils genau ein Lieferant bzw. Bearbeiter registrieren kann, scheint geeigneter. Zu jeder Information bzw. Aufgabe wird dann die genaue Definition von Eingangs- und Ausgangsgrö�en benötigt. Eine Anforderung würde mit den Argumenten dem Lieferanten zugestellt, der ggf. seine Daten einträgt und diese mit der Bestätigung an den Anforderer zurückschickt. Der Anforder ist dann jeweils für die Bereitstellung und Entsorgung evtl. benötigten Speichers zum Datenaustausch verantwortlich. Der Lieferant sorgt dafür, das bis auf die Antwortfelder keine Daten der Anforderung verändert oder gelöscht werden. Die Definition der Informationsliste könnte so aussehen: <code> Information/Aufgabe Eingang Ausgang RLCVALUES - 2x float (R und C) RLCCONFIG - 3x float (f, Vac, Vdc) und 1x bool (Schaltb.) RLCID - 1x string (Identifikation) ESDFAN 1x bool (on/off) 1x bool (Erfolg: ja/nein) ESDTRIGGER - 1x bool (Erfolg: ja/nein) ESDPOLARITY 1x bool (pos/neg) 1x bool (Erfolg: ja/nein) ESDVOLTAGE 1x float (Spannung) 1x bool (Erfolg: ja/nein) ESDDISCHARGE - 1x bool (ja/nein) ROBOTDRIVEGO - 1x bool (Erfolg: ja/nein) ROBOTMOVELIN 1x struct robotpos 1x bool (Erfolg: ja/nein) ROBOTMOVEPTP 1x struct robotpos 1x bool (Erfolg: ja/nein) ROBOTVELOCITY 1x float 1x bool (Erfolg: ja/nein) ROBOTTOOL 1x int 1x bool (Erfolg: ja/nein) ROBOTTOOLTURN ??? 1x bool (Erfolg: ja/nein) ROBOTMOVESTART - 1x bool (Erfolg: ja/nein) ROBOTMOVEHOME - 1x bool (Erfolg: ja/nein) DBGETPIN 2x int (plug, pin) 1x struct pin (Zeiger, keine Kopie) DBGETPLUG 1x int (plug) 1x struct plug (Zeiger, keine Kopie) DBGETECU - 1x struct ecu (Zeiger, keine Kopie) DBGETTEST - 1x struct esdtest (Zeiger, keine Kopie) </code> ===== Ablaufsteuerung ===== Bei der Ablaufsteuerung müssen alle Aktionen synchronisiert ablaufen, d.h. eine Aktion kann erst durchgeführt werden, wenn die vorherige abgeschlossen wurde und es wieder an der Zeit ist. Es verbietet sich von selbst das Programm irgendwo in einer Schleife warten zu lassen, da dann die Bedienoberfläche nicht mehr reagieren würde. Deshalb soll eine Aktion angesto�en werden und wenn diese nicht Erfolgreich war, weil z.B. die vorhergehende Aktion noch nicht abgeschlossen ist, soll der Befehl beim nächsten Umlauf einfach nochmal angesto�en werden und zwar solange bis er entweder Erfolgreich ist oder der Ablauf wegen Zeitüberschreitung des laufenden Befehls abgebruchen werden mu�. Die zentrale Ablaufsteuerung schickt einen CmdRequest an die Module, um eine bestimmte Aktion auszuführen. Fühlt sich ein Modul zuständig, kann es sein, das vor der Ausführung erst weitere Aktionen ausgeführt werden müssen. Dazu schaltet das bearbeitende Modul seine CmdRequests vor den toplevel CmdRequest. Die Hauptschleife macht dann mit dem obersten CmdRequest dieser Liste weiter und führt die angehängten CmdRequest erst wieder aus, wenn der aktuele SUCCESS meldet. Jeder Request wird Zeitüberwacht. Wird eine eingestellte Zeit überschritten, wird der CmdRequest und alle anderen in der Liste gelöscht. Den Auftraggebern jedes gelöschen Request wird TIMEOUT gemeldet. Der Speicher für die CmdRequest Struckturen wird von der zentralen Steuerung entsorgt. Das selbe passiert, wenn der aktuelle CmdRequest ERROR meldet. Jedem Auftraggeber angehängter CmdRequests wird ebenfalls ERROR gemeldet und die CmdRequests gelöscht. In jedem Fall wird der Request erst nach der Meldung gelöscht, soda� der Auftraggeber noch Daten retten oder eigene Speicherbereiche freigeben kann sofern nötig. Alle sog. toplevel CmdRequest (der CmdRequest auf der obertsen Ebene) sind gleichberechtigt und werden in undefinierter Reihenfolge bearbeitet. Alle CmdRequests in einer Liste werden der Reichenfolge entsprechend un auch nur bei Fehlerfreiheit abgearbeitet. Weiterhin kann jedes Modul Einflu� auf die zentrale Steuerung nehmen, indem es bestimmte Felder in der CmdRequest Struktur setzt oder verändert. Dies könnte z.B. nötig werden, wenn nach Ausführung des CmdRequests noch einige Zeit gewartet werden soll, bevor der Auftraggeber über den Erfolg informiert wird. Mögliche Beeinflussungen der zentralen Steuerung sind: 1. Eine bestimmte Zeit warten bevor der nächste CmdRequest in der Liste bearbeitet wird. <code> +--<--------<---------<---------<---------<-----+ +--> TopRequest --> TopRequest --> TopRequest --+ oberste Ebene | | SubRequest SubRequest | SubRequest </code> Jeder SubRequest wird nach un nach TopRequest bis die Liste abgearbeitet und gelöscht ist.