TIA Anzeigen einer Variable im Format String auf einem KTP400 Basic

suya

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich habe folgendes Problem....

An meinem Teststand habe ich eine Kamera/Scanner verbaut, die mir einen Code von den gelesenen Produkten an meine SPS sendet.
Momentan versuche ich diesen Code auf meinem Panel anzuzeigen.
Das ist ja eigentlich kein Problem. Ich möchte aber noch, das vorherige Leseergebnisse auch angezeigt werden können.
Ungefähr So

Aktueller wert ??????????????????????????????
wert davor ??????????????????????????????
wert davor ??????????????????????????????
wert davor ??????????????????????????????

Datenformat String

Ich denke, dass ich das ganze mit einem Schieberegister machen könnte.
Leider weiß ich nicht wie ich das umsetzen soll.
Schonmal vielen Dank für eure Hilfe

Suya
 
Hallo, so wie ich es in der Regel löse:

Ich erstelle z.B. ein Array 0 bis 4 als String. Bei 0 schreibe ich zyklisch den aktuellen Lesestring hinein. Dann wertet man aus: Wenn Index 0 ungleich Index 1, dann schiebe Index 0-3 an Index 1-4. Somit wären die Felder in 1 bis 4 mit dem Panel verknüpft und werden immer angezeigt.
Falls der Code vorher auf Gültigkeit überprüft werden muss, dann muss er natürlich vor dem Eintragen in den Index 0 überprüft werden, ansonsten eben nicht eingetragen.

Interessant wäre nun in welcher Bausteinsprache Du es programmieren willst und ob Du weitere Hilfe benötigst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

hatte vor es in FUP zu programmieren.

Wenn es richtig verstanden habe, schiebe ich den aktuellen Wert der Stringvariable mit einem Move Befehl in den Index 0 von einem Array of String.
Das mit dem auswerten verstehe ich nicht ganz...
Und ja ich bräuchte noch Hilfe:D:confused:
 
Woran siehst Du daß ein neues Leseergebnis vorliegt? Gibt es da ein Melde-Bit? Notfalls mußt Du String[0] mit String[1] vergleichen (CMP <>)
Code:
                            +-----+                +------+
Flanke_neues_Leseergebnis --|  &  |--+-------------| MOVE |
                            +-----+  |  String[3]--|      |-String[4]
                                     |             +------+
                                     |             +------+
                                     +-------------| MOVE |
                                     |  String[2]--|      |-String[3]
                                     |             +------+
                                     |             +------+
                                     +-------------| MOVE |
                                     |  String[1]--|      |-String[2]
                                     |             +------+
                                     |             +------+
                                     +-------------| MOVE |
                                        String[0]--|      |-String[1]
                                                   +------+
Harald
 
Also ich habe ein bit, welches immer dann 1 ist wenn etwas gelesen wurde.
Ob es jetzt ein neue Leseergebnis ist, spielt in diesem Fall keine Rolle. Die Daten der Kamera werden nicht weiteverarbeitet, da es nur ein Teststand ist.
Ich möchte dass mir das aktuelle Leseergebnis als erstes angezeigt wird. Bei jeder neuen Lesung soll das letzte Ergebnis eins weiter geschoben werden.

Capture.jpg
Um diese Variable geht es.
Von der Kamera bekomme insgesamt 65 Bytes im Format Char. Diese 65 Bytes Move ich in einen Datenbaustein (Array of char). Mit dem Baustein "Char to string" wandle ich diesen in die oben genannte Variable. Kann sein dass das schon viel zu kompliziert gedacht ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Scannerergebnisse in Byte bzw. Char zu bekommen ist völlig normal. Deine Umwandlung ist korrekt.

PN/DP hat das ja schon in FUP "Ausprogrammiert". Wie nutzt du denn dein Ergebnis-da Bit?
"Wenn bit = 1 , dann char-to-string, bit=0"?
Falls das so ähnlich aussieht:
1. Im DB brauchst du nur das genannte Array
"Alte_Ergebnisse" - "Array [0..3] of String"
2. Anpassung:
"Wenn bit = 1 , dann char-to-string, PN/DP Code, Move: Datensatz->Alte_Ergebnisse[0], bit=0"?
3. Anzeige:
im Panel einfach Alte_Ergebnisse[0], Alte_Ergebnisse[1], Alte_Ergebnisse[2], ... anzeigen lassen

Hoffe das ist verständlich :)
 
Ahhh. Ich glaube ich hab es verstanden.:D
Ich probiere es mal. Mal schauen ob es funktioniert.
Vielen Dank euch.
 
Ob es jetzt ein neue Leseergebnis ist, spielt in diesem Fall keine Rolle.
...
Bei jeder neuen Lesung soll das letzte Ergebnis eins weiter geschoben werden.
Diesen Widerspruch verstehe ich nicht :confused:
Wenn Du nur bei einer neuen "Lesung" die vorausgegangenen Ergebnisse weiterschieben möchtest, spielt es doch eine grosse Rolle, feststellen zu können, wann der Zeitpunkt für das Verschieben gekommen ist!?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich meinte, dass es egal ist welchen Code ich geschickt bekommen. Es kann auch der selbe sein. d.h die gesendeten Codes werden nicht auf Richtigkeit oder auf Gleich-Ungleichheit getestet.
 
Ich bin erst heute dazu gekommen es zu testen. Was mir jetzt gerade auffällt ist, dass das ja wie eine Kettenreaktion ist....
Wenn er die Flanke_neues_Lesergebnis bekommt, verschiebt sich automatisch alles in den nächsten String.
oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja schon. Aber sobald irgendetwas gelesen wurde, werden alle Werte aus dem Array (alte leseergebnisse) mit dem aktuellen Leseergebnis beschrieben.
Ich hab es nach dem Plan von PN/DP gemacht.
Aber da ich ja Wert 0 aus dem Array mit dem aktuellen Leseergebnis beschreibe ist es ja logisch dass alle Werte jetzt das aktuelle Ergebnis haben.
 
Aber sobald irgendetwas gelesen wurde, werden alle Werte aus dem Array (alte leseergebnisse) mit dem aktuellen Leseergebnis beschrieben.
Ich hab es nach dem Plan von PN/DP gemacht.
Aber da ich ja Wert 0 aus dem Array mit dem aktuellen Leseergebnis beschreibe ist es ja logisch dass alle Werte jetzt das aktuelle Ergebnis haben.
Wenn Du Dich an Haralds gehalten Plan ...
Code:
                            +-----+                +------+
Flanke_neues_Leseergebnis --|  &  |--+-------------| MOVE |
                            +-----+  |  String[3]--|      |-String[4]
                                     |             +------+
                                     |             +------+
                                     +-------------| MOVE |
                                     |  String[2]--|      |-String[3]
                                     |             +------+
                                     |             +------+
                                     +-------------| MOVE |
                                     |  String[1]--|      |-String[2]
                                     |             +------+
                                     |             +------+
                                     +-------------| MOVE |
                                        String[0]--|      |-String[1]
                                                   +------+
... gehalten hättest, würdest Du in dieser ReihenFolge verschieben:
1. Array[3] ==> Array[4]
2. Array[2] ==> Array[3]
3. Array[1] ==> Array[2]
4. Array[0] ==> Array[1]
... und füge ich jetzt hier hinzu ...
5. neuerWert ==> Array[0]
und wenn Du diese Aktion nur dann ausführst, wenn Du sie ausführen willst (d.h. nicht in jedem Zyklus, sondern einmalig dann, wenn ein neuer Wert angeliefert wird), dann ... sollte es funktionieren.

 
Zuletzt bearbeitet:
sobald irgendetwas gelesen wurde, werden alle Werte aus dem Array (alte leseergebnisse) mit dem aktuellen Leseergebnis beschrieben.
Ich hab es nach dem Plan von PN/DP gemacht.
Aber da ich ja Wert 0 aus dem Array mit dem aktuellen Leseergebnis beschreibe ist es ja logisch dass alle Werte jetzt das aktuelle Ergebnis haben.
Du meinst nach dem Code zeigen alle 4 Strings den selben aktuellen Wert?

Nein, das ist nicht logisch und auch nicht so gewollt. Schau Dir mein Programmbeispiel noch einmal genau an.
Kann es sein, daß bei dir die Variable "Flanke_neues_Leseergebnis" länger als 1 Zyklus lang TRUE ist? Dann wird in mehreren Programmzyklen umgespeichert, bis nach 4 Zyklen alle Strings den Wert des String[0] haben. Die Variable darf nur 1 Zyklus lang TRUE sein!
Die Trigger-Variable heißt "Flanke_..." weil sie mit einer Flankenauswertung des "neuen Leseergebnis" gebildet werden soll, damit bei jedem neuen Leseergebnis nur genau einmal umgespeichert wird. Und das in der Reihenfolge, daß zunächst der vorletzte String[3] auf den letzten String[4] kopiert wird, dann der drittletzte String[2] auf den vorletzten String[3] ... zuletzt der aktuelle String[0] in den ersten Anzeige-String[1].

Harald
 
Ich denke ich habe da etwas übersehen....
Du hast 2 Dinge übersehen:
a) das Kopieren des neuen Wertes nach Array[0] muss als letztes (nicht zu Anfang) passieren.
b) Du gibst die FlankenAuswertung nur auf den EN-Eingang Deines ersten MOVE, während alle folgenden MOVEs mit der Kopie von 'Leseergebnis' versorgt werden.

PS:
Ich weiss, dass ich mich hier im Forum schon zum x-ten Male wiederhole, aber ich tue es immer wieder gerne ;):
Die speziellen Funktionen für eine FlankenErkennung wären besser nie erfunden worden, weil sie von "Frischlingen" regelmässig nicht bzw. falsch verstanden werden.
Nur wer erfolgreich eine FlankenErkennung selbst zu Fuss programmiert und das Prinzip verstanden hat, darf davon erfahren, dass es dafür spezielle Funktionen gibt! :ROFLMAO:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast 2 Dinge übersehen:

b) Du gibst die FlankenAuswertung nur auf den EN-Eingang Deines ersten MOVE, während alle folgenden MOVEs mit der Kopie von 'Leseergebnis' versorgt werden.

Jetzt bin ich verwirrt. War b) eine Feststellung was ich falsch gemacht habe oder eine Aussage wie es richtig geht:confused:;)
 
Okay. Das a) verstehe ich. Bloß b) nicht. Was genau meinst du mit Kopie von x?
Das ist ja das Schlimme an den Funktionen P-TRIG und N-TRIG.
Sie haben sozusagen zwei Ausgänge:
a) den "normalen" Ausgang (auch ImpulsMerker genannt), den Du leider nur auf Dein erstes MOVE leitest und auch auf alle folgenden MOVEs leiten solltest.
b) den "FlankenMerker", der bei Dir "Daten".Flanke_Neues_Leseergebnis heisst. Letzterer ist eine Kopie des Eingangs, die sich Funktion anlegt, um im nächsten Zyklus eine Flanke erkennen zu können.
 
Zuletzt bearbeitet:
Zurück
Oben