TIA Strings über schnittstelle definieren (Verständnisproblem)

vollmi

Level-3
Beiträge
5.425
Reaktionspunkte
1.403
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen

Ich habe gerade ein Verständnisproblem.

Wenn ich

einen FC mache der so aussieht
Code:
IF (0 < FIND(IN1:=#EmpfangString, IN2:=#BefehlString)) THEN

wobei die Variablen in der Schnittstelle als String deklariert sind.
Und den FB aufrufe mit
EmpfangString := #String;
BefehlString := 'TEST';

Dann ist die Bedingung nicht erfüllt.

Wenn ich im FC aber so handhabe.
Code:
IF (0 < FIND(IN1:=#EmpfangString, IN2:='TEST')) THEN

Dann ist die Bedingung erfüllt.

über EmpfangString kommt ein String 'tibetitabTESTtia' rein.
Wieso ist die Bedingung oben nicht erfüllt über die Schnittstelle müsste der String doch genau gleich übergeben werden?

mfG René
 
Hallo René,

ist der Befehlsstring ein in dem aufrufen Baustein deklarierter String oder eine direkte Zuweisung an der Schnittstelle des Bausteins ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
"Befehl"(BefehlString:='TEST', 
Empfangsstring:=#Empfangsstring;

Der Befehlsstring soll direkt beim Aufruf an der Schnittstelle als Text eben z.B. 'TEST' eingegeben werden können.
Und danach soll dann im Baustein im Empfangsstring gesucht werden.

Ich will Find also in einen Baustein packen welcher dann noch einige Funktionen ausführen soll.

Wenn ich find direkt im aufrufenden Baustein verwende dann funktionierts wie ich mir das vorstelle.

mfG René
 
... und wenn du statt "TEST" einen deklarierten String (z.B. aus dem Lokaldatenbereich des aufrufenden Bausteins), der als Inhalt "TEST" hat, nimmst dann geht es vermutlich auch ...
 
interessanterweise nur wenn ich ihn im Aufrufenden Baustein im STAT deklariere.

Im TEMP nicht.

Und ich wollte ja eben genau nicht 200 Variablen im Aufrufenden Baustein deklarieren müssen sondern das direkt am aufzurufenden Baustein eingeben. Wie wenn ich direkt FIND aufgerufen hätte.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
damit das funktioniert muss immer eine lokale Kopie des eingehenden Strings angelegt werden. Das sollte SCL aber von selber machen.
Ich weiß jetzt nicht, ob Step7-Classic das richtig machen würde, ich nehme das aber mal an, das es so ist, denn sonst hätte ich in der Vergangenheit damit schon öfter mal Probleme bekommen.
So wie es aussieht hast du hier also ein neues "Feature" von TIA aufgedeckt. Ich denke mal nicht, dass du hier einen Fehler gemacht hast und würde dir vorschlagen, Herrn Siemens mal damit zu behelligen ...

Gruß
Larry
 
Was hast du denn für eine Steuerung: 300/400, 1200 oder 1500?
Bei Step7 konnte man bei einem FC Strings als Parameter nicht an unterlagerte Bausteine weiterleiten. Die musste man erst auf Temp-Variablen umkopieren. Zeig mal ein vollständiges Beispiel.
 
Danke euch. Ich probiere Es später mal mit einem FB.
Es ist eine 300er.

Strings sind leider nicht mein täglich Brot. Bzw bisher hab ich sowas direkt in einem Baustein abgehandelt. Jetzt möchte ich das halt sauber aufgliedern, in Treiber, Funktionen und Inhalt.

Mit freundlichen Grüßen René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke euch. Ich probiere Es später mal mit einem FB.
Es ist eine 300er.

Also ich habe das jetzt ausgiebig getestet. Es reicht also im FC eine Kopie im Stat anzulegen und mit := den Eingang zuzuweisen.

Code:
FUNCTION "IKS_Bef_ZE_ZA" : Void{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      Empfangsstring : String;
      Befehlsstring : String;
   END_VAR


   VAR_IN_OUT 
      Befehl : Int;
   END_VAR


   VAR_TEMP 
      Dummyval : Int;
      Befehlsstring_Temp : String;
   END_VAR




BEGIN
	#Befehlsstring_Temp := #Befehlsstring;
	
	IF   (0 < FIND(IN1:=#Empfangsstring, IN2:=#Befehlsstring_Temp)) AND  (0 < FIND(IN1:=#Empfangsstring, IN2:='ZE')) THEN
	  #Befehl := 5;
	ELSIF  (0 < FIND(IN1:=#Empfangsstring, IN2:=#Befehlsstring_Temp)) AND  (0 < FIND(IN1:=#Empfangsstring, IN2:='ZA')) THEN
	  #Befehl := 4;
	END_IF;
	
END_FUNCTION

Der Aufruf
Code:
"IKS_Bef_ZE_ZA"(Empfangsstring:=#Empfangsstring,                Befehlsstring:='MA01',
                Befehl:="Master"._DBW_86_0);

Als String kommt im Aufrufenden Programm im Empfangsbuffer dann etwas an wie
"NSBFMA01ZE" und entsprechend soll dann der INT Wert auf den Befehlsspeicher geschrieben werden. Nach Aufruf des Bausteins wird der Empfangsbuffer gelöscht.

mfg René
 
Also ich habe das jetzt ausgiebig getestet. Es reicht also im FC eine Kopie im Stat anzulegen und mit := den Eingang zuzuweisen.

Ne, du hast die Kopie im Temp angelegt und dich wohl verschrieben.
Hm, wieder was gelernt und das für eigenartig empfunden. Das ist nicht schön, dass man den String extra umkopieren muß, aber wohl nicht zu ändern.
 
Ne, du hast die Kopie im Temp angelegt und dich wohl verschrieben.

Ich Depp, natürlich im Temp.

Bald kommt ja 13 da ist dann alles wieder anders.

PS: was mir auch aufgefallen ist. Ein Quellenexport eines SCL Programms aus TIA. Lässt sich in Step7 nicht so ohne einfachso importieren. Die Variablenbezeichnungen sind nicht kompatibel und müssen von # befreit werden.
Ist zwar nur ne Kleinigkeit, aber man sitzt dann da und wundert sich warum der Bezeichner nicht existiert. Da hätten sie ruhig die Quellstruktur belassen können.

mfG René
 
Zurück
Oben