Textsteuerung in ST

Kann ich jetzt also nur mit FIND das auch Programmieren?
Ja.
Code:
Hier einige Beispiele für mögliche Texte:
"Ventil bitte aufmachen",
"Bitte öffnen Sie V1",
"V1 jetzt schließen",
"Ventil zumachen",
"V1 auf",
"öffne das Ventil V1"
Diese Beispiele verändern die Sachlage ein wenig.
Der zu testende String darf also weitere Elemente enthalten und besteht nicht nur aus zwei Elementen, die zu testen wären.
"bitte", "machen", "Sie", "jetzt", "das" dürfen eingestreut sein.
"zu" und "auf" müssen auch als Bestandteil eines Wortes berücksichtigt werden, zumindest am Anfang eines Wortes.

Wenn ich dein Code betrachtet, dann testest du mit FIND ob "auf öffne oeffne" gibts in die Eingabestring. Also nicht ob einer von die einzelne Wörter sondern ob alle Wörter da sind.
Nein. Nicht, ob alle Wörter des Strings vorhanden sind, sondern ob ein einziges aus der Auswahl an gleichbedeutetenden Begriffen vorhanden ist.
Allerdings wird vorausgesetzt, dass der zu testende String sich auf zwei Worte beschränkt.

Dein Ventil ist ein OUTPUT.
Dann kannst du nicht die Status von VENTIL abfragen.
Wie du es programmiert hast:
Ventil := (Ventil OR tbV1Auf) AND NOT tbV1zu ;
Stimmt! Ventil war als InOut und nicht als OUTPUT geplant.

Hätte es jetzt so gelöst?
Deine Lösung hat ebenfalls genau das Problem, das Jesper (Danke!) aufgedeckt hat:
Ventil muss als VAR_IN_OUT deklariert werden.
 
Nein. Nicht, ob alle Wörter des Strings vorhanden sind, sondern ob ein einziges aus der Auswahl an gleichbedeutetenden Begriffen vorhanden ist.
Allerdings wird vorausgesetzt, dass der zu testende String sich auf zwei Worte beschränkt.
Wenn ich IEC 61131-3 FIND checkt, dann gibt es immer 2 Strings In1 und In2 als Parameter, und
The function FIND returns the character offset of the first occurrence of In2 in string In1.
edit:
das Beispiel
FIND("Something else", "Some Text")
ergibt die Rückgabewert 0 obwohl "Some" gibts in "Something".
Die Suchstring muss ganzlich mit Leerzeichen und alles in die Vergleichstring geben, sonnst ist das Ergebnis 0.
 
Zuletzt bearbeitet:
Ich dachte mir das wären nur Beispiele und das ich sie nicht verwenden muss
Die Aufgabe ist leider nicht klar definiert und es wird durch die Beispiele nur angedeutet, was evtl. an zu testenden Strings angeliefert werden könnte. Das ist leider eine seeehr schwammige Vorgabe, um etwas danach zu programmieren. ;)
Was machst Du z.B. wenn der String lautet "Vergiss nicht, V1 zu öffnen"? Zu oder auf?

Wenn ich IEC 61131-3 FIND checkt, dann gibt es immer 2 Strings In1 und In2 als Parameter, und

The function FIND returns the character offset of the first occurrence of In2 in string In1.
Ja, genau. Was willst Du uns jetzt damit sagen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, genau. Was willst Du uns jetzt damit sagen?
Ich glaube wir reden uns beide vorbei.
Wenn ich sage
Wenn ich dein Code betrachtet, dann testest du mit FIND ob "auf öffne oeffne" gibts in die Eingabestring.
dann meine ich dass mit die Code von SPS-Anfänger wird nach den gesammten String "auf öffne oeffne" getestet, nicht die einzelne Wörter innerhalb von diesen String.
Aber das bestreitest du in Beitrag #62, oder verstehe ich das falsch ?
 
Ja kann ich es jetzt trotzdem so programmieten wie ich es gerade gemacht habe aber nur die fehlenden worte dazufüge oder wieder ganz anderes
Wenn du die Ventil in ein VAR_IN_OUT und ändert die letzte Zeilen ins
Ventil := (Ventil OR (BefehlVentil AND BefehlAuf)) AND NOT (BefehlVentil AND BefehlZu) ;
dann ist es richtig.
Simulier dein Code, dann siehst du ob es funktioniert wie gewünscht.

edit: Die Klammer sind wichtig !
 
Das Problem ist aber das in der Angabe stehr boolesche Ausgangsvariable Ventil
 

Anhänge

  • 7337250F-6B24-4267-A3D0-8912429D5F47.jpeg
    7337250F-6B24-4267-A3D0-8912429D5F47.jpeg
    1,5 MB · Aufrufe: 23
Zuviel Werbung?
-> Hier kostenlos registrieren
edit:
das Beispiel
FIND("Something else", "Some Text")
ergibt die Rückgabewert 0 obwohl "Some" gibts in "Something".
Die Suchstring muss ganzlich mit Leerzeichen und alles in die Vergleichstring geben, sonnst ist das Ergebnis 0.
Das war Absicht. Das Wort 'auf' soll nicht erkannt/gefunden werden, wenn der zu testende String z.B. aus dem Wort 'Schaufel' besteht.

Ich glaube wir reden uns beide vorbei.
Wenn ich sage

dann meine ich dass mit die Code von SPS-Anfänger wird nach den gesammten String "auf öffne oeffne" getestet, nicht die einzelne Wörter innerhalb von diesen String.
Aber das bestreitest du in Beitrag #62, oder verstehe ich das falsch ?
Nein, Jesper, wir reden nicht aneinander vorbei.
Der zu testende String wird in zwei Hälften zerlegt (wie gesagt, unterstellt wurde, dass er ausschliesslich aus zwei Worten besteht).
Die erste Hälfte wird in der Liste zum Thema Ventil gesucht und
die zweite Hälfte wird separat in der Liste für auf und in der Liste für zu gesucht.

Kann ich jetzt also nur mit FIND das auch Programmieren?
Ja.

Code:
Hier einige Beispiele für mögliche Texte:
"Ventil bitte aufmachen",
"Bitte öffnen Sie V1",
"V1 jetzt schließen",
"Ventil zumachen",
"V1 auf",
"öffne das Ventil V1"
Diese Beispiele verändern die Sachlage ein wenig.
Der zu testende String darf also weitere Elemente enthalten und besteht nicht nur aus zwei Elementen, die zu testen wären.
"bitte", "machen", "Sie", "jetzt", "das" dürfen eingestreut sein.
"zu" und "auf" müssen auch als Bestandteil eines Wortes berücksichtigt werden, zumindest am Anfang eines Wortes.

Wenn ich dein Code betrachtet, dann testest du mit FIND ob "auf öffne oeffne" gibts in die Eingabestring. Also nicht ob einer von die einzelne Wörter sondern ob alle Wörter da sind.
Nein. Nicht, ob alle Wörter des Strings vorhanden sind, sondern ob ein einziges aus der Auswahl an gleichbedeutetenden Begriffen vorhanden ist.
Allerdings wird vorausgesetzt, das der zu testende String sich auf zwei Worte beschränkt.

Dein Ventil ist ein OUTPUT.
Dann kannst du nicht die Status von VENTIL abfragen.
Wie du es programmiert hast:
Ventil := (Ventil OR tbV1Auf) AND NOT tbV1zu ;
Stimmt! Ventil war als InOut und nicht als OUTPUT geplant.

Tschuldigung, musste ein paar Stunden weg und habe gerade von meinen angefangenen Antworten einiges (z.T. doppelt) und einiges gar nicht mehr hier vorgefunden.
Ihr beiden ward ja so was von schnell und eifrig mit euren Beiträgen! Ich schicke die Überreste jetzt erstmal ab und versuche mich dann wieder hier einzusynchronisieren ...
 
Nebenbei, es ist mir nicht bewusst ob die Vergleich >0 überflüssig ist oder nicht.
Kann sein dass ein logischen Abfrage von FIND die Rückgabewert TRUE gibt wenn das Offset >0 ist.
Nein, das Ergebnis von FIND ist nicht BOOL, sondern numerisch.
Aber man könnte statt ...
Code:
x := (FIND(FindeEvtlHier1, Suche1) > 0) OR (FIND(FindeEvtlHier2, Suche2) > 0)
... z.B. auch folgendes schreiben und damit einmal '> 0' eisparen:
Code:
x := (FIND(FindeEvtlHier1, Suche1) + FIND(FindeEvtlHier2, Suche2)) > 0

PS:
Ich will aber nicht ausschliessen, dass der eine oder andere Compiler clever genug ist, mittels impliziter TypKonvertierung (zufällig?) das gewünschte Ergebnis zu liefern.

PPS:
Beispiel für FIND beim Suchen der ersten Ziffer in einem String:
Code:
VAR_INPUT
    isTxt  : STRING ;
END_VAR
  
VAR_OUTPUT
    oiErg  : INT ;
END_VAR
  
VAR_TEMP
    tiErg  : INT ;
    tiIdx  : INT ;
END_VAR

tiErg := 0 ;
FOR tiIdx := 1 TO LEN(S:= isTxt) DO
    tiErg := FIND(IN1:= "0123456789"; IN2:= MID(IN:= isTxt; L:= 1; P:= tiIdx)) ;
    IF tiErg > 0 THEN EXIT ; END_IF ; // Suche abbrechen, weil 1. Ziffer gefunden wurde
END_FOR ;
oiErg := tiErg - 1 ; // PositionsNr vermindert um 1 ergibt den Wert der gefundenen Ziffer oder -1, wenn keine Ziffer gefunden wurde
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Vermutlich schließt die Referenzlösung das Ventil auch bei "Ventil nicht zumachen".
Da fängt es wirklich an, schwierig zu werden. Das Wort 'nicht' einfach zu ignorieren (wie z.B. gefahrlos bei "bitte" oder "jetzt"), finde ich falsch,
Das Wort 'nicht' aber einfach als Negation auszuwerten, egal, wo es im Satz vorkommt, finde ich - sagen wir mal - abenteuerlich.
Gleich kommt Harald noch mit seinen Beispielen, dass es auf die Position des Kommas ankommt? ;)
Ergo, wenn das Wort 'nicht' im Satz vorkommt, neige ich dazu, den ganzen Satz unwirksam zu machen und eine FehlerMeldung zu generieren.

Was soll passieren, wenn der Satz lautet "Die V1 ist nicht aufzuhalten"? Man verzeihe mir bitte den Rückgriff auf die Wunderwaffe des tausendjährigen Reiches. ;)
Wie wär's mit "Tür abschliessen und Ventilator einschalten" oder "Hyperventilierende gibt es hier zuhauf" oder einfach "Zulaufventil"?
 
Zuletzt bearbeitet:
Darum würde man die Sprache formalisieren, z.B. in mindestens Subjekt und Prädikate, dann Syntax Erkennung, und anschließend die Semantik prüfen. Ein Ventilator lässt sich nur ein- oder ausschalten. Eine Tür öffnen oder schließen und abschließen, ein Ventil öffnen oder schließen usw. Aber ich vermute das war hier nicht die Aufgabenstellung, sondern nur ein paar Wörter in einem String zu suchen und das wars.
 
Warum hast du die Leerzeichen in die Such-Strings ?
Damit z.B. in dem Text ' Ventilator zuhause einschließen ' weder das 'Ventil' in 'Ventilator' noch das 'zu' in 'zuhause' noch das 'schließe' in 'einschließen' gefunden und das Ventil nicht grundlos geschlossen wird. ;)
Allerdings wird dadurch auch nicht das 'auf' in 'aufmachen' gefunden und nicht das 'öffne' in 'öffnen' u.s.w. ...
Man müsste schon eine präzise Vorgabe haben, um zu entscheiden, was genau gewollt und was genau ungewollt ist.

Darum würde man die Sprache formalisieren, z.B. in mindestens Subjekt und Prädikate, ...
Die deutsche Sprache macht es einem manchmal schon extrem schwer, Subjekt und Objekt eindeutig zu unterscheiden, mangels SPO-Regel. ;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Zu später Stunde ein kleines Beispiel für eine mögliche Formalisierung:

Code:
SubjektEinAus = "Ventilator" | "Motor".
SubjektAufZu = "Tür" | "Ventil" | "Fenster".
PrädikatEinAus = "einschalten" | "ausschalten" | "ein" | "aus".
PrädikatAufZu = "auf" | "zu" | "öffnen" | "schließen" | "aufmachen" | "zumachen".

Ausdruck = (SubjektEinAus PrädikatEinAus) | (SubjektAufZu PrädikatAufZu).
Satz = Ausdruck { ("," | "und") Ausdruck}.

Ich finde wenn man sich mit dem Thema befasst und auch und ein Minimal-Beispiel umsetzt, lässt sich wirklich sehr viel daraus lernen. Auch wie Compiler funktionieren, warum und wie etwas erkannt und umgesetzt wird.
 
Auch wie Compiler funktionieren ...
Die Compiler haben es aber verhältnismässig sehr leicht, da sie nicht in "UmgangsSprache" programmierte Texte verarbeiten/akzeptieren müssen - die Kommentare im Programm gehen sie ja nichts an.
Sie müssen aber trotzdem ständig in riesigen Listen nachschauen, Reservierte Begriffe, VariablenNamen, etc. und sie sind sehr pingelig bezüglich der Schreibweise.
 
Habe die Hausaufgabe abgeschickt und habe es mir auf eine 3 ausbessern können. Naja immerhin besser als eine 5.
Danke für euer bemühen.


Ich hätte eine Frage bezüglich ein Trace hinzufügen.
Habe es erst schonmal zum laufen gebracht habe dann aber irgendetwas gedrückt und jetzt steht immer das hier. Auch wenn ich es Simulieren möchte, es geht nicht mehr weg. Hat jemand eine Ahnung?
 

Anhänge

  • Screenshot (287).png
    Screenshot (287).png
    117,3 KB · Aufrufe: 31
Zurück
Oben