Bosch unbekannten Variablentyp übergeben

xck-kg

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich würde gerne folgendes Problem an einer IndraMotion MTX 12V08 Steuerung lösen und komme hier nicht weiter.

Ich möchte im Falle eines Fehlers (z.B. Temperatur der Spindel zu hoch) eine Fehlermeldung an meinem HMI darstellen.
In dieser Fehlermeldung sollen nicht nur der String 'Temperatur der Spindel zu hoch' , sondern auch die dazugehörigen Messwerte durchgegeben werden.

Ich möchte nun einen kompletten String an das HMI weitergeben, indem über zwei Platzhalter (%d) die SOLL und IST Werte weitergegeben werden.

In TwinCat würde das ganze so aussehen:

SendMessageToHMI (sMsg:='Temperatur der Spindel zu hoch SOLL=%d IST=%d',
arg1:=F_BYTE(nTempSpinReq), arg2:=F_BYTE(nTempSpinState);

Hier ist das Problem auf das ich stoße. Ich muss ja gewährleisten das die beiden Messwerte (SOLL und IST) in einen String umgewandelt werden, bevor ich diese als Platzhalter übergebe.
In TwinCat ist dazu ein Funktionsblock dazwischengeschalten der jeglichen Datentyp in einen String umwandelt --> FB_FormatString. Es werden also die Messwerte nTempSpinReq und nTempSpinState mittelts F_BYTE() vom Typ T_Arg übergeben und dann im FB_FormatString umgewandelt.

Jetzt haben unterschiedliche Messwerte auch oft unterschiedliche Datentypen zum Übergeben (INT, BYTE, WORD, .... )
Gibt es auf der Bosch Steuerung auch eine Möglichkeit verschiedene Messwerte mit unbekanntem Typ erst zu übergeben, um Sie dann in einem nächsten Schritt mit einem ANY_TO_STRING o.ä. umzuwandeln?

(Wie gesagt funktioniert die übergabe der Datentypen unter TwinCat immer mit den Hilfsfunktionen F_BYTE, F_INT, F_WORD,... vom typ T_Arg. Nach der Übergabe werden die Messwerte dann mit dem FB_FormatString umgewandelt. So etwas in der Richtung suche ich auch für meine Bosch)


Ich hoffe es findet sich ein Bosch Experte unter euch ;)
 
Moin,
den Temperaturwert kannst du mittels INT_TO_STRING umwandeln
dann die beiden string Werte (Text& Temperatur) mittels CONCAT zu einem String zusammenfügen (drücke mal F1.. dort wird es auch noch mal erklärt)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, danke für die schnelle Antwort.

Das heisst am einfachsten ist es dann wenn ich die verschiedenen Datentypen in einen String umwandle und dann praktisch alle aneinander hänge?
So z.b.: ?


sMsg:= 'Temperatur der Spindel zu hoch'
arg1:=INT_TO_STRING(nTempSpinReq);
arg2:= BYTE_TO_STRING(nTempSpinState);




sOut := ' ';
sOut := CONCAT(sOut, sMsg);
sOut := CONCAT(sOut, arg1);
sOut := CONCAT(sOut, arg2);

//und dann um es noch auszugeben:

SendMessageToHMI (sOut);





Das wäre auch ein weg an den ich in etwa gedacht habe. So muss ich halt schon vorher alle Datentypen einzeln in einen String umwandeln, bevor ich Sie übergebe. Hier habe ich aber jetzt noch das Problem dass mein String nun folgendermaßen aussieht:

'
Temperatur der Spindel zu hoch80150'

--> Wie kann ich noch die CONCAT Funktion so erweitern, dass meine Platzhalter bedient werden. Also wie oben im Beispiel, sollte das Ergebnis so aussehen:

'Temperatur der Spindel zu hoch SOLL=80 IST=150'

Einfach zwei weitere String erstellen ' SOLL ' und ' IST ' und diese dann dazwischen mogeln?


 
so könnte man es auch machen :

sMsg:= 'Temperatur der Spindel zu hoch Soll='
arg1:=INT_TO_STRING(nTempSpinReq);
arg2:= BYTE_TO_STRING(nTempSpinState);

sOut := CONCAT(sMsg, arg1, 'IST=',arg2);


SendMessageToHMI (sOut);

mit CONCAT kannst du gleichzeitig mehrere Strings miteinander verketten..probiers einfach mal aus
Gruß Thomas
 
Ahhhhhhh sehr gut!

Ich dachte CONCAT kann immer nur 2 Strings zusammenlegen ... DANKE!

Vll nochmal zu dem Versuch mit dem Platzhalter. Ich habe über F1 jetzt was zu der Format Syntax gefunden, in der man Platzhalter einsetzen kann ....
Kann ich jetzt den Ausgabestring vll auch so aufbauen?

arg1:=INT_TO_STRING(nTempSpinReq);
arg2:= BYTE_TO_STRING(nTempSpinState);


sMsg:= 'Temperatur der Spindel zu hoch SOLL= {@VAR(arg1)%s} IST {@VAR(arg2)%s}'


SendMessageToHMI (sMsg);



---> So würde ich mir die CONCAT Geschichte komplett sparen...
(Wobei ich hier bei dem Platzhalter {@VAR(arg1)%s} noch nicht verstanden habe für was das "@VAR" steht ... "(arg1)%s" ist mir aber klar ...)
 
das wird wohl so nicht gehen,
da du ja durch 'xxx' den Beginn/Ende einer Zeichenkette deklarierst.

Also in TwinCat funktioniert es ähnlich...

Es wird der FB SendMessageToHMI aufgerufen und dann werden die verschiedenen Eingänge gesetzt. Hier nochmal:
SendMessageToHMI (sMsg:='Temperatur der Spindel zu hoch SOLL=%d IST=%d', arg1:=F_INT(nTempSpinReq), arg2:=F_BYTE(nTempSpinState);

An der Stelle mit den Prozentzeichen werden dann die jeweiligen argumente eingesetzt.

Wenn ich jetzt also meinen eigenen FB_SendMessageToHMI deklariere und ihm als INPUT_VAR die Werte auch so weitergebe wie in TwinCat, müsste es soch auch funktionieren oder ?

SendMessageToHMI (sMsg:= 'Temperatur der Spindel zu hoch: SOLL= {@VAR(arg1)%s} IST {@VAR(arg2)%s}'
arg1:= INT_TO_STRING(nTempSpinReq),
arg2:= BYTE_TO_STRING(nTempSpinState) );



Liegt der Fehler an den Platzhaltern oder warum sollte das mit der Zeichenkette nicht gehen ?
 
Hallo,

womöglich hast Du Dich in der Onlinehilfe verlaufen: was Du gefunden hast, ist nicht die Syntax, die im SPS-Codeeditor zu verwenden ist, sondern die hat mit "ProVi" zu tun.
Am besten schaust Du mal das ProVi-Handbuch an. Liegt im Rexroth-Medienverzeichnis (dort suchen nach: Provi).

Wer z.B. Variable, etc. im Meldungstext mitgeben muss, ist bei ProVi richtig.

Die prinzipielle Vorgehensweise ist:

// 1. Diagnose einschalten: Menü: Diagnose/ProVi-SFC-Diagnose
// 2. Cursor in die Zeile stellen, welche die Meldung auslösen soll
// 3. Meldung editieren, dazu: Menü: Diagnose/Provi-Meldungseditor
// dort: Meldungstyp und Modulnummer wählen,
// Meldungsnummer wird automatisch fortlaufend, beginnend mit 0, angeboten.
// Meldungstexte editieren ggf. in mehreren Sprachen.
// Der ProVi-string (in den geschweiften Klammern) wird danach (bei ok) automatisch erzeugt

// die Meldung könnte im Editor z.B. so aussehen (das hat Ähnlichkeit mit der Syntax, die Du gefunden hast...):
// Mein ProVi-Fehlertext_0, Modul_1, mit Variable LifeTicker: {@VAR(LifeTicker)}



So könnte der SPS-Code aussehen (wobei die erste Zeile automatisch generiert wurde, und die zweite die Meldung bedient:
{ProVi Error, Module: 1, Not: FALSE, Set: FALSE, KA: FALSE, Indicate: FALSE, No: 0}
bProViTest_01 := Blink_0_5Hz;

Gruss
Lothar
 
Zuletzt bearbeitet:
Jau,da gebe ich dir recht.
Dann gehts aber, wenn du einen zusätliches Schmiermerkerwort benutzt (also CONCAT 2x benutzen)
 
Zurück
Oben