FB42 (SCL) kann nicht geladen werden ?

noeppkes

Level-1
Beiträge
150
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich bekomme ständig die Meldung:
FB42 (Das ist eine fehlerfrei compilierte SCL-Datei) kann nicht geladen werden.
Der genaue Fehlertext lautet:

"Die Länge der Lokaldaten oder Schreibschutzkennung ist fehlerhaft.
Der Baustein FB42 konnte nicht kopiert werden"

Komisch ist nur, sobald ich den MID-Befehl rausschmeisse, lässt sich der FB42 laden.

Als MID habe ich den FC26 / V1.2 der IEC-Library geladen.

Hier mein SCL-Code:

Code:
FUNCTION_BLOCK FB42 //Telegrammbetrieb_rs485
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
// statische Variablen
VAR
  //sende_adresse      : INT := 1;
  //soll_temp_abfrage  : INT := 1; // Welche Sollwerttemperatur soll abgefragt werden. 1 ... 6: WZ - EZ
END_VAR
// temporäre Variablen
VAR_TEMP
  empfangs_adresse  : INT;
  temp : INT;
END_VAR
 
// Hier ist das Problem.
  empfangs_adresse := STRING_TO_INT(MID(IN:=DB20.COMMENT[13], L:=2, P:=1));
 
// Und hier genauso.
  temp := STRING_TO_INT(MID(IN:=DB20.COMMENT[13], L:=5, P:=13));
 
// ...

Ich hoffe mir kann jemand helfen.

noeppkes...
 
Hallo,
hier m.E. das gleiche Problem wie in dem anderen Beitrag.
Du übergibst der FC MID keinen String.
Vielleicht wäre es sinnvoll erst einmal mit internen SCL-Strings anzufangen deinen FB zum Laufen zu bekommen und dann diese Strings mit externen Daten zu füllen. Beispiel hier die AT-Geschichte aus dem anderen Beitrag ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke

Hallo LL,

danke für diene Umfangreiche Hilfe.
Ich denke das wird das Problem sein.
In meinem DB20 habe ich ewin Array von 1023 CHAR.
Dies muss ich wohl erst konvertieren.

noeppkes ...
 
Oder in den Compiler Einstellungen von SCL die Max Stringlänge runter setzen.

Wenns ohne den "MID" Aufruf geklappt hat könnte das dein Problem sein ;)
 
@noeppkes

Hast du schon mal Daten hier in temp rausbekommen?: temp := STRING_TO_INT(MID(IN:=DB20.COMMENT[13], L:=5, P:=13));

Ich hab das heute probiert, der Compiler hats gefressen, der Baustein wurde bearbeitet, nur Daten kamen keine in temp an. Interessant in diesem Zusammenhang, wenn man die Funktion Replace nutzen will

etwas so:
DB10.COMMENT[13] := STRING_TO_INT(REPLACE(IN:=DB20.COMMENT[13], L:=5, P:=13));

dann meckert der Compiler und läßt sich nicht zum compilieren überreden.

Es ist also durchaus möglich, daß man die Funktion "mid" nicht sinnvoll mit einem Array of Char einsetzen kann, bin mir dessen aber auch nicht ganz sicher, per Definition benötigt sie einen String an IN.

Eine Alternative habe ich dir ja heute in deinem 2. laufenden Thread gepostet.

Die Lokaldatenmeldung hatte ich auch, wenn ich 2 Tempvar als String definiert habe. (Das bedeutet, jeder String hat eine Länge von 254 Zeichen!) Mit String[10] ging es dann, klar, weil die zwei langen String bringen ja den Stack sofort an den Rand des Wahnsinns :ROFLMAO: . Warum das in deinem Code gerade mit mid zusammenhängen soll, ist mit auch nicht ganz klar, kann aber sein, daß diese Funktion intern auch eine ganze Menge Lokaldaten verbrezelt und je nachdem, was sonst noch in deinem Baustein steht ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... vielleicht sollte man an dieser Stelle auch berücksichtigen, das ein STRING im Gegensatz zu einem ARRAY_OF_CHAR ja noch einen Header hat (Gesamtlänge , akt.Länge). Wenn ich die Funktion MID nachprogrammieren würde, dann würde ich die benutzen. Das steht aber bei der Daten-Übergabe von noeppkes nicht zur Verfügung ...

Gruß
LL
 
FB lässt sich nicht laden

Hallo

und Danke an alle, die mich hier unterstützt haben.
ICh habe den MID rausgeschmissen und habe den Vorschlag (anderer Thread) von Larry Laffer genommen.
Dieser sieht wie folgt aus:

Code:
VAR_TEMP
  empfangs_adresse  : INT;
  temp : INT;
  hString : STRING [10] ;
  bString AT hString : ARRAY [-1..10] OF BYTE ;
END_VAR
 
// MID habe ich auskommentiert.
//  empfangs_adresse := STRING_TO_INT(MID(IN:=DB20.COMMENT[13], L:=2, P:=1));
//  temp := STRING_TO_INT(MID(IN:=DB20.COMMENT[13], L:=5, P:=13));
 
// Dafür diese Art.
  hString:='';
  bString[0] := 2;  
  bString[1]:=DB20.DBB1;
  bString[2]:=DB20.DBB2;
  empfangs_adresse := STRING_TO_INT(hString);
  
  hString:='';
  bString[0]:=5;
  bString[1]:=DB20.DBB13;
  bString[2]:=DB20.DBB14;
  bString[3]:=DB20.DBB15;
  bString[4]:=DB20.DBB16;
  bString[5]:=DB20.DBB17;
  temp := STRING_TO_INT(hString);
 
FB lässt sich nicht laden

Hallo

und Danke an alle, die mich hier unterstützt haben.
ICh habe den MID rausgeschmissen und habe den Vorschlag (anderer Thread) von Larry Laffer genommen.
Dieser sieht wie folgt aus:

Code:
VAR_TEMP
  empfangs_adresse  : INT;
  temp : INT;
  hString : STRING [10] ;
  bString AT hString : ARRAY [-1..10] OF BYTE ;
END_VAR
 
// MID habe ich auskommentiert.
//  empfangs_adresse := STRING_TO_INT(MID(IN:=DB20.COMMENT[13], L:=2, P:=1));
//  temp := STRING_TO_INT(MID(IN:=DB20.COMMENT[13], L:=5, P:=13));
 
// Dafür diese Art.
  hString:='';           // String löschen
  bString[0] := 2;    // Lönge setzen
  bString[1]:=DB20.DBB1;  // Daten kopieren
  bString[2]:=DB20.DBB2;  // Daten kopieren
  empfangs_adresse := STRING_TO_INT(hString);  // String in INT wandeln.
 
  hString:='';  // String löschen
  bString[0]:=5;  // Länge setzen
  bString[1]:=DB20.DBB13;  // Daten kopieren
  bString[2]:=DB20.DBB14;  // Daten kopieren
  bString[3]:=DB20.DBB15;  // Daten kopieren
  bString[4]:=DB20.DBB16;  // Daten kopieren
  bString[5]:=DB20.DBB17;  // Daten kopieren
  temp := STRING_TO_INT(hString);  // String in INT wandeln
 
  // ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo noeppkes,
schön, wenn ich dir ein wenig weiterhelfen konnte.
Die Zuordnung der einzelnen Bytes in das ARRAY kann auch über eine Schleife erfolgen. Das lohnt sich vom Code her allerdings bei 4 Bytes nicht unbedingt. Nur so prinzipiell ...
Code:
FOR i := 1 to 5 BY 1 DO
     bString[i]:=DB20.DBB[12+i] ;  // könnte auch sein das es DBB(12+i) heißen muss
END_FOR ;
Gruß
LL
 
Zurück
Oben