Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: Probleme mit String leeren in TIA

  1. #11
    Registriert seit
    10.08.2010
    Beiträge
    739
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    Geändert von emilio20 (15.12.2014 um 23:29 Uhr)

  2. #12
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 159 Danke für 88 Beiträge

    Standard

    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[i] 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

  3. #13
    Registriert seit
    10.08.2010
    Beiträge
    739
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    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.
    Geändert von emilio20 (15.12.2014 um 23:35 Uhr)

  4. #14
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    10.086
    Danke
    838
    Erhielt 2.971 Danke für 2.395 Beiträge

    Standard

    Zitat Zitat von emilio20 Beitrag anzeigen
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #15
    Registriert seit
    10.08.2010
    Beiträge
    739
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    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 .

  6. #16
    Registriert seit
    10.08.2010
    Beiträge
    739
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    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;
    Geändert von emilio20 (17.12.2014 um 18:24 Uhr)

  7. #17
    Registriert seit
    09.08.2004
    Ort
    Münsterland
    Beiträge
    216
    Danke
    19
    Erhielt 10 Danke für 8 Beiträge

    Standard

    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

  8. #18
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.409
    Danke
    392
    Erhielt 2.342 Danke für 1.949 Beiträge

    Standard

    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

  9. #19
    Registriert seit
    09.08.2004
    Ort
    Münsterland
    Beiträge
    216
    Danke
    19
    Erhielt 10 Danke für 8 Beiträge

    Standard

    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

  10. #20
    Registriert seit
    09.08.2004
    Ort
    Münsterland
    Beiträge
    216
    Danke
    19
    Erhielt 10 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Ähnliche Themen

  1. Mit C-Skript leeren String von S7 abfragen
    Von SchnitzelMatzi im Forum HMI
    Antworten: 2
    Letzter Beitrag: 07.10.2014, 07:04
  2. Probleme mit dem Auslesen von String-Arrays
    Von FelMa im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 10.03.2014, 15:32
  3. Probleme mit TIA Portal V11
    Von Lalelu im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 26.03.2013, 09:45
  4. Antworten: 10
    Letzter Beitrag: 09.04.2011, 20:40

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •