[dokuwiki] Re: Bug in spellchecker

  • From: Matthias Grimm <matthiasgrimm@xxxxxxxxxxxxxxxxxxxxx>
  • To: dokuwiki@xxxxxxxxxxxxx
  • Date: Sat, 11 Jun 2005 11:42:00 +0200

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.

Other related posts: