Step 7 SCL Befehl "MID" liefert Fehler

drsnuggles

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

ich muss einen string zerlegen und nutze hierzu den String Befehl MID.

Code:
DummyStr:= MID(IN := TmpStr, L := FIND(IN1 := TmpStr, IN2 := Sep), P := 1);

Egal was ich mache kommt beim kompilieren ein Fehler.

Ungütiger Eingangs-, Durchgangs- oder Ausgangsparameter.

Der Fehler wird an der Position des "IN:=" angezeigt

Weiß jemand woran das liegt?

Der Delete Befehl den ich ebenfalls benutze hat keinerlei Probleme an dieser Stelle mit dem gleiche Parameteraufruf

Code:
TmpStr := DELETE(IN := TmpStr, L := FIND(IN1 := TmpStr, IN2 := Sep), P := 1);

Danke für eure Tipps schonmal

Der Doc
 
In welchem Bereich liegen denn die Variablen TmpStr, Sep, DummyStr?
Also Stat, Temp, FC-IN, FC-OUT, FC-INOUT, FB-IN, FB-OUT, etc. oder innerhalb einer Struktur?
 
ist der String (TempStr) initialisiert bzw. hat er ganz sicher einen Inhalt ...?

Ja ganz sicher. Der Fehler kommt ja auch beim Kompilieren und nicht während dem Ablauf.

Hier nochmal der Gesamte Code
Code:
VAR_INPUT
    str: STRING[254]; //Message STRING
END_VAR
VAR_OUTPUT
   GetMsgHeader : UDT_MES_MSGHeader; //Struct for Header data
END_VAR
   
VAR_TEMP
    // temporäre Variablen
    Sep : STRING[3]; //Seperator
    myString : STRING[254];
    TmpStr : STRING[254];
    DummyStr:STRING[254];
END_VAR
    // Anweisungsteil
    
    myString:=str;
   
   GetMsgHeader.ERROR := 0 <> FIND (IN1 := myString, IN2 := 'ERROR');
   
   TmpStr :=DELETE(IN := myString, L := FIND(IN1 := myString, IN2 := Sep), P := 1);
   
 
TmpStr := DELETE(IN := TmpStr, L := FIND(IN1 := TmpStr, IN2 := Sep), P := 1);
DummyStr:= MID(IN := TmpStr, L := FIND(IN1 := TmpStr, IN2 := Sep), P := 1);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Grad wahrscheinlich das Problem verstanden.

der Mid Befehl genau wie andere sind ja kein SCL Code sondern eigentlich FC Aufrufe. Diese verweisen auf FC Nummern die bei mir belegt sind. Kann man die irgendwie verschieben?

Beispiel MID is FC26, Dieser wird bei mir aber schon anderweitig durch System Bausteine eine NC benutzt.
 
Bei S7-Classic auf jeden Fall - du mußt nur zusehen, dass dein "neuer" FC (vielleicht hat der die Nr. 226) den richtigen symbolischen Namen bekommt (und der "falsche" FC26 den nicht mehr hat).

Gruß
Larry

Nachsatz : und danach dann natürlich neu übersetzen/kompilieren ...
 
Jop jetzt kommen wir schon eine großen Schritt weiter !

Danke schonmal


eine Kleinigkeit noch.

Folgender code wirft mir immer den Fehler

F: Parameterzuweisung nicht korrekt ohne

Dies wird ohne Zeile oder sonstigen Ort angezeigt

Der code sieht wie folgt aus:
Code:
FUNCTION FC5135 : String
VAR_INPUT
    ExtStrBuffer: STRING;
    Parameter: STRING;
END_VAR

VAR_TEMP
   TmpStr:STRING;
   ePar: STRING;
   sPar: STRING;
   StrBuffer: STRING;
   TmpLen: INT;
   TmpStrOutput:STRING;
END_VAR
//Constant Definition
ePar:='"';
sPar:='="';
StrBuffer:=ExtStrBuffer;
//Get message parameter
TmpStr := CONCAT(IN1 := Parameter, IN2 := sPar);
IF (0 <> FIND(IN1 := StrBuffer, IN2 := TmpStr)) THEN
    TmpLen:=LEN(S:=TmpStr);      
    TmpStr := DELETE(IN := StrBuffer, L := FIND(IN1 := StrBuffer, IN2 := TmpStr) + TmpLen - 1, P := 1);
    TmpStrOutput:= MID(IN := TmpStr, L := FIND(IN1 := TmpStr, IN2 := ePar) - 1, P := 1);
ELSE
   TmpStrOutput:= '';
END_IF;
FC5135:= TmpStrOutput;

END_FUNCTION

Hat hier noch jemand eine Idee?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Idee gerade nicht - höchstens um das ggf. auflösen zu können.
Du müßtest die verschachtelten FC-Aufrufe auflösen - also aus :
Code:
TmpStr := DELETE(IN := StrBuffer, L := FIND(IN1 := StrBuffer, IN2 := TmpStr) + TmpLen - 1, P := 1);
das machen :
Code:
help := FIND(IN1 := StrBuffer, IN2 := TmpStr) ;
TmpStr := DELETE(IN := StrBuffer, L := help + TmpLen - 1, P := 1);
... und bei dem anderen natürlich auch - möglicherweise kann dir dann der Compiler wieder helfen ...

Gruß
Larry
 
Eine Idee gerade nicht - höchstens um das ggf. auflösen zu können.
Du müßtest die verschachtelten FC-Aufrufe auflösen - also aus :
Code:
TmpStr := DELETE(IN := StrBuffer, L := FIND(IN1 := StrBuffer, IN2 := TmpStr) + TmpLen - 1, P := 1);
das machen :
Code:
help := FIND(IN1 := StrBuffer, IN2 := TmpStr) ;
TmpStr := DELETE(IN := StrBuffer, L := help + TmpLen - 1, P := 1);
... und bei dem anderen natürlich auch - möglicherweise kann dir dann der Compiler wieder helfen ...

Gruß
Larry

@Larry: Ich hab das mal so weit zerlegt das jeder FC eine eigene Zeile bekommt. Allerdings ohne Verbesserung.

Code:
FUNCTION FC5135 : String
VAR_INPUT
    ExtStrBuffer: STRING;
    Parameter: STRING;
END_VAR

VAR_TEMP
   TmpStr:STRING;
   ePar: STRING;
   sPar: STRING;
   StrBuffer: STRING;
   TmpLen: INT;
   TmpFind: INT;
   TmpStrOutput:STRING;
END_VAR
//Constant Definition
ePar:='"';
sPar:='="';
StrBuffer:=ExtStrBuffer;
//Get message parameter
TmpStr := CONCAT(IN1 := Parameter, IN2 := sPar);
IF (0 <> FIND(IN1 := StrBuffer, IN2 := TmpStr)) THEN
    TmpLen:=LEN(S:=TmpStr);  
    TmpFind:=FIND(IN1 := StrBuffer, IN2 := TmpStr);
    TmpFind:=TmpFind + TmpLen - 1;
    TmpStr :=DELETE(IN := StrBuffer, L := TmpFind , P := 1);
    TmpFind:=FIND(IN1 := TmpStr, IN2 := ePar) ; 
    TmpFind:=TmpFind-1;
    TmpStrOutput:= MID(IN := TmpStr, L := TmpFind , P := 1);
ELSE
   TmpStrOutput:= '';
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ohne da jetzt selber vorzusitzen kommt da bei mir jetzt fast auch nur noch "heisse Luft" ... :(

2 Ideen hätte ich noch :
- Du schreibst "IF (0 <> FIND ..." - das muß nicht der Fehler sein, du kannst aber ggf. einmal testen imdem du es umstellst - also "IF FIND () <> 0 ..."
- FIND, MID, DELETE, usw. sind alles FC's. Hast du diese in deinem Projekt wirklich drin ... UND ... haben die alle den richtigen symbolischen Namen (denn nur daran werden sie wirklich identifiziert). Ich glaube, das hatten wir vorne weiter schon mal - check das auf alle Fälle noch einmal gegen ...

Gruß
Larry
 
Hab jetzt noch etwas rum gespielt und durch auskommentieren den Fehler wohl auf den Concat Befehl eingrenzen können. Vielleicht sieht hier jemand was da falsch ist.
 
Nein auch keine verbesserung
Schadéee.
Was mich als SCL-Laie verblüfft: in welcher Länge wird denn jeweils der Platz für die Variablen
TmpStr:STRING;
ePar: STRING;
sPar: STRING;
StrBuffer: STRING;
festgelegt/reserviert? Kommt es da zu Überschneidungen?

Was passiert, wenn Du die Reihenfolge der Deklarationen änderst
ePar: STRING;
sPar: STRING;
StrBuffer: STRING;
TmpStr:STRING; // als letzte der StringVariablen
?

Es geht hier immer noch um Fehlermeldungen des Compilers? Nicht um Fehler zur Laufzeit des Programms?

 
Zuletzt bearbeitet:
Geht es jetzt um die Fehlermeldung "bei dem CONCAT"?
Code:
//anstatt:
TmpStr := CONCAT(IN1 := Parameter, IN2 := sPar);

//versuche mal so:
TmpStr := Parameter;
TmpStr := CONCAT(IN1 := TmpStr, IN2 := sPar);

PS: Hilfe zu CONCAT und den anderen IEC-String-Funktionen: die STRING-Parameter dürfen nur in den Speicherbereichen D und L liegen. VAR_INPUT ist also unzulässig.

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@Harald:
Das ist es ... der CONCAT würde schon funktionieren ... aber der TmpStr war nicht initialisiert.
Es würde also auch schon funktionieren wenn vor dem (ursprünglichem) CONCAT ein TmpStr := ''; stehen würde ...

Aber erstaunlich, das SCL nicht einmal die Zeile als Fehler erkennt ...

Gruß
Larry
 
Zurück
Oben