TIA Probleme mit String leeren in TIA

emilio20

Level-1
Beiträge
835
Reaktionspunkte
20
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
ich habe folgende Problem. Habe ein Step 7 Projekt nach Tia V13 Migriert.
Ich verwende einen Baustein in dem ich einen String Array leer macht.

Code:
FOR #i2 := 1 TO 6 BY 1 DO
        #ZAHL_FOLGE[#i2]:='';
        
    END_FOR;

In Step 7 habe ich mit diesem Code keinen Fehler erhalten. In Tia bekomme ich den Fehler DB256 nicht geladen.


setze ich in den String '' eine Zahl z.b so

Code:
FOR #i2 := 1 TO 6 BY 1 DO
        #ZAHL_FOLGE[#i2]:='0';
        
    END_FOR;

ist der Fehler weg. Muss ich den Array String in TIA anders leeren ?
 
Probleme mit String leeren in TIA
[...]
Code:
        #ZAHL_FOLGE[#i2]:='';

In Step 7 habe ich mit diesem Code keinen Fehler erhalten. In Tia bekomme ich den Fehler DB256 nicht geladen.
[...]
Muss ich den Array String in TIA anders leeren ?
Habe den Fehler gefunden. Es muss ein leerzeichen zwischen den ' ' .
Das ist aber nicht das was Du wolltest. Damit erzeugst Du keinen leeren String sondern einen String, der ein Leerzeichen enthält.


ich mache es immer mit

CHAR_VARIABLE := b#16#0;
Das ergibt ebenfalls keinen leeren String.


Wann genau hat TIA wegen dem nicht geladenen DB256 gemeckert?
Und nur dadurch, daß Du das Leerzeichen zwischen die Anführungsstriche schreibst, verschwindet die TIA-Fehlermeldung?
Und wenn Du dann das Leerzeichen wieder weglöschst dann meckert TIA wieder?
Eigentlich unglaublich.

Wenn TIA nicht mehr meckert, dann heißt das noch lange nicht, daß der Programmcode richtig ist.

Harald
 
Hi all

also wenn #zahl_folge ein string ist, dann kann man diesem mit #zahl_folge := '' leeren, d.h. auf Länge 0 bringen. Zwischen den einfachen Anführungszeichen ist kein Leerzeichen. '' ist der leere String.

#zahl_folge[#i] ist der Zugriff auf das i-te Zeichen des Strings. In das i-te Zeichen kann man aber nicht nichts hinein schreiben sondern nur ein Zeichen, und sei es ein Leerzeichen oder $00 -- wie es die C Programmierer machen.

Was einen ärgern und verrückt machen kann ist, dass es keinen Unterschied zwischen einem einzelnen Zeichen und einem String der Länge 1 gibt. 'x' ist beides. '' ist ein String und 'xx' auch.

Was wir jetzt nicht wissen ist, ob emilo20 einen String der Länge 6 mit 6 Leerzeichen braucht oder einen String der Deklarationslänge 6 mit keinem Zeichen also der tatsächlichen Länge 0.

'n schön' Tach auch
HB


PS: all we hear is Radio GaGa
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wann genau hat TIA wegen dem nicht geladenen DB256 gemeckert?
Und nur dadurch, daß Du das Leerzeichen zwischen die Anführungsstriche schreibst, verschwindet die TIA-Fehlermeldung?
Und wenn Du dann das Leerzeichen wieder weglöschst dann meckert TIA wieder?
Eigentlich unglaublich.

Wenn TIA nicht mehr meckert, dann heißt das noch lange nicht, daß der Programmcode richtig ist.

Harald

Sobaldl ich kein Leerzeichen verwende '' erhalte ich die Fehler "DB256 nicht geladen.". Verwende ich ein Leerzeichen ' ' ist der fehler weg.



Was wir jetzt nicht wissen ist, ob emilo20 einen String der Länge 6 mit 6 Leerzeichen braucht oder einen String der Deklarationslänge 6 mit keinem Zeichen also der tatsächlichen Länge 0.

Die Funktion ist für ein Codeschloss mit der ich über eine Matrix Tastatur die eingegeben Zahlenfolge zu einem String zusammen baue und diesen mit dem CODE vergleiche. Nach der Eingabe muss der Eingegeben Code gelöscht werden. hierzu möchte ich den String leeren.
Für mein Programm reicht es aus ihn mit Leerzeichen zu füllen.


Ich Poste mal den Code hierzu

Code:
    #text:=' ';
  //Zuweißung TASTEN  
    #ZUWEISSUNG_TASTEN[1] :='1';
    #ZUWEISSUNG_TASTEN[2] :='2';
    #ZUWEISSUNG_TASTEN[3] :='3';
    #ZUWEISSUNG_TASTEN[4] :='4';
    #ZUWEISSUNG_TASTEN[5] :='5';
    #ZUWEISSUNG_TASTEN[6] :='6';
    #ZUWEISSUNG_TASTEN[7] :='7';
    #ZUWEISSUNG_TASTEN[8] :='8';
    #ZUWEISSUNG_TASTEN[9] :='9';
    #ZUWEISSUNG_TASTEN[10]:='0';
     
        
    
 /// Schieberegister. Bei Flanke EINGABE_FLANKE Zahl schieben
  IF #EINGABE_FLANKE = TRUE THEN
                
        FOR #i := 1 TO 6 BY 1 DO
        #ZAHL_FOLGE[#i] :=#ZAHL_FOLGE[#i+1];
        END_FOR;
        
        #ZAHL_FOLGE[6] := #ZUWEISSUNG_TASTEN[#ZAHL];
      
    
  ///CODE_Zusammensetzen aus einselnen Zeichen zu einer Zeichenkette    
       END_IF;
        #ZAHL_FOLGE1:=#ZAHL_FOLGE;    
        
          #text:= CONCAT( IN1 :=#ZAHL_FOLGE1[1],
                         IN2 :=#ZAHL_FOLGE1[2]);
                         
          #text:= CONCAT( IN1 := #text,
                         IN2 := #ZAHL_FOLGE1[3]);
                         
          #text:= CONCAT( IN1 := #text,
                         IN2 := #ZAHL_FOLGE1[4]);
                         
          #text:= CONCAT( IN1 := #text,
                         IN2 := #ZAHL_FOLGE1[5]);
                         
          #text:= CONCAT( IN1 := #text,
                         IN2 := #ZAHL_FOLGE1[6]);
      
       #CODE_EINGABE:=#text;                         
                                  
            
  ///CODE RESET
  IF #RESET_FLANKE = true THEN 
      
    FOR #i2 := 1 TO 6 BY 1 DO
        #ZAHL_FOLGE[#i2]:=' ';
        
    END_FOR;
  END_IF;
 
Zuletzt bearbeitet:
Hallo,
es sieht für mich ein bißchen nach einer Deklarations-Geschichte aus.
Das eine Mal heißt die Variable "Zahl_Folge" und das andere Mal "Zahl_Folge1".
Es kann natürlich tatsächlich so sein, dass es beide Variablen (korrekt deklariert) gibt ... Schön wäre es m.E. also zu wissen, was an Variablen deklariert ist und wie (bzw. als was) ...

Gruß
Larry
 
Die Funktion ist für ein Codeschloss [...]
Ich Poste mal den Code hierzu
Die wichtigste Angabe fehlt: wie ist ZAHL_FOLGE deklariert?

Anhand Deines Codes kommt man aber drauf, daß ZAHL_FOLGE ein STRING sein muß und kein Array of STRING.
Ich glaube, Du solltest Dir die Erklärungen zu STRING, CHAR und Array nochmal genauer ansehen.

Auch Deine falsch benutzten Fachausdrücke sind verwirrend. (String Array, String leeren, String Array leer machen, Zusammensetzen aus einzelnen Zeichen zu einer Zeichenkette)

Zum Löschen eines Strings ist es nicht nötig, ihn komplett mit Leerzeichen zu füllen. Es reicht, die aktuelle Stringlänge auf 0 zu setzen, indem man ihm einen Leerstring (String mit der Länge 0) zuweist:
Code:
ZAHL_FOLGE := '' ;


Habe ein Step 7 Projekt nach Tia V13 Migriert.
Ich verwende einen Baustein in dem ich einen String Array leer macht.

Code:
FOR #i2 := 1 TO 6 BY 1 DO
        #ZAHL_FOLGE[#i2]:='';
        
    END_FOR;

In Step 7 habe ich mit diesem Code keinen Fehler erhalten. In Tia bekomme ich den Fehler DB256 nicht geladen.
Da mußt Du irgendwas nachträglich geändert haben... Auch in Step7-classic-SCL würde das eine Fehlermeldung ergeben.
(damit der Code keinen Fehler ergibt, müßte ZAHL_FOLGE als "Array [1..6] of STRING" deklariert sein)

Der Fehlertext von TIA ist in der Tat sinnfrei, da muß Siemens noch nacharbeiten. Vielleicht ist in der Entwicklungsabteilung auch noch niemand auf die Idee gekommen, einem CHAR ein Nichts zuzuweisen?


Tip: Wenn Du sowieso nur Ziffern zur Codeeingabe nutzt, dann könntest Du statt Deinem verwirrend umständlichen und komplizierten Weg über Zeichen und Strings eine numerische Eingabe machen, da braucht man nur einfache Mathematik, etwa so:
Code:
VAR
  diEingabe : DINT ;
  iZAHL : INT ;
END_VAR

//eingegebene Ziffer anhängen
  IF #EINGABE_FLANKE THEN
    #diEingabe := ((#diEingabe * 10) + #iZAHL ) MOD 1000000 ;
  END_IF;

//Eingabe löschen
  IF #RESET THEN
    #diEingabe := 0 ;
  END_IF;

//Code richtig?
  IF #diEingabe = 123456 THEN
    ; // ...
  END_IF;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ich habe einen String verwendet da ich die Funktionen evtl für eine Matrix Tastatur mit zahlen und Zeichen verwenden wollte.
Was machst du wenn du als code (0304) verwenden willst ?
Wenn ich es mit DINT mache kann ich bei der Code Eingabe dann auch 304 eingeben um die Türe zu Öffnen.
Beim String muss ich 0304 eingeben damit die Türe Öffnet
 
Zuletzt bearbeitet:
... vielleicht bist du ja doch mal so nett und schreibst uns (vielleicht als Screenshot o.ä.) wie bei dir welche Variablen deklariert sind.

Ansonsten :
Wenn ich eine Code-Eingabe erstellen wollte dann sähe das bei mir komplett anders aus.
Diese Code-Eingabe würde dann auf Basis der (Matrix-)Eingänge den Code-String immer um das entsprechende Zeichen erweitern. Also etwas so :
Code:
If Eingabe_1 then ZahlenFolge := Concat (ZahlenFolge , "1") ; end_if ;
If Eingabe_2 then ZahlenFolge := Concat (ZahlenFolge , "2") ; end_if ;
If Eingabe_3 then ZahlenFolge := Concat (ZahlenFolge , "3") ; end_if ;
... usw.
Gruß
Larry

Nachsatz:
Da ich gerade kein Step7 zur Hand habe ist der Befehl Concat nicht komplett syntax-richtig verwendet worden ...
 
Input
ZAHL Int
EINGABE_FLANKE Bool
RESET_FLANKE Bool

Output
CODE_EINGABE String[254]

InOut
ZAHL_FOLGE Array[1..6] of String[1]

Temp
i Int
i2 Int
text String[6]
ZAHL_FOLGE1 Array[1..6] of String[1]
ZUWEISSUNG_TASTEN Array[1..10] of String[1]
Constant
Return
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi emilio

jetzt kommt man der Sache schon näher.
Du hast gar keine Strings, sondern CharArrays. Das ist nicht nur bei der Simatic was anderes.
Also wenn du deine Felder "putzen" willst, dann musst du da was reinschreiben.
Code:
For i := 1 to 6 do ZAHL_FOLGE[ #i ] := ' '; end_for

Dass ich jetzt putzen geschrieben habe ist volle Absicht, denn leer im Sinne eines Strings kein ein Array nie sein. Das hat immer 6 Zeichen, es mögen 6 Leerzeichen drin sein, aber es ist immer 6 Zeichen lang und damit nie leer.

Es ist auch ziemlich sinnlos mit CONCAT auf einem CharArray herum zu wursteln. Wenn du da was reinschreiben willst, dann mach das bitte Zeichen für Zeichen. CONCAT kombiniert zwei Strings zu einem Dritten. Das mit CharArrays zu traktieren führt zu fürchterlich vielen impliziten Konvertierungen und selten zu dem was du denkst.

Beispiel: sei deine Variable ZAHL_FOLGE mit 6 Leerzeichen gefüllt, dann würde ein CONCAT( ZAHL_FOLGE, 'x' ) zu einem String der Länge 7 führen. 6 Leerzeichen und ein x. Der bei Zuweisung zu ZAHL_FOLGE1 aber da nicht rein passt, womit du darin wieder nur 6 Leerzeichen findest. Das ist kein Fehler, sondern einfach dem Umstand geschuldet, dass 7 Zeichen da nicht rein passen.

Ein String[10] ist kein Array[1..10] of char. Auch wenn dir str[5] das fünfte Zeichen im String liefert.
Ein String kann leer sein, dann liefert LEN(str) eine 0, und alle str liefern $00.
In einen leeren String kann man bei 1200 und 1500 mit
Code:
str[1]:='j'; str[2]:='a';
Zeichen für Zeichen einfüllen. Bei jedem Zeichen wird der String um ein Zeichen länger.
Das geht sogar deutlich schneller als CONCAT.

'n schön' Tach auch
HB
 
Sorry habe versehentlich einen alten Code gepostet. Habe es abgeändert. Es wahren alles Strings.

Aber egal das Problem wurde ja behoben. Ich denke nicht das wir weiter auf den Code rumreiten müssen.

Wichtig ist das es Funktioniert. Wenn jemand eine elegantere lösung hat kann er sie mir gerne schreiben. Bin für jede hilfe dankbar.
 
Zuletzt bearbeitet:
Sorry habe versehentlich einen alten Code gepostet. Habe es abgeändert. Es wahren alles Strings.

Aber egal das Problem wurde ja behoben. Ich denke nicht das wir weiter auf den Code rumreiten müssen.

Wichtig ist das es Funktioniert.
Kannst Du denn erklären wie es funktioniert? (sprich: bist Du sicher, daß es immer richtig funktionieren wird?)

Und warum ist jetzt in Beitrag #11 ZAHL_FOLGE doch kein String sondern ein Array of String??!

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Der Baustein ist ein Fc. Somit verwende ich den (InOut) Zahl_Folge als Speicher. Verwendet wird das ganze für eine Zutrittskontrolle. Der Code der die Türe Öffnen soll kann mann im HMI einheben mit der Voraussetzung das die erste Zahl auch eine 0 sein kann.
Wird jetzt eine Taste am Codeschloss gedruckt wird die hinterlegte Zahl in einen Schieberegister verschoben (Zahl_Folge). Dies wird anschließend zu einem String zusammengesetzt.
In einem weiteren Programm wir der Eingegebene String mit dem Vorhandenen String verglichen .
 
Hallo
ich habe heute das gesamte Projekt mal über TIA in die CPU übertragen, Dabei musste ich feststellen das die Haustüre nicht auf geht. Da ich ja in meinem Programm die Zahl_Folge mit einem leerzeichen leeren mussste. Nun muss ich auch in dem vorgegebenen Code ' 1234' eingeben damit der Eingabe Code mit dem gespeichertem Code übereinstimmt. Somit stehe ich wieder vor dem Problem die Value ZAHL_FOLGE zu leeren. ??


Habs erst mal so gelöst das ich einen Temp leerString[1] angelegt habe und diesen ersetze

FOR #i2 := 1 TO 6 BY 1 DO
#ZAHL_FOLGE[#i2]:=#leerString;

END_FOR;
 
Zuletzt bearbeitet:
Auch wenn es schon ne weile her ist, habe heute mit tia v13 sp1 das gleiche Problem.... Wäre fast abgedreht heute...

Zum Beispiel

"dbtest".text := ''; funktioniert nicht in einer Funktion

Dbtest normaler db und Text ein string[80]

Bei jeder Zuweisung geht die CPU in sf und im String bleibt der alte wert drin

Selbst mit sfc21 konnte ich das nicht löschen...

Habe das dann auch mit nem Leerzeichen gelöst, aber nicht im Sinne des Erfinders

CPU ist ne alte 313c... Keine Ahnung ob das das Problem ist

Grüße
Christian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
das Problem (so es denn wirklich eines ist) ist, dass bei myString := '' ; nicht der komplette Stringspeicher selbst gelöscht wird (wozu auch) sondern nur das Byte im Header auf 0 gesetzt wird, das angibt, wieviele Zeichen des Strings tatsächlich verwendet werden.

Gruß
Larry
 
Lt. Diagnosepuffer wird versucht den ganzen String zu plätten was anscheinend aber nicht funktioniert... Jedenfalls stehen Fehler drin beim Schreibzugriff auf die Bereiche

Gesendet von meinem ONE A2003 mit Tapatalk
 
Muss mir das mal in awl angucken... Denke da passt ein pointer nicht... ist ein Compiler bug... Hatte da heute keine Zeit für

Gesendet von meinem ONE A2003 mit Tapatalk
 
Zurück
Oben