Textsteuerung in ST

aem

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

bin ziemlich unerfahren im SPS programmieren, also seid bitte nachsichtig wenn ich falsche Begriffe verwende ;)

Ich möchte gerne Ansteuerung zu einem Ventil mit ST realisieren, wobei die Ventilstellung durch die Eingabe eines Textes geändert wird. Dieser Text könnte z.B. über eine automatische Texterkennung aus gesprochenen Worten ermittelt werden.

Die Texte, die zum Öffnen oder Schließen des Ventils führen, müssen die Zeichenfolgen "Ventil" oder "V1" und zusätzlich für das Öffnen des Ventils "öffne" oder "auf" und für das Schließen "schließe" oder "zu" enthalten.

Es soll in einem FB festgestellt werden, ob bei dem vorgegebenen "Eingabetext" das "Ventil" der Wert TRUE (Ventil auf) oder FALSE (Ventil zu) annehmen soll. Dazu muss geprüft werden, ob der eingegebene Text die angegebenen Schlüsselzeichen enthält.

Ich habe erstmal so versucht zu realisieren:

IF (Text1 = 'Ventil' OR Text1 = 'V1') AND (Text2 = 'öffne' OR Text2 = 'auf') THEN Ventil := TRUE; END_IF;
IF (Text1 = 'Ventil' OR Text1 = 'V1') AND (Text3 = 'schließe' OR Text3 = 'zu') THEN Ventil := FALSE; END_IF;



Ich denke, der Code erfüllt nicht so ganz die Angaben der Aufgabenstellung, oder ?

Könnt Ihr mir bitte hier weiterhelfen ?

Vielen Dank im voraus
 
Dieser Text könnte z.B. über eine automatische Texterkennung aus gesprochenen Worten ermittelt werden.
...
Ich denke, der Code erfüllt nicht so ganz die Angaben der Aufgabenstellung, oder ?
Doch, doch! Perfekt! Hoffentlich arbeitet die "automatische Texterkennung aus gesprochenen Worten" ebenso perfekt.
Ich würde mal intensiv testen, was für Ergebnisse die TextErkennung zu liefern in der Lage ist ... und wenn's hoffnungsvoll erscheint, ergeben sich wahrscheinlich schon die FussAngeln, die Du im Programm berücksichtigen müsstest.
Spontan würde ich die Vergleiche der Soll- und IstTexte erstmal so erweitern, dass trotz Unterschieden in der Gross-/Kleinschreibung auf Gleichheit erkannt wird.

PS:
Vllt bekommst Du für 'Ventil' 'Wentil' oder 'wenn Thiel' (der Münsteraner TatortKommissar) geliefert. Oder 'doodlebug' (der Spitzname der Engländer für die Wunderwaffe V1) für 'V1'.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Heinileini,

Zunächst vielen Dank für Deine schnelle Antwort

Ich habe das Programm getestet und es hat auch so funktioniert, d.h. Wenn der Eingabetext genauso eingegeben wird, wie in der "IF-Anweisung" definiert ist, reagiert das ventil entsprechend richtig. Frage dazu, was Du erwähnt hast mit Gross- / Kleinschreibung! Kann ich es ohne zusätzliche "OR" Schalter (Text1= 'ventil' OR Text1='v1') realisieren ? Gibt es vllt. eine andere Variante ?
 
Sorry, habe erst jetzt gemerkt das dies eine Beckhoff eigene Funktion ist. Bei Codesys müsste dies wohl die Funktion StrToUpperA in der StringUtils Library können.
https://help.codesys.com/webapp/j_V...ToUpperA;product=StringUtils;version=3.5.15.0

Diese Funktion benutzt eine Pointer to String bzw. CharBufferPtr (POINTER TO BYTE) als Übergabewert, dieser muss beim Aufruf mit ADR(<String>) übergeben werden.
Beispiel mit deinem Text1 (String): StrToUpperA(pString:= ADR(Text1))
 
Hallo ich hätte eine Frage zu diesem Thema.
Ich hätte das in ST so programmiert und es funktioniert auch, aber ich bin mir sicher das ich es nicht so schreiben soll. Könnten mir jemand eine Tipp geben.
Danke im voraus.
MFG
 

Anhänge

  • Screenshot (213).png
    Screenshot (213).png
    145,9 KB · Aufrufe: 93
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde es in dieser Art angehen (ungetestet):
Code:
Text1    := ' V1 Ventil ' ;
Text2    := ' auf öffne oeffne ' ;
Text3    := ' zu schließe schliesse ' ;

tiPosBlk := FIND (Eingabetext, ' ') ;
tsTextL  := CONCAT (' ', LEFT (Eingabetext, tiPosBlk) ;
tsTextR  := CONCAT (MID (Eingabetext, 31, tiPosBlk), ' ') ;

tbV1     :=  FIND (Text1, tsTextL) > 0 ;
tbV1Auf  := (FIND (Text2, tsTextR) > 0) AND tbV1 ;
tbV1Zu   := (FIND (Text3, tsTextR) > 0) AND tbV1 ;

Ventil   := (Ventil OR tbV1Auf) AND NOT tbV1Zu ;

PS:
zusätzlich verwendete temporäre Variablen:
Code:
VAR
    tiPosBlk : INT ;
    tsTextL  : STRING ;
    tsTextR  : STRING ;
         
    tbV1     : BOOL ;
    tbV1Auf  : BOOL ;
    tbV1Zu   : BOOL ;
END_VAR
 
Zuletzt bearbeitet:
Danke für deine schnelle Antwort ich hätte es jetzt so Programmiert, aber es funktioniert nicht.
Woran scheitert's? Bei der 31 als LängenAngabe beim MID weiss ich nicht, ob CodeSys das so akzeptiert.
Einen anderen Verdacht habe ich im Moment nicht.

Meldet der Compiler, dass er mit irgendwas nicht zufrieden ist? Was bedeutet "funktioniert nicht"? Tut sich gar nichts? Läuft es, jedoch anders als beabsichtigt?
 
Ah ja, Left und Mid sind rot unterstrichen. Anscheinend verkraftet Concat es nicht, wenn dort weitere Funktionen stehen?
In meiner Variante aus #9 fehlt eine Klammer - sehe ich gerade - aber die hattest Du ja schon ergänzt.

Code:
tiPosBlk := FIND (Eingabetext, ' ') ;
tsTextL  := CONCAT (' ', LEFT (Eingabetext, tiPosBlk)) ;
tsTextR  := CONCAT (MID (Eingabetext, 31, tiPosBlk), ' ') ;
... ersetzen durch ...
Code:
tiPosBlk := FIND (Eingabetext, ' ') ;
tsTextL  := LEFT (Eingabetext, tiPosBlk) ;
tsTextL  := CONCAT (' ', tsTextL) ;
tsTextR  := MID (Eingabetext, 31, tiPosBlk) ;
tsTextR  := CONCAT (tsTextR, ' ') ;
Vielleicht kommen wir so der Sache näher?
 
Bitte in TIA beim Mid die Parameter P und L tauschen : P:=tiPosBlk und L:=31.
Bei TIA steht in der Beschreibung, dass der StringInhalt bis zum Ende übernommen wird, wenn bei L zuviele Zeichen parametriert sind.
Genau davon war ich auch ausgegangen, als ich für L den konstanten Wert 31 ausgeguckt hatte. Die CodeSys-Beschreibug die ich habe, schweigt sich zu diesem Thema leider aus ...

Sehr "zuvorkommend" von Dir! Du hattest den Fehler schon gefunden, während ich noch am Tippeln war!
 
Zuletzt bearbeitet:
Zurück
Oben