# Fehlermeldung bei SCL-Programm



## Tuggi (12 Januar 2011)

Hallo zusammen und ein frohes neues Jahr,
bei meiner Abschlussarbeit muss ich wohl oder übel die Applikation für eine Teilanlage in der Hochsprache SCL verfassen. Mit SIMATIC STEP 7 habe ich bisher nur ein wenig in meiner Ausbildung und im Studium zutun gehabt. SCL ist jetzt ganz neu für mich. Die Einarbeitung war glücklicherweise nicht so schlimm, weil die C-Programmierung aus dem Studium es mir vereinfacht hat. Zur Übungszwecken schreibe und teste ich irgendwelche SCL-Programme um mich in diesem Thema zurecht zu finden.
Hier das Programm und anschließend mein Problem:

// 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;

    FOR Idx2 := 0 TO Idx-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
---------------------
das Programm sortiert die Werte der Zellen des Feldes nach ihrer Wertigkeit.
Nach dem Übersetzen steht dann folgender Text unten im Feld:

Übersetzung: SCL-Uebungen-TO\SIMATIC 400(1)\CPU 412-3 H\S7-Programm(5)\Quellen\SCL-Quelle(1)
Baustein: SelctionSort
F: Fehler beim Zugriff auf den Baustein (offline).
Ergebnis: 1 Fehler, 0 Warnung(en)

Ich verstehe nicht was das soll. In meinem OB1 steht CALL "SelectionSort", falls es euch weiterhilft. Ich hoffe man kann mir helfen. 

DAnke und Gruß
tuggi


----------



## Deltal (12 Januar 2011)

Ist der Bausteinname in der Variablentabelle angelegt?

Oder einfach einen FB einfügen und den "SelectionSort" nennen.


----------



## MarkusP210 (12 Januar 2011)

> Ist der Bausteinname in der Variablentabelle angelegt?


 
Ist der Bausteinbezeichner SelectionSort in der *Symboltabelle* angelegt?



> Oder einfach einen FB einfügen und den "SelectionSort" nennen


 
Was bedeutet das?

Markus


----------



## Deltal (12 Januar 2011)

Will man einen SCL Baustein übersetzen und hat nur einen Symbolischen Namen angegeben muss man irgendwo eine Zuweisung FC-Nummer/Name machen. 
Das kann man in der Symboltabelle manuell machen oder mal legt einen neuen FC mit passenden Namen an (dann wird der Eintrag in der Symboltabelle angelegt).

Besser?

Ach und den FC solltest du auch nicht im Kop/Fup Editor geöffnet haben..


----------



## Larry Laffer (12 Januar 2011)

Hallo,
 auf den ersten Blick sehe ich keinen Fehler. Welche Zeile im Script wird dir denn als fehlerhaft markiert ?

Und noch etwas ... hast du nach dem Aufruf im OB1 an den Baustein am "Ret_Val" etwas übergeben (z.B. MW100) ?

Gruß
Larry


----------



## Tuggi (12 Januar 2011)

Larry Laffer schrieb:


> Hallo,
> auf den ersten Blick sehe ich keinen Fehler. Welche Zeile im Script wird dir denn als fehlerhaft markiert ?
> 
> Und noch etwas ... hast du nach dem Aufruf im OB1 an den Baustein am "Ret_Val" etwas übergeben (z.B. MW100) ?
> ...


 

Hallo und danke für eure schnellen Antworten,

Habe keine Variablen- oder Symboltabelle angelegt. Mein SCL-Quellcode also die Funktion heißt ja SelectionSort. Neben dem OB1 habe ich noch einen FC1, wodrin ich die Funktion aufgerufen habe. ANschließend im OB1 habe ich dann den FC1 aufgerufen. 
Also: OB1 steht CALL "SelectionSort" und im FC1 steht ebenfalls CALL "SelectionSort". Ich weiss jetzt nicht ob es doppelt gemoppelt ist. Macht es denn einen Unterschied, wenn ich einen FB benutze? Könnte es daran liegen, dass gar keine reale CPU angesteckt ist?


----------



## Larry Laffer (12 Januar 2011)

... wenn du mich schon zitierst dann solltest du auch auf miene Fragen antworten - wäre jedenfalls hilfreich ...


----------



## Tuggi (12 Januar 2011)

Sorry, weiss jetzt nicht was du damit meinst Baustein Ret_Val

also ich denke mal nicht^^


----------



## Tuggi (12 Januar 2011)

ich habe die übersetzung im SCL-editor durchgeführt

der Fehler denke ich wird in Form eines dicken Balkens angezeigt. Der Balken ist dann über der Funktion

// SCL-Progrm....
BALKEN         <----------- Fehler?
FUNCTION ...


----------



## Tuggi (12 Januar 2011)

MarkusP210 schrieb:


> Ist der Bausteinbezeichner SelectionSort in der *Symboltabelle* angelegt?
> 
> 
> 
> ...


 

ohhh habe vorhin geguckt... die Symboltabelle hatte ich aber vorher nicht erstellt. Jedenfalls steht dort folgendes:
Symbol                  Adresse            Datentyp
SelectionSort          FC   1                FC    1


----------



## Deltal (12 Januar 2011)

Versuche mal:

FUNCTION FC1 : INT


----------



## Tuggi (12 Januar 2011)

Deltal schrieb:


> Versuche mal:
> 
> FUNCTION FC1 : INT


 
habe ich versucht. Jedoch hat sich dabei die Fehlermeldung nicht geändert.

Aber als ich diese Änderung wieder rückgängig machen wollte und die Bausteine mit ihren Aufrufen erneut beschrieben habe, stand dort folgendes unter der Anweisung:

Im FC und OB :
CALL "SelectionSort"
  RET_VAL :=

als Fehler: 
Compiler Information: Leerer Operand.

Ich denke Larry, dass du danach gefragt hattest. Weiss aber nicht was´für ein Wert ich dort eintragen muss.


----------



## Nordischerjung (12 Januar 2011)

Dort kannst du irgend ein freies MW oder DB?.DW?? dran schreiben.
Es steht in dem Word ein Fehlercode in HEX


----------



## Deltal (12 Januar 2011)

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


----------



## Larry Laffer (12 Januar 2011)

Tuggi schrieb:


> Compiler Information: Leerer Operand.
> 
> Ich denke Larry, dass du danach gefragt hattest. Weiss aber nicht was´für ein Wert ich dort eintragen muss.


 
Ja ... das meinte ich.
Das ist der Rückgabewert deines Bausteins, der dann ja irgendwo landen muß. Wenn du keinen Rückgabewert gebraucht hättest, dann hättest du ja beim Aufruf nicht 
	
	



```
FUNCTION SelectionSort : INT

sondern
 
FUNCTION SelectionSort : void
```
... geschrieben.
Der Rückgabewert vom Typ INT kann z.B. in einem Merkerwort (also z.B. MW100) landen.

Gruß
Larry


----------



## Chefmech (12 Januar 2011)

ev. weil da das BEGIN statement nach der VAR-deklaration fehlt?


----------



## dalbi (12 Januar 2011)

Hi,


```
// 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

[COLOR=Red]MAXSIZE := LEN(arrValues); // Bestimmung der Länge des Feldes[/COLOR]

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


----------



## Chefmech (12 Januar 2011)

Die Array-Deklaration 

```
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:

```
arrValues: array[1..5] of INT := 20, 43, 10, 6, 18;
```

weitere Details --> siehe in der Hilfe vom SCL-Editor nach


----------



## dalbi (12 Januar 2011)

Chefmech schrieb:


> ```
> arrValues: array[1..5] of INT := 20, 43, 10, 6, 18;
> ```
> weitere Details --> siehe in der Hilfe vom SCL-Editor nach



Stimmt, so macht das mehr Sinn. 
Aber in einem FC können keine Werte "Anfangswerte" zugewiesen werden.

Gruss Daniel


----------



## Chefmech (12 Januar 2011)

PS:
Vorsicht, in SCL beginnen die Array's nicht generell mit Index 0, wie etwa in C. 


```
arrValues: array[1..5] of INT
```
hat die Indexe 1..5, wenn du auf 0 zugreiffst geht die CPU in die Eisen.


```
arrValues: array[0..4] of INT
```
hat Indexe 0..4


----------



## Tuggi (14 Januar 2011)

Deltal schrieb:


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



dalbi schrieb:


> Hi,
> 
> 
> ```
> ...


 
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?



Chefmech schrieb:


> Die Array-Deklaration
> 
> ```
> arrValues : ARRAY[20,43,10,6,18] OF INT;
> ...


 
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?


----------



## Larry Laffer (14 Januar 2011)

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


----------



## Tuggi (14 Januar 2011)

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


----------



## Larry Laffer (14 Januar 2011)

Larry Laffer schrieb:


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


----------



## Tuggi (14 Januar 2011)

Larry Laffer schrieb:


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


----------



## Tuggi (14 Januar 2011)

Larry Laffer schrieb:


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


 


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ß


----------



## Larry Laffer (14 Januar 2011)

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

Wo stehst du jetzt ...?


----------



## Chefmech (14 Januar 2011)

Tuggi schrieb:


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


----------



## dalbi (15 Januar 2011)

Hi,

Achtung Wild! Erste Variante über Any Pointer.


```
/////////////////////////////////////////////////
// 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


----------



## dalbi (15 Januar 2011)

Hi,

etwas übersichtlicher über einen UDT. 


```
/////////////////////////////////////////////////
// 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


----------



## Tuggi (17 Januar 2011)

dalbi schrieb:


> Nachtrag: Die MAXSIZE könnte man wieder über den ANY ermitteln.
> 
> Gruss Daniel


 

hi,
ich muss zugeben, dass ich es mir viel zu einfach vorgestellt hatte. Ich habe mal deine zweite Variante versucht zu testen, wobei nach der Übersetzung erneut Fehlermeldungen auftraten. Funktioniert das denn bei dir?
Fehlermeldungen:

Baustein: UDT_Values
F: Z 00003 S 00001: Symbolischer Bausteinname: 'UDT_Values' nicht erkannt.
Baustein: Daten
F: Z 00011 S 00001: Symbolischer Bausteinname: 'Daten' nicht erkannt.
Baustein: SelectionSort
F: Z 00022 S 00001: Symbolischer Baustinname: 'SelectionSort' nicht erkannt.
Baustein: OB1
F: Z 00074 S 00009: Der Bezeichner existiert nicht.
F: Z 00074 S 00009: Fehlerhafte Variable, der Punkt ist nicht zulässig.
F: Z 00074 S 00032: Der Baustein SelectionSort konnte nicht gefunden oder kopiert werden.
F: Z 00074 S 00032: Funktion nicht definiert.
F: Z 00074 S 00050: Der Bezeichner existiert nicht.
F: Z 00074 S 00050: Fehlerhafte Vairable, der Punkt ist nicht zulässig.
W: Der Code-Generator wurde wegen eines Fehlers nicht aufgerufen.
Ergebnis 9 Fehler, 1 Warnung(en)


----------



## Tuggi (17 Januar 2011)

Kann es sein, dass ich die Variablendeklarationen aus dem SCL-Programm zusätzlich noch in die Bausteine eintragen muss?

z.B. die Strukturelemente bei UDT aus dem Programm in einem Baustein UDT1 wieder auflisten.


----------



## Zefix (17 Januar 2011)

```
Baustein: UDT_Values
F: Z 00003 S 00001: Symbolischer Bausteinname: 'UDT_Values' nicht erkannt.
Baustein: Daten
F: Z 00011 S 00001: Symbolischer Bausteinname: 'Daten' nicht erkannt.
Baustein: SelectionSort
F: Z 00022 S 00001: Symbolischer Baustinname: 'SelectionSort' nicht erkannt.
```

Diese Bausteine müssen in der Symbolik stehen.
SCL kann nicht einfach den UDT_Values erstellen ohne die UDT Nummer zu wissen. In der Symbolik muss dann in etwa stehen 

UDT1 | UDT_Values 

Wenn diese 3 Bausteine in der Symbolik stehen sollten diese Fehler schon mal weg sein.




```
Baustein: OB1
F: Z 00074 S 00009: Der Bezeichner existiert nicht.
F: Z 00074 S 00009: Fehlerhafte Variable, der Punkt ist nicht zulässig.
F: Z 00074 S 00032: Der Baustein SelectionSort konnte nicht gefunden oder kopiert werden.
F: Z 00074 S 00032: Funktion nicht definiert.
F: Z 00074 S 00050: Der Bezeichner existiert nicht.
F: Z 00074 S 00050: Fehlerhafte Vairable, der Punkt ist nicht zulässig.
W: Der Code-Generator wurde wegen eines Fehlers nicht aufgerufen.
Ergebnis 9 Fehler, 1 Warnung(en)
```
Wenn oberer Teil Fehlerfrei ist, sollte hier nicht viel übrig bleiben.

Wenn Fehlerfrei übersetzt wurde, müssen im Ordner Bausteine die UDT, der DB und die FC stehen.

Schau erstmal dass komplett Fehlerfrei übersetzt wird und du die Abläufe verstehst erst dann schlag dich mit dem Any rum.


----------



## bike (17 Januar 2011)

Also wenn in der Symbolik folgendes als Beispiel steht funktioniert das Kompilieren

UDT_Values     UDT     1    UDT     1    
Daten              DB      1    DB      1    
SelectionSort    FC      1    FC      1    


bike


----------



## Tuggi (17 Januar 2011)

Danke ihr beiden,

jetzt funktioniert das Übersetzen.

0 Fehler :-D

Gruß Tuggi


----------



## dalbi (17 Januar 2011)

Hi,

die einfachste Variante.


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

CONST
  MAXSIZE := 4;
END_CONST

VAR_IN_OUT // Variablendeklaration
  arrValues : ARRAY[0..MAXSIZE] OF INT;
END_VAR

VAR_TEMP
  Idx1, Idx2, MaxIdx, MaxVal : INT;
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
```
Gruss Daniel


----------



## Tuggi (19 Januar 2011)

dalbi schrieb:


> Hi,
> 
> die einfachste Variante.
> 
> ...





 Aha ok, 
dafür müsste ich jetzt nur noch in der Symboltabelle z.B.  einen FC1 als "SelectionSort" benennen. Bei dieser  Variante haben die Zellen aber keinen Inhalt. Was würde denn beim  Beobachten der Variablen angezeigt werden? - Irgendwelche Zahlen?! 

Fehlt bei diesem Quellcode nicht auch noch der Aufruf im OB1 so wie du  das bei deinen anderen Varianten getan hast?

und die letzte Frage  vorerst:  

Was bedeutet die Fehlermeldung "Der  Baustein-Ordner(ONLINE) konnte nicht erreicht werden" ?  

Diese  Fehlermeldung entsteht beim Brillensymbol im SCL Editor, wenn ich also  die Variablen beobachten möchte.         









 

 

 

​


----------



## dalbi (19 Januar 2011)

Hi,



Tuggi schrieb:


> Aha ok,
> dafür müsste ich jetzt nur noch in der Symboltabelle z.B.  einen FC1 als "SelectionSort" benennen. Bei dieser  Variante haben die Zellen aber keinen Inhalt. Was würde denn beim  Beobachten der Variablen angezeigt werden? - Irgendwelche Zahlen?!


 
nein, Du musst natürlich den DB und den Aufruf noch mit reinpacken.
Achtung! Das Array im DB muss exakt dem in Baustein entsprechen.



Tuggi schrieb:


> Fehlt bei diesem Quellcode nicht auch noch der Aufruf im OB1 so wie du  das bei deinen anderen Varianten getan hast?



ja, siehe oben.



Tuggi schrieb:


> Was bedeutet die Fehlermeldung "Der  Baustein-Ordner(ONLINE) konnte nicht erreicht werden" ?



Sind da mehrere Ordner in Deinem Projekt?
Lege die Quelle mal in dem Ordner unter der CPU ab, was passiert da?

Gruss Daniel


----------

