Sting nach String kopieren in SCL

Waelder

Level-2
Beiträge
964
Reaktionspunkte
117
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo LEute, mich fuchst gerade SCL.

ich will folgende Parameter (auszug) übergeben :

Code:
FUNCTION FC1000 :VOID
//Stutzen prüfen
VAR_INPUT
Start : BOOL;
STUTZEN_EIN : STRING[32] //Name eingelesen
END_VAR 
VAR_OUTPUT  
STUTZEN_AUS : STRING[32]; //Name Auslesen
BEGIN
STUTZEN_AUS := STUTZEN_EIN;
END_FUNCTION
geht nicht, wenn ich den eingang und ausgang mit Strins beschreibe (aus DB)
Code:
FUNCTION FC1000 :VOID
//Stutzen prüfen
VAR_INPUT
Start : BOOL;
STUTZEN_EIN : STRING[32] //Name eingelesen
END_VAR 
VAR_OUTPUT  
STUTZEN_AUS : STRING[32]; //Name Auslesen
BEGIN
 STUTZEN_AUS := 'IRGENDEINTEXT';
END_FUNCTION
dann steht IRGENDEINTEXT drin ?

Wie schaffe ich es aus dem DB den String auszulesen und zu übergeben ?

Danke noch
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Probier über ein TEMP zu gehen.

Code:
FUNCTION FC1000 :VOID
//Stutzen prüfen
VAR_INPUT
Start : BOOL;
STUTZEN_EIN : STRING[32]; //Name eingelesen (";" fehlten)
END_VAR 
VAR_OUTPUT  
STUTZEN_AUS : STRING[32]; //Name Auslesen
END_VAR // fehlt in dein Code !
VAR_TEMP
str_temp : STRING[32] ;
END_VAR
 
BEGIN
str_temp := STUTZEN_EIN ;
STUTZEN_AUS := str_temp;
END_FUNCTION
 
Zuletzt bearbeitet:
oha... hab zuwenig geschrieben

im prinzip müsste es auch so gehen :

Wenn ich in SCL (FC Baustein) einen String (32) von einem DB einlese möchte ich diesen wieder hinten am Baustein auch String (32) rausgeben.

dieses Beispiel geht :
STUTZENNAME := 'B20K00';
da steht dann B20K00 am Ende drin

dieses Beispiel geht nicht:
STUTZENNAME := TL_TANK.B01.NAME;
da steht dann gar nichts drin....:confused:

ich bekomms einfach nicht gebacken
 
... und der String, der in "TL_TANK.B01.NAME" steht, ist auch korrekt initialisiert (also die beiden Header-Bytes) ?
 
hmm da hat´s mir die CPU gestoppt.... :rolleyes:

Kann das sein, dass :
Code:
VAR_TEMP
str_temp0 : STRING[32] ; <-- Hier nur ne begrenzte länge möglich?
str_temp1 : STRING[32] ;
str_temp2 : STRING[32] ;
str_temp2 : STRING[32] ;
END_VAR
bei mehr wie 2 String variabeln ist essig... da macht die CPU zu.....
 
Wenn ich es richtig verstehe... Willst du am eingang eines FC einen String übergeben und den selben gleich an den Ausgang übergeben? wenn ja wieso kein blockmove? geht wunderbar mach ich auch so
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beim verwenden von Strings in temporären Variablen gibt es etwas sehr wichtiges zu beachten!
Der String muss immer initialisiert werden, da ansonsten die Längenangabe im ersten Bytes des Strings nicht korrekt gesetzt wird.
Code:
VAR_TEMP
    str_temp0 : STRING[32] ;
END_VAR

BEGIN
    str_temp0 := ''; // << Immer machen!
...
...
Machst du die Initialisierung nicht, stehen dort zufällige Längen drin. Ist dieser zufällige Wert größer als der echte String, zerschießt es dir im schlimmsten Fall andere Variablen in den Lokaldaten. Steht in der Länge 0 so werden nur evtl. Kopieroperationen nicht durchgeführt, weil der Zielstring die falsche Länge hat.

Wie sieht denn bei dir der Funktionsaufruf auf? Wenn du die Funktion direkt mit 2 Datenbausteinen als Parameter beschaltest sollte es eigentlich funktionieren.
 
hmm da hat´s mir die CPU gestoppt.... :rolleyes:

Kann das sein, dass :
Code:
VAR_TEMP
str_temp0 : STRING[32] ; <-- Hier nur ne begrenzte länge möglich?
str_temp1 : STRING[32] ;
str_temp2 : STRING[32] ;
str_temp2 : STRING[32] ;
END_VAR
bei mehr wie 2 String variabeln ist essig... da macht die CPU zu.....

Kann sein dass dadurch deine FC zuviel Lokaldaten beansprucht.
Bei Stringbearbeitung gabs in SCL mal ne Einstellung, das die Stringlänge begrenzt.
Ob dies immer noch nötig ist weiss ich nicht, aber wir hatten selber mal so einen Baustein bei die CPU die Grätsche machte.
Erst als wir vorm Übersetzen die Einstellung, von ich glaub 254 auf unsere maxl. Stringlänge setzten, gings dann.

Strings vorher Intialisiern *ACK*, beim FC sowieso ;)
 
Das muß an der Initialisierung des Input-String liegen. Folgender Code funktioniert bei mir seit Jahren:


Code:
FUNCTION FC254 : INT

Title = 'String umkopieren'
//
// String umkopieren
//
Version : '1.0'
author  : rk
name    : STR_KOP
family  : SYSTEM

VAR_INPUT
   // Eingangsparameter
   InString: STRING;
END_VAR

VAR_OUTPUT 
   // Ausgangsparameter
   OutString: STRING;
END_VAR

VAR_TEMP
    // temporäre Variablen
END_VAR

// Anweisungsteil
    OutString := InString;
   
    ;
    FC254 := 100;
END_FUNCTION

Ich würde nicht über Temp gehen, das kostet nur unnötig Rechenzeit und bringt nichts.
 
Zurück
Oben