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

Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 38

Thema: Fehlermeldung bei SCL-Programm

  1. #21
    Tuggi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.01.2011
    Beiträge
    14
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Deltal Beitrag anzeigen
    Das ist halt der Return Wert der Funktion. In deinem Fall ein Integer Wert.

    Aber der Fehler kommt doch, wenn du die SCL Quelle übersetzen willst?

    Der Compiler sagt dir, dass er keinen Baustein kompilieren kann weil er den FC (Zielbaustein) nicht öffnen kann.

    Der Aufruf ist nochmal ne andere Geschichte.

    Lösche mal den Fc1 in deinem Projektordner (symbol NICHT löschen).
    Der Fehler kommt nach der Übersetzung der SCL Quelle im SCL Editor. Meinst du damit, dass ich den Inhalt des FCs löschen soll?

    Da stellt sich noch ne allgemeine Frage für mich.

    ...
    END_FOR;
    SelectionSort := 100; (1)
    END_FUNCTION

    (1) bedeutet diese Zeile nicht, dass quasi der Rückgabewert dieser Funktion (Ret_Val) immer eine 100 zurück gibt?

    Zitat Zitat von dalbi Beitrag anzeigen
    Hi,

    Code:
    // SCL-Programmbeispiel-SelectionSort
    FUNCTION SelectionSort : INT
     
    VAR_IN_OUT // Variablendeklaration
    arrValues : ARRAY[20,43,10,6,18] OF INT;
    END_VAR
    VAR_TEMP
    Idx1, Idx2, MaxIdx, MaxVal, MAXSIZE : INT;
    END_VAR
     
    MAXSIZE := LEN(arrValues); // Bestimmung der Länge des Feldes
     
    FOR Idx1 := MAXSIZE TO 1 BY -1 DO // Werte des Feldes erfassen
    MaxVal := arrValues[Idx1];
    MaxIdx := Idx1;
    hier liegt meiner Meinung nach der Fehler, ist LEN ein selbst geschriebener Baustein um die Feldlänge zu ermitteln?

    Oder willst Du den in SCL integrierten LEN benutzen? Der ist allerdings nur für Strings und das kann so nicht funktionieren.

    Gruss Daniel
    Ja genau.. Ich wollte die Funktion LEN für SCL zur Bestimmung der Feldlänge benutzen. Stimmt, sie funtioniert nur für STRINGs. Gibt es denn auch so eine Funktion für ein ARRAY-Feld oder muss man was eigenes zusammenbauen?

    Zitat Zitat von Chefmech Beitrag anzeigen
    Die Array-Deklaration
    Code:
    arrValues : ARRAY[20,43,10,6,18] OF INT;
    erscheint etwas sonderbar, bist du sicher dass du ein 5-dimensionales Array willst?
    C-Syntax kannste nicht 1:1 übernehmen, besonders bei den Array funktioniert das so nicht.

    Ebenfalls das LEN glaube ich nicht, dass er dir die Arraygrösse ausliest.

    Array deklaration mit Initialwerten:
    Code:
    arrValues: array[1..5] of INT := 20, 43, 10, 6, 18;
    weitere Details --> siehe in der Hilfe vom SCL-Editor nach
    Hast mich erwischt^^... das hatte ich so aus der C-Programmierung übernommen. Für mich, und damit mein Programm funktioniert, müsste ich diese Variable so deklarieren:

    arrValues: ARRAY[0..4] of INT := 20, 43, 10, 6, 18;

    Aber wenn man nun keine Anfangswerte in einem FC zuweisen kann, wie macht man das denn dann? Sollte ich statt dessen lieber ein FB verwenden und dort dann die nötigen Parameter deklarieren? Die SelectionSort-Funktion würde ich dann im FB aufrufen über ein FC. Macht man das so?

  2. #22
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    ... um dir nun sinnvoll weiterhelfen zu können ... wie sieht nun nach den angeregten Korrekturen dein Baustein wirklich aus ? Was bezweckst du damit ? Deine Function arbeitet mit Übergabewerten. Warum willst du die vorbesetzen ? Das würde auch bei einem FB nicht mit der Schnittstelle IN_OUT funktionieren.

    Gruß
    Larry

  3. #23
    Tuggi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.01.2011
    Beiträge
    14
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    So sieht nun mein Programm aus:

    // SCL-Programmbeispiel-SelectionSort
    FUNCTION SelectionSort : INT;

    VAR_IN_OUT // Variablendeklaration
    arrValues : ARRAY[0..4] OF INT := 20,43,10,6,18;
    END_VAR
    VAR_TEMP
    Idx1, Idx2, MaxIdx, MaxVal : INT;
    MAXSIZE : INT := 4;
    END_VAR
    BEGIN
    FOR Idx1 := MAXSIZE TO 1 BY -1 DO // Werte des Feldes erfassen
    MaxVal := arrValues[Idx1];
    MaxIdx := Idx1;

    FOR Idx2 := 0 TO Idx1-1 DO // Bestimmung des größten Wertes der Zelle aus dem Feld
    IF arrValues[Idx2] > MaxVal THEN // und deren Indexübernahme
    MaxVal := arrValues[Idx2];
    MaxIdx := Idx2;
    END_IF;
    END_FOR;

    IF MaxIdx < Idx1 THEN // größter Wert der hochwertigsten Zelle übergeben
    arrValues[MaxIdx] := arrValues[Idx1];
    arrValues[Idx1] := MaxVal;
    END_IF;
    END_FOR;
    SelectionSort := 100;
    END_FUNCTION
    ------------------
    Zusätzlich zur Veränderung des Programms habe ich den RET_VAL-Parameter zum MW100 im OB1 zugewiesen:

    CALL "SelectionSort"
    RET_VAL:=MW100

    Im KOP/AWL/FUP-Editor wird als Fehler für den OB1 unten im Feld nur noch das hier angezeigt:
    SCL-Uebung-TO\SIMATIC 400(1)\CPU 412-3 H\...\OB1 - <offline>

    hoffe das nützt euch was als info

  4. #24
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Deine Function arbeitet mit Übergabewerten. Warum willst du die vorbesetzen ? Das würde auch bei einem FB nicht mit der Schnittstelle IN_OUT funktionieren.
    Mit Übergabewerten meinte ich das ARRAY.
    Schade, dass du dazu keine Stellung genommen hast.

    In jedem Fall ... das mußt du im OB1-Aufruf natürlich auch beschalten - also irgendwo dieses Element anlegen (z.B. in einem DB) und dann dem FC übergeben.

    Wie auch in C muß bei Step7 jeder Schnittstellen-Parameter beschaltet werden (zumindestens bei einer Function und bei Variablen, die byRef übergeben werden).

    Gruß
    Larry

    Ach ja - nochmal : was bezweckst du ...?
    Geändert von Larry Laffer (14.01.2011 um 10:28 Uhr)

  5. #25
    Tuggi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.01.2011
    Beiträge
    14
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    ... um dir nun sinnvoll weiterhelfen zu können ... wie sieht nun nach den angeregten Korrekturen dein Baustein wirklich aus ? Was bezweckst du damit ? Deine Function arbeitet mit Übergabewerten. Warum willst du die vorbesetzen ? Das würde auch bei einem FB nicht mit der Schnittstelle IN_OUT funktionieren.

    Gruß
    Larry
    Mein Ziel ist es dieses Programm zu testen/beobachten. Was muss ich also vorher alles eingestellt haben damit es funktioniert? Bisher habe ich nur die SCl-Quelle und einen OB1,wodrin der Aufruf mit CALL "SelectionSort" steht und der RET_VAL:=MW100 steht. Ein FC ohne Inhalt habe ich auch noch.

    gruß

  6. #26
    Tuggi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.01.2011
    Beiträge
    14
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Mit Übergabewerten meinte ich das ARRAY.
    Schade, dass du dazu keine Stellung genommen hast.

    In jedem Fall ... das mußt du im OB1-Aufruf natürlich auch beschalten - also irgendwo dieses Element anlegen (z.B. in einem DB) und dann dem FC übergeben.

    Wie auch in C muß bei Step7 jeder Schnittstellen-Parameter beschaltet werden (zumindestens bei einer Function und bei Variablen, die byRef übergeben werden).

    Gruß
    Larry

    Ach ja - nochmal : was bezweckst du ...?


    Ich wusste es ja nicht bsser, deswegen die Übergabewerte. Eigentlich dachte ich dass das beobachten/testen auch nur mit dem Scl Editor klappt ohne, dass ich dazu die Bausteine realisieren muss.

    gruß

  7. #27
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Naja ... das klappt in C doch auch nicht wirklich ...
    Du mußt schon die Schnittstellen beschalten ...

    Wo stehst du jetzt ...?

  8. #28
    Registriert seit
    18.03.2008
    Beiträge
    267
    Danke
    3
    Erhielt 26 Danke für 26 Beiträge

    Standard

    Zitat Zitat von Tuggi Beitrag anzeigen
    Gibt es denn auch so eine Funktion für ein ARRAY-Feld oder muss man was eigenes zusammenbauen?
    Nein, gibts leider nicht. Wenn du dir sowas basteln willst, geht das höchstens mit einem Any-Pointer, ist aber recht umständlich.

  9. #29
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Hi,

    Achtung Wild! Erste Variante über Any Pointer.

    Code:
    /////////////////////////////////////////////////
    // Datenbaustein mit den Daten
    DATA_BLOCK Daten
      STRUCT
        arrValues : ARRAY[0..4] OF INT := 20,43,10,6,18;
        RetVal : INT;     
      END_STRUCT
    BEGIN
    
    END_DATA_BLOCK
    
    /////////////////////////////////////////////////
    // SCL-Programmbeispiel-SelectionSort
    FUNCTION SelectionSort : INT
    
    VAR_INPUT // Variablendeklaration
      //arrValues : ARRAY[0..4] OF INT := 20,43,10,6,18;
      arrValues : ANY;
    END_VAR
    
    VAR_TEMP
      tAny : ANY;
      ptArrValues AT tAny : STRUCT
        id: BYTE;
        DataType: BYTE;
        Lenght: WORD;
        DBNr: WORD;
        Byte_Pointer: DWORD;
      END_STRUCT;    
      tAdr : INT;
      tLen : INT;
      Idx1, Idx2, MaxIdx, MaxVal : INT;
      MAXSIZE : INT;
    END_VAR
    
    BEGIN
    
      tAny := arrValues;
      
      tAdr := DWORD_TO_INT(SHR(IN:=SHL(IN:=ptArrValues.Byte_Pointer,N:=8),N:=11));
      tLen := WORD_TO_INT(ptArrValues.Lenght);
      MAXSIZE := tLen - 1;
      
      FOR Idx1 := MAXSIZE TO 1 BY -1 DO // Werte des Feldes erfassen
    
        MaxVal := WORD_TO_INT(WORD_TO_BLOCK_DB(ptArrValues.DBNr).DW[tAdr+(Idx1*2)]); //arrValues[Idx1];
        MaxIdx := Idx1;
    
        FOR Idx2 := 0 TO Idx1-1 DO // Bestimmung des größten Wertes der Zelle aus dem Feld
          IF WORD_TO_INT(WORD_TO_BLOCK_DB(ptArrValues.DBNr).DW[tAdr+(Idx2*2)]) > MaxVal THEN //arrValues[Idx2] > MaxVal THEN // und deren Indexübernahme
            MaxVal := WORD_TO_INT(WORD_TO_BLOCK_DB(ptArrValues.DBNr).DW[tAdr+(Idx2*2)]); //arrValues[Idx2];
            MaxIdx := Idx2;
          END_IF;
        END_FOR;
    
        IF MaxIdx < Idx1 THEN // größter Wert der hochwertigsten Zelle übergeben
          WORD_TO_BLOCK_DB(ptArrValues.DBNr).DW[tAdr+(MaxIdx*2)] := WORD_TO_BLOCK_DB(ptArrValues.DBNr).DW[tAdr+(Idx1*2)]; //arrValues[MaxIdx] := arrValues[Idx1];
          WORD_TO_BLOCK_DB(ptArrValues.DBNr).DW[tAdr+(Idx1*2)] := INT_TO_WORD(MaxVal); //arrValues[Idx1] := MaxVal;
        END_IF;
    
      END_FOR;
    
      SelectionSort := 100;
    
    END_FUNCTION
    
    /////////////////////////////////////////////////
    // Bausteinaufruf im OB1
    ORGANIZATION_BLOCK OB1
    
    VAR_TEMP
      // reserviert
      info : ARRAY[0..19] OF BYTE;
      // temporäre Variablen
    
    END_VAR
    
    BEGIN
    
      Daten.RetVal := SelectionSort(Daten.arrValues);
    
    END_ORGANIZATION_BLOCK
    Gruss Daniel
    Geändert von dalbi (15.01.2011 um 02:08 Uhr)
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  10. #30
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,

    etwas übersichtlicher über einen UDT.

    Code:
    /////////////////////////////////////////////////
    // Anwender Datentyp
    TYPE UDT_Values
      STRUCT
        arrValues : ARRAY[0..4] OF INT := 20,43,10,6,18;
      END_STRUCT
    END_TYPE
    
    /////////////////////////////////////////////////
    // Datenbaustein mit den Daten
    DATA_BLOCK Daten
      STRUCT
        arrValues : UDT_Values;
        RetVal : INT;     
      END_STRUCT
    BEGIN
    
    END_DATA_BLOCK
    
    /////////////////////////////////////////////////
    // SCL-Programmbeispiel-SelectionSort
    FUNCTION SelectionSort : INT
    
    VAR_IN_OUT // Variablendeklaration
      //arrValues : ARRAY[0..4] OF INT := 20,43,10,6,18;
      arrValues : UDT_Values;
    END_VAR
    
    VAR_TEMP
      Idx1, Idx2, MaxIdx, MaxVal : INT;
      MAXSIZE : INT;
    END_VAR
    
    BEGIN
    
      MAXSIZE := 4;
      
      FOR Idx1 := MAXSIZE TO 1 BY -1 DO // Werte des Feldes erfassen
    
        MaxVal := arrValues.arrValues[Idx1];
        MaxIdx := Idx1;
    
        FOR Idx2 := 0 TO Idx1-1 DO // Bestimmung des größten Wertes der Zelle aus dem Feld
          IF arrValues.arrValues[Idx2] > MaxVal THEN //arrValues[Idx2] > MaxVal THEN // und deren Indexübernahme
            MaxVal := arrValues.arrValues[Idx2]; //arrValues[Idx2];
            MaxIdx := Idx2;
          END_IF;
        END_FOR;
    
        IF MaxIdx < Idx1 THEN // größter Wert der hochwertigsten Zelle übergeben
          arrValues.arrValues[MaxIdx] := arrValues.arrValues[Idx1]; //arrValues[MaxIdx] := arrValues[Idx1];
          arrValues.arrValues[Idx1] := MaxVal; //arrValues[Idx1] := MaxVal;
        END_IF;
    
      END_FOR;
    
      SelectionSort := 100;
    
    END_FUNCTION
    
    /////////////////////////////////////////////////
    // Bausteinaufruf im OB1
    ORGANIZATION_BLOCK OB1
    
    VAR_TEMP
      // reserviert
      info : ARRAY[0..19] OF BYTE;
      // temporäre Variablen
    
    END_VAR
    
    BEGIN
    
      Daten.RetVal := SelectionSort(arrValues:=Daten.arrValues);
    
    END_ORGANIZATION_BLOCK
    Nachtrag: Die MAXSIZE könnte man wieder über den ANY ermitteln.

    Gruss Daniel
    Geändert von dalbi (15.01.2011 um 02:20 Uhr)
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

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

    Tuggi (17.01.2011)

Ähnliche Themen

  1. S5 Programm überschreiben zu S7 Programm
    Von Tabler im Forum Simatic
    Antworten: 20
    Letzter Beitrag: 29.03.2011, 22:37
  2. Antworten: 8
    Letzter Beitrag: 09.12.2010, 18:08
  3. Fehlermeldung PS4 201 MM1
    Von Mike Macho im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 18.11.2008, 14:49
  4. Antworten: 0
    Letzter Beitrag: 05.10.2006, 13:56
  5. S5 Programm in ein S7 Programm umwandeln
    Von 1schilcher im Forum HMI
    Antworten: 3
    Letzter Beitrag: 15.01.2006, 11:53

Stichworte

Lesezeichen

Berechtigungen

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