Fehlermeldung bei SCL-Programm

Tuggi

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Ist der Bausteinname in der Variablentabelle angelegt?

Oder einfach einen FB einfügen und den "SelectionSort" nennen.
 
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..
 
Zuletzt bearbeitet:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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


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?
 
:confused: ... wenn du mich schon zitierst dann solltest du auch auf miene Fragen antworten - wäre jedenfalls hilfreich ... :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
Code:
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
 
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

[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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
PS:
Vorsicht, in SCL beginnen die Array's nicht generell mit Index 0, wie etwa in C.

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

Code:
arrValues: array[0..4] of INT
hat Indexe 0..4
 
Zurück
Oben