Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: FB42 (SCL) kann nicht geladen werden ?

  1. #1
    Registriert seit
    02.08.2006
    Beiträge
    150
    Danke
    47
    Erhielt 5 Danke für 2 Beiträge

    Standard


    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...
    Zitieren Zitieren FB42 (SCL) kann nicht geladen werden ?  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    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

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    noeppkes (13.01.2008)

  4. #3
    noeppkes ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    150
    Danke
    47
    Erhielt 5 Danke für 2 Beiträge

    Standard

    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 ...
    Zitieren Zitieren Danke  

  5. #4
    Registriert seit
    27.08.2003
    Ort
    Schweitenkirchen
    Beiträge
    472
    Danke
    101
    Erhielt 73 Danke für 59 Beiträge

    Standard

    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

  6. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    @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 . 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 ...
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    noeppkes (14.01.2008)

  8. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    ... 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

  9. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    noeppkes (14.01.2008)

  10. #7
    noeppkes ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    150
    Danke
    47
    Erhielt 5 Danke für 2 Beiträge

    Standard

    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);
    Zitieren Zitieren FB lässt sich nicht laden  

  11. Folgender Benutzer sagt Danke zu noeppkes für den nützlichen Beitrag:

    Robin0815 (30.08.2012)

  12. #8
    noeppkes ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    02.08.2006
    Beiträge
    150
    Danke
    47
    Erhielt 5 Danke für 2 Beiträge

    Standard

    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
     
      // ...
    Zitieren Zitieren FB lässt sich nicht laden  

  13. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard


    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

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 18.09.2013, 08:35
  2. Antworten: 7
    Letzter Beitrag: 17.09.2009, 17:38
  3. PLCSim Programm kann nicht geladen werden
    Von Gerki im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 23.04.2009, 18:43
  4. FB2 konnte nicht geladen werden
    Von noeppkes im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 11.09.2007, 14:35
  5. S7-PLCSIM - SDB122 kann nicht geladen werden??
    Von Krumnix im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 01.09.2005, 11:57

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •