Sonstiges Stringeingabe bei OP7, Stringlänge wird nicht angepasst

Lutz63

Level-2
Beiträge
27
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich möchte in einer Anlage mit OP7 und 315 einen String Ein/Ausgeben.

Soweit klappt ja alles, ich habe den String symbolisch einem E/A-Feld zugeordnet und kann dort auch eingeben,
der Wert wird auch in die SPS übernommen.

Da ich mit dem Sting aber in der SPS z.B. mit FC10 "Find" weiterabrbeiten muss und dieser unterschiedlich lang sein kann
habe ich ein Problem:

Wie kann ich auf dem OP7 Zeichen so löschen, dass das Headerbyte 2 auch die richtige länge anzeigt ?

Ich habe eine max. Länge von 10 und gleich was ich mache auch eine akt. Länge von 10.
Gelöschte Zeichen werden in der SPS als Leerzeichen " " dargestellt, muss 10 die Stringlänge auch übers Panel per int eingeben ?
 
Ich würde mir an deiner Stelle eine Routine erstellen, die deinen eingegebenen String von rechts nach links (oder von hinten nach vorne) nach der Position des ersten nicht-Leerzeichens durchsucht. Damit hättest du dann die effektiv genutzte Länge.

Gruß
Larry
 
Möglicherweise gäbe es da bei OSCAT etwas, dass du gebrauchen könntest. Das könnte dann RTrim oder ähnlich heißen.
Es sollte aber eigentlich auch kein Problem sein, das als Funktion selber zu erstellen und dann einfach 24 mal zu verwenden (würde ich jetzt so machen).

Ist für dich SCL ein Thema ?

Gruß
Larry
 
SCL ist nicht so meine Spezialstecke, lieber AWL !

Ich versuche gerade was zu basteln, tu mich aber noch etwas schwer.
Mir schwebt folgendes vor:

Strings stehen in Globalem DB !

FC mit Eingangsparameter an dem ich den String anlege.
Der FC sollte dann die Bytes vom 1. Zeichen an prüfen und zählen, bis ein Byte 16#00 (kein Zeichen) hat
und den Wert gleich in Byte 2 (aktuelle Länge) eintragen.

:confused::confused::confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie kann ich auf dem OP7 Zeichen so löschen, dass das Headerbyte 2 auch die richtige länge anzeigt ?
Ich meine, wenn das ProTool-Projekt im Step7-Projekt integriert ist und die String-Variable in ProTool "mit Symbol" angebunden ist, dann wird das Headerbyte 2 vom OP7 korrekt verarbeitet und auch geschrieben.

Gelöschte Zeichen werden in der SPS als Leerzeichen " " dargestellt, muss 10 die Stringlänge auch übers Panel per int eingeben ?
Kommt das Auffüllen der Strings mit Leerzeichen auf immer 10 Zeichen vielleicht aus der symbolischen Liste? Sind Deine Einträge da vielleicht alle immer 10 Zeichen lang?

Alternativ: die 24 Strings sind doch bestimmt konstant? Statt die 24 Strings könntest Du auch den Index der symbolischen Auswahl als INT an die SPS anbinden.

Harald
 
Ich habe die Stringvariable Symolisch angebunden und mir ist auch klar, dass ein Leerzeichen ein Zeichen ist !

Kein Zeichen wäre Hex 00 und dass ist auf dem OP7 der kurze Bindestrich, hab ich per Varablentabelle getestet.
Das 2. Byte wird aber vom OP7 nicht verändert ! :sad:

Es sind konstante Strings, das SPS-Programm läuft schon.

Es gibt einen Scanncode, sowie 12 Blöcke (Typen) aus jeweils 2 Strings (Produnktnummer und Kundennummer)

Erst wird geschaut was gerade gebaut wird (Produktnummer) dann wird geschaut, ob sich die dazugehörige Kundennummer
auf den Scanncode befindet (mit FC11 "Find")

Jetzt ist das Ziel über das OP7 Typen zu ändern.
Das OP7 ändert aber die aktuelle Länge nicht und das ist ein Problem für FC11 !!!
 
So, hab mal was gebastelt was im Test auch funktioniert hat.
Der FC zählt die Zeichen beginnend mit dem ersten die ungleich B#16#00 sind,
wenn das auftaucht ist der aktuelle String zu Ende !

Kann man das so machen ?


Code:
 String_in ist InOut vom Typ Any
 Die anderen Temp vom Typ Word oder DWord


      L     P##String_In
      LAR1  
      L     W [AR1,P#2.0]               // Anzahl Bytes incl Header
      L     2
      -I    
      T     #Laenge_String              // Stringlänge maximal
      L     W [AR1,P#4.0]
      T     #DB_String                  // DB-Nummer String
      L     D [AR1,P#6.0]
      T     #Pointer_Anf_String         // Adresse 1. Byte (Header)
      AUF   DB [#DB_String]
      L     0
      T     #Anzahl
      L     #Pointer_Anf_String
      L     L#2
weit: SLD   3
      +D    
      T     #Pointer_dyn                // Zeiger 1. Zeichen des String
      L     DBB [#Pointer_dyn]
      L     0
      ==I   
      SPB   end                         // --> Byte ohne Zeichen gefunden
      L     #Anzahl
      L     #Laenge_String
      >=I   
      SPB   end                         // --> max. Länge erreicht
      L     #Anzahl
      L     1
      +I    
      T     #Anzahl
      L     #Pointer_dyn
      L     L#1
      SPA   weit                        // --> nächtes Byte prüfen
end:  L     #Laenge_String
      T     DBB [#Pointer_Anf_String]   // max. Stringlänge in Header schreiben
      L     #Pointer_Anf_String
      L     L#1
      SLD   3
      +D    
      T     #Pointer_dyn
      L     #Anzahl
      T     DBB [#Pointer_dyn]          // aktuelle Stringlänge in Header schreiben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn es im Test funktioniert ... dann wird es wohl in Ordnung sein (ich hätte es allerdings nicht in AWL programmiert).
Allerdings : hattest du nicht geschrieben, dass du am String hinten Leerzeichen, also Chr(32), mit dranhängen hast, die du nicht mit verwerten willst ?
In dem Fall (aber auch sonst) würde ich den String von hinten vorne durchsuchen nach dem ersten Zeichen, dessen ASCII-Wert größer 32 ist - das wäre dann ganz sicher deine Nutzdatenlänge ...

Gruß
Larry
 
Nein, habe keine Leerzeichen dran, aber die Variante von hinten nach vorn und dem Test auf>32 ist noch sicherer.
Werd es mal testen.

Danke und schöne Weihnachten !
 
Ich habe eine max. Länge von 10 und gleich was ich mache auch eine akt. Länge von 10.
Gelöschte Zeichen werden in der SPS als Leerzeichen " " dargestellt, muss 10 die Stringlänge auch übers Panel per int eingeben ?

Ich hatte mich darauf bezogen ... und so ein Leerzeichen ist halt ein Chr(32) ...
 
Zurück
Oben