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

Ergebnis 1 bis 8 von 8

Thema: DINT nach CHAR wandeln mit führenden Nullen

  1. #1
    Registriert seit
    14.07.2005
    Beiträge
    298
    Danke
    27
    Erhielt 18 Danke für 15 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich komme gerade nicht weiter. Vielleicht denke ich auch zu kompliziert. - Hoffe ihr könnt mir helfen:

    Ich habe in meiner Steuerung (S7-1200) eine 1 BIS 7 stellige Nummer als DINT. Diese Nummer muss ich zu einem späteren Zeitpunkt als CHAR weiter verarbeiten.

    Ich würde hierzu das DINT zuerst in einen STRING wandeln und dann nach CHAR:
    DINT: 123 - STRING 'xxxx123' - Array of CHAR 'x' 'x' 'x' 'x' '1' '2' '3' (Das x steht in meinem Beispiel für ein Leerzeichen)

    Der Haken ist aber das ich in meinem Array führende Nullen brauche --> Array of CHAR '0' '0' '0' '0' '1' '2' '3'


    Da ich die S7-1200 mit TIA V11 Basic einsetze kommen AWL und SCL nicht in Frage. Was also tun?

    Alle sieben Stellen des Arrays nacheinander (in einer Schrittkette) auf ein Leerzeichen zu vergleichen und gegebenenfalls durch eine Null ersetzen
    wäre eine Möglichkeit. - Das ist in meinen Augen zwar einfach aber auch recht schludrig weil nicht einfach/sinnvoll erweiterbar.

    Dann hab ich mir überlegt ich könnte ja mit FIND nach dem Leerzeichen suchen, das Problem hierbei ist aber das FIND den String von Links nach Rechts
    durchsucht und somit so lange gesucht werden muss bis eben kein Leerzeichen gefunden wird. - Keine Ahnung wie ich das in KUP/FUP erledigen soll...

    Kann doch nicht sein das das jetzt so ein Problem darstellen soll. - Oder steh ich im Moment einfach nur auf dem Schlauch und seh die Lösung einfach nur nicht.

    Ich hoffe ihr versteht mein Problem und könnt mir weiter helfen.

    Gruß smartie
    Zitieren Zitieren DINT nach CHAR wandeln mit führenden Nullen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Hallo,
    erstmal vorab : die 1200 ist nicht meine Welt.
    Dennoch sollte es die gängigen Hilfsbausteine für deinen Fall geben.
    Ich würde so vorgehen :
    Erstmal (wie du selber schreibst) die Zahl in einen String wandeln. Dieser String hat dann aber nach Siemens-Manier vorne entweder das Vorzeichen (wenn die Zahl negativ ist) oder ein Leerzeichen (wenn die Zahl positiv ist) drin stehen. Diese Stelle müßtest du also schonmal behandeln (wenn du nur positive Zahlen erwartest dann da ggf. eine "0" reinschreiben).
    Nun baust du dir einen Hilfsstring mit 7 Nullen drin. Diesen und den umgewandelten verbindest du mit Concat zu einem neuen Hilfsstring. Von dem schneidest du dann mit Right die letzten 7 Stellen ab.

    Das geht natürlich, wie du schon selber geschrieben hast, mit SCL am Besten ...

    Gruß
    Larry

  3. #3
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.480
    Danke
    1.141
    Erhielt 1.241 Danke für 973 Beiträge

    Standard

    Ich kenn den 1200-Befehlsvorrat nicht und weiß nicht ob folgender Vorschlag geht:
    Wenn es der Wertebereich zulässt, dann die DINT nach BCD wandeln.
    Dann in einerSchleife
    jede einzelne Stelle (4Bit) rausschieben
    dann zu jeden Stelle 30hex addieren (Wandlung nach Char)
    dann in die passende Stelle ins Array schreiben

    Wenn du kein AWL oder SCL hast, dann ist eine Schrittkette nicht mal das Schlechteste dafür.

    Gruß
    Dieter

  4. #4
    smartie ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.07.2005
    Beiträge
    298
    Danke
    27
    Erhielt 18 Danke für 15 Beiträge

    Standard

    Also im wesentlichen ist der Befehlssatz der S7-1200 identisch mit der S7-300 und bis jetzt hatte ich auch kaum Probleme damit. (Auch wenn es OT ist will ich mich an dieser Stelle
    mal für die S7-1200 aussprechen. Unglaublich was man mit der alles anstellen kann. - Hat bei uns inzwischen die S7-300 in fast jeder Anwendung ersetzt...)

    Soviel dazu.

    Mein Ansatz war auch so, wie Larry das beschrieben hat. Zumal ich das bei einer S7-300 so schon gemacht habe. Bis auf den Unterschied das ich meinen Referenz-String
    nicht mit CONCAT sondern mit REPLACE manipuliert habe.

    Problem ist in meinem konkreten Fall die Umwandlung des DINT nach STRING. - Soweit ich das in Erinnerung habe und ich Larrys Beitrag verstehe wird bei der Funktion (der
    S7-300) DI_STRING die tatsächliche Länge des Ausgabestring automatisch angepasst.

    Bei der S7-1200 gibt es die Funktion VAL_STRING hier kann ein (nahezu beliebiger) Wert in einen String gewandelt werden. Aber die Länge des String ist hier fest und wird durch
    die Funktion nicht angepasst.

    Das bedeutet wenn ich eine 3 stellige Zahl habe, bekomme ich nach der Umwandlung einen String mit 7 Zeichen (weil das die maximale Länge ist, die ich eingestellt habe).
    Der String enthält dann 4 führende Leerzeichen und die 3 stellige Zahl.
    - Das Vorzeichen habe ich nicht, da ich als Ausgangswert jetzt den Datentyp UDInt verwendet habe (Unsinged Double Integer).

    Wie bekomme ich aus dem String jetzt den Zahlenwert?

  5. #5
    smartie ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.07.2005
    Beiträge
    298
    Danke
    27
    Erhielt 18 Danke für 15 Beiträge

    Standard

    Sooo,

    ich habs dann jetzt. Eher durch Zufall bin ich jetzt im Handbuch über die Funktion S_CONV gestossen. Diese trägt den leider etwas irreführenden Namen
    'Zeichenkette konvertieren'. Ich bin dabei immer davon ausgegangen das ich damit eine Zeichenkette in ein beliebiges Format konvertierern kann.

    - Das geht in der Tat auch. Allerdings kann man damit auch GANZ EINFACH einen nahezu beliebigen Wert in eine Zeichenkette wandeln.

    Ich habe jetzt also mein UDINT am Eingang angegeben. Am Ausgang bekomme ich dann meinen String, bei dem wie bei der S7-300 die tatsächliche
    Länge des Strings durch die Funktion (abhängig von der Anzahl der zu wandelnden Stellen) angepasst wird.
    Da ich ein UDInt verwendet habe brauche ich mir wegen dem Vorzeichen keinen Kopf machen.

    Im weiteren Ablauf werde ich jetzt den neuen String mit der Funktion REPLACE in einen mit sieben Nullen vorbesetzten String einsetzen. Die Position
    für das einsetzen berechne ich mir vorher mit der tatsächlichen Länge des konvertierten Strings.

    Vielen Dank für eure Unterstützung und ein schönes Wochenende noch

    smartie

  6. #6
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Da hätte ich mir ja eine eigene Funktion zur String-Konvertierung geschrieben, siehe Anhang.
    Da man bei der 1200 auch in FUP auf ein Array mit Index zugreifen kann, ist eine halbwegs ordentliche
    Schleifenbearbeitung möglich. Fummelig bleibt es im Vergleich zu SCL aber trotzdem.
    Angehängte Dateien Angehängte Dateien

  7. Folgende 2 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    MaddinSolar (23.12.2016),smartie (25.02.2013)

  8. #7
    smartie ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.07.2005
    Beiträge
    298
    Danke
    27
    Erhielt 18 Danke für 15 Beiträge

    Standard

    So, nachdem ich mich letzte Woche mit einem völlig anderen Projekt herumschlagen durfte bin ich jetzt wieder an dem oben erwähnten
    Thema dran und will kurz eine Rückmeldung geben:

    Leider funktioniert der in meinem letzten Beitrag (Post #5) beschriebene Lösungsweg doch nicht. Auch bei der Funktion 'S_CONV' wird
    die tatsächliche Länge des Strings auf den Wert der maximalen Länge gesetzt und der gewandelte Zahlenwert wird rechtsbündig in den
    String eingefügt. Die nicht belegten Zeichen werden dabei mit Leerzeichen besetzt.

    - Ziemlich schade eigentlich

    Ich habe jetzt den Vorschlag von Thomas_V2.1 umgesetzt und der funktioniert wirklich sehr gut. - Was wohl zu erwarten war.

    Auch wenn ich versuche, wo immer es möglich ist, mit den Standardbausteinen zu arbeiten werde ich diese Lösung (die zudem
    noch übersichtlicher als mehrere einzelne Funktionen ist) einsetzen.

    Vielen Dank

    smartie
    Geändert von smartie (25.02.2013 um 14:16 Uhr)

  9. #8
    Registriert seit
    25.11.2008
    Ort
    Westpfalz
    Beiträge
    1.550
    Danke
    187
    Erhielt 212 Danke für 186 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,

    Problem ist ja gelöst, dennoch:
    dazu hatte ich einen Support-Request gestartet:

    SR= 1-xxxxxxxxxx S7-1200 SCL-Programmierung Stringoperation

    (Programmierung S7-1200 bei der Funktion S_CONV mit IN=DINT und OUT=STRING werden im Ausgabestring die Zahlenzeichen entgegen des Systemhandbuchs bzw. OnlineHilfefunktion
    rechts angeordnet und links mit Leerzeichen aufgefüllt( normal wäre ab dem dritten Byte), die Rückkonvertierung mit FC37 STRG_to_DINT in Step7 classic z.B. nicht möglich)


    Mich haben die Leerzeichen extrem gestört, weil der Kommunikationspartner die nicht interpretieren konnte und es totaler Müll überhaupt ist!
    Habe mir dann auch eine Hilfsfunktion
    gebaut, die nach der Wandlung in den String (S_CONV) das erste Zeichen gesucht (FIND) und die Leerzeichen mit DELETE ausgeschnitten und am Ausgang ausgegeben hat. Hoffe beim nächsten Update ist der Bug behoben. Solange kann Helmut ihn auf seine TIA-Blacklist setzen

    MfG MK
    and we all support the team (S.King - Die Arena)

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 24.06.2012, 09:52
  2. CHAR in STRING wandeln
    Von morpheuss im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 17.08.2011, 13:29
  3. Ziffer in DINT nullen
    Von plc_typ im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 09.09.2010, 17:59
  4. Dint Variable in Char zerlegen
    Von Phil im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 30.11.2007, 08:26
  5. Wandeln von DINT nach INT
    Von Anonymous im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 12.01.2006, 11:20

Lesezeichen

Berechtigungen

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