Funktion "RIGHT" setzt CPU in STOPP

Bensen83

Level-1
Beiträge
777
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, habe folgenden Code im SCL Baustein. Wenn ich die RIGHT Funktion aufrufe, geht immer die CPU mit folgenden Fehler auf Stop:

"STOP durch Bearbeitungsabbruch-Fehler (OB nicht geladen oder nicht möglich, bzw. kein FRB vorhanden)"

Die Bausteine sind alle online vorhanden. was könnte denn falsch sein?

Code:
"Maschinendaten".Stringlaenge := LEN   (S :=  DINT_TO_STRING("Maschinendaten".Seriennummer)
                ); 
"Maschinendaten".Stringlaenge := "Maschinendaten".Stringlaenge - 1;
 
"Maschinendaten".Zwischenstring := RIGHT(IN :=  DINT_TO_STRING("Maschinendaten".Seriennummer)
                                                    ,L :=  "Maschinendaten".Stringlaenge
                                                    );
 
versuch doch mal dein DINT_TO_STRING in eine eigene Stringvariable zu leiten und diese Variable dann in der Folge zu verwenden. Soweit ich weiß kannst du den Rückgabewert der Wandlungsfunktion NICHT direkt an die nächste Wandlungsfunktion weitergeben.
 
Hast du mal "Maschinendaten".Stringlänge kontrolliert?
Was steht da drin? Da du 1 abziehst, kommt bei einer Länge von 0 ein negativer Wert bzw. ein hoher Word-Wert zustande, daran könnte sich right verschlucken. Ich würde noch eine Abfrage der Länge einfügen.

Code:
IF "Maschinendaten".Stringlänge > 1 THEN

   "Maschinendaten".Stringlaenge := "Maschinendaten".Stringlaenge - 1;
   "Maschinendaten".Zwischenstring := RIGHT(IN :=  DINT_TO_STRING("Maschinendaten".Seriennummer)
                                                    ,L :=  "Maschinendaten".Stringlaenge
                                                    );
ENDIF;

Zusätzlich noch den von Lupo vorgeschlagenen Zwischenschritt, dann sparst du auch ein DINT_TO_STRING.
 
Ich muß noch einmal nachfragen. Wenn du die Right-Funktion auskommentierst, dann läuft das? Denn lt. Hilfe kann man sogar negative Werte für L angeben, in Stop darf da nichts gehen.
 
Endschuldigung ... noch einmal :

Du hast das :
Code:
"Maschinendaten".Zwischenstring := RIGHT(IN :=  DINT_TO_STRING("Maschinendaten".Seriennummer)
                                                    ,L :=  "Maschinendaten".Stringlaenge
                                                    );
ersetzt durch :
Code:
HilfsString := '' ;
hilfsString := DINT_TO_STRING("Maschinendaten".Seriennummer) ;
"Maschinendaten".Zwischenstring := RIGHT(hilfsString , L := "Maschinendaten".Stringlaenge )  ;
???

Wenn nicht dann wird es meines Wissens nach nicht funktionieren !
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast du mal "Maschinendaten".Stringlänge kontrolliert?
Was steht da drin? Da du 1 abziehst, kommt bei einer Länge von 0 ein negativer Wert bzw. ein hoher Word-Wert zustande, daran könnte sich right verschlucken. Ich würde noch eine Abfrage der Länge einfügen.

Code:
IF "Maschinendaten".Stringlänge > 1 THEN
 
   "Maschinendaten".Stringlaenge := "Maschinendaten".Stringlaenge - 1;
   "Maschinendaten".Zwischenstring := RIGHT(IN :=  DINT_TO_STRING("Maschinendaten".Seriennummer)
                                                    ,L :=  "Maschinendaten".Stringlaenge
                                                    );
ENDIF;

Eine zusätzliche Abfrage der Länge des STRINGS ist hier nicht notwendig.

Die Funktion DINT_TO_STRING liefert einen STRING mit einer Länge von mindestens zwei Zeichen (Vorzeichen + Zahl)

DINT = 0 => DINT_TO_STRING => STRING = +0

Die Länge des STRINGS kann also nicht kleiner als 2 Zeichen sein.

http://www.sps-forum.de/showpost.php?p=236760&postcount=6

http://www.sps-forum.de/showpost.php?p=236761&postcount=7

Gruß Kai
 
Hallo Kai,
du wirst da sicherlich Recht haben mit dem, was du da schreibst. Mein Schuß ging hier auch ein bißchen "aus der Hüfte". Ich habe aber ganz grundsätzlich mit den Siemens-String-Routinen die Erfahrung gemacht, dass die erstens NICHT mit nicht initialisierten Strings arbeiten (wollen - auch wenn sie es zweifelsohne könnten), zweitens ungern einen String generieren und drittens ungern kaskadiert werden wollen - gerade nicht in Verbindung mit SCL.

Gruß
Larry
 
String falsch?

Also ich habe einmal alles auskommentiert bis auf das DINT_TO_STRING(.....)

da geht die cpu auch in stop, warum auch immer. wenn ich anstelle von dint_to_string

DI_STRING einsetze, funktioneirt es.
Aber dann geht die cpu bei einer weiteren verwendung des zwischenstrings in stop. warum?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
DI_String ist der symbolisch Name des FC's.
Wenn du das ganze sinnvoll in SCL verwenden willst so wäre es mit DINT_to_String schon der richtige Weg.

... wenn du es wirklich wissen willst :
Mach jede Aktion für sich erstmal einzeln und arbeiten (gerade bei den Strings) mit Zwischenvariablen. Ein String muss (hatte ich ja schon öfter mal geschrieben) für die Siemens-Bausteine immer einmal initialisiert worden sein.
Das ist vor allem wenn die als TEMP deklariert sind, sehr wichtig.
In SCL macht man das mit myString := '' ;

Gruß
Larry
 
Fehler eingegrenzt

Also es liegt nicht genau an der funktion dint_to_string, aber auch nicht an den anderen funktionen, der fehler ist eine kombination aus beiden ;-)

Habe jetzt mal ziemlich viel auskommentier. (Fast alles im Baustein.)

Ich habe eine concat funktion, diese wird auch einwandfrei ausgeführt.

nun kommt eine dint_to_STRING funktion, diese funktioniert auch.

al nächstes hatte ich eine weitere concat funktion, beim einkommentieren dieser funktion, ging die cpu in stop. ich habe diese funktion durch die erste (funktionierende) concat funktion ersetzt. und die cpu geht auch in stop. wie kann das sein?
 
DELETE macht auch Probleme

Habe jetzt folgenden Code im Baustein:

Code:
"Maschinendaten".Auftragsnummer_gesamt := CONCAT(    IN1 := 'Auftragsnummer: '
                                                    ,IN2 := "Maschinendaten".Auftragsnummer
                                                    );
          
"Maschinendaten".Seriennummer_gesamt := CONCAT(      IN1 := ' / Seriennummer: '
                                                    ,IN2 := DINT_TO_STRING("Maschinendaten".Seriennummer)
                                                    );    
"Maschinendaten".Vorzeichenposition := FIND(IN1 :=  "Maschinendaten".Seriennummer_gesamt// IN: STRING
                                            ,IN2 :=  '+'// IN: STRING
                                            ); // INT
 
(*
"Maschinendaten".Seriennummer_gesamt := DELETE(IN :=  "Maschinendaten".Seriennummer_gesamt// IN: STRING
                                               ,L :=  1 // IN: INT
                                               ,P :=  "Maschinendaten".Vorzeichenposition // IN: INT
                                               ); // STRING
*)                                         
"Maschinendaten".Maschinenidentifikation := CONCAT(  IN1 :=  "Maschinendaten".Auftragsnummer_gesamt
                                                    ,IN2 :=  "Maschinendaten".Seriennummer_gesamt
                                                    );

Wenn ich nun den DELET teil wieder einkommentiere, geht die CPU sofort in STOP.
 
ok

Habe alle dort verwendeten Strings am anfang des Bausteins mit. z.B.
"Maschinendaten".Maschinenidentifikation := '';
beschrieben. ist das ok?
 
Das ist OK und das meinte ich ...
verbleibt also nur noch das :
Code:
"Maschinendaten".Seriennummer_gesamt := CONCAT(      IN1 := ' / Seriennummer: '
                                                    ,IN2 := DINT_TO_STRING("Maschinendaten".Seriennummer)
                                                    );
... von dem ich aus obigem Codeschnipsel entnehme, dass es immer noch so gemacht ist.
Trotz des Beitrages von Kai (sorry ...) bin ich der Meinung, dass du hier doch noch (und sei es nur für mich) mal mit einem Zwischenstring arbeiten solltest.
 
Zurück
Oben