DINT nach CHAR wandeln mit führenden Nullen

smartie

Well-known member
Beiträge
298
Punkte Reaktionen
22
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
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
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
 

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
10.361
Punkte Reaktionen
3.012
Zuviel Werbung?
->Hier kostenlos registrieren
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
 
OP
S

smartie

Well-known member
Beiträge
298
Punkte Reaktionen
22
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?
 
OP
S

smartie

Well-known member
Beiträge
298
Punkte Reaktionen
22
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
 

Thomas_v2.1

Well-known member
Beiträge
8.796
Punkte Reaktionen
2.697
Zuviel Werbung?
->Hier kostenlos registrieren
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.
 

Anhänge

  • DintToStringFuehrendeNullen.pdf
    70,8 KB · Aufrufe: 272
OP
S

smartie

Well-known member
Beiträge
298
Punkte Reaktionen
22
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
 
Zuletzt bearbeitet:

Sinix

Well-known member
Beiträge
1.588
Punkte Reaktionen
216
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 :ROFLMAO:

MfG MK
 
Oben