Fehlersuche SCL-Code

Sinix

Level-1
Beiträge
1.588
Reaktionspunkte
216
Zuviel Werbung?
-> Hier kostenlos registrieren
SCL-Anfänger braucht Hilfe bei der Fehlersuche.
Beim Übersetzen tauchen 4 Fehler auf,

1) Ungültiger Datentyp Zeile 22 , i -1 wird nicht akzeptiert
2) Ungültiger Datentyp Zeile 23, i wird nicht akzeptiert
3) Unzulässiger Operantentyp Zeile 28, > 0 wird nicht akzeptiert
4) Ausdruck muss BOOL sein Zeile 28, IF_Bedingung wird nicht akzeptiert
5) DB2.DBWxxx wird nicht symbolisch angezeigt, geht das?

Danke im Vorraus. MK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
der Fehler liegt daran, dass die absoluten DB-Zugriffe nur in der Ur-Datenform passieren. Ein Dbx.DBWy ist immer (auch wenn im DB anders deklariert) ein WORD. Du mußt hier also erst einen WORD_TO_INT machen um rechnen zu können (bzw. umgekehrt aus dem Ergebnis der Berechnung ein INT_TO_WORD).
Du kannst eine Variable eines DB's auch symbolisch erreichen. Dafür mußt du dann nur die symbolische Adresse der Variablen im Script verwenden - in dem Fall kennt das Ding dann auch den Typ der Variablen ... :rolleyes:

Gruß
Larry

Nachsatz:
Das was Dieter schreibt hatte ich gar nicht gesehen - das ist natürlich auch ein dicker "faux pas"
 
Zuletzt bearbeitet:
:sw18: für dbx + eine Runde um den Block zur Strafe und zum Wach werden



So nun sind die 4 Fehler weg, aber dafür zwei neue:

Zahl der ARRAY-Dimensionen wurde überschritten (max. 6), betrifft das DB2.DBB[i,0]. :confused:
 
ok 0 Fehler,
wenn man dbx durch dbb ersetzt, muss man in der Klammer auch das ',0' löschen:D
 
Also ich aus dem Stehgreif würde ich sagen das folgende Anweisung funktionieren sollte:
Code:
   DB3.DBB1 := DB2.DBW0 ;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nächste Frage:

So nun bin ich auf folgendes gestoßen:

Beim einbinden des SFC20 BLOCKMOVE in SCL kann ich wohl nicht mehr so schön P#DBx.DBXx.x Byte 20 an die Eingange schreiben, wie in AWL.

Mit der SuFu finde ich nur Varianten mit aufwendigen Any-Pointerdeklerationen z.B. http://sps-forum.de/showthread.php?t=21582

Gibt es da wirklich keine einfacherer Syntax bei absoluter Adressierung?
Wenn ich mit einer Schleife das ganze Byteweise kopiere gibt es da generelle Nachteile gegenüber dem SFC, z.B längere Zykluszeit?

Danke für Antworten
 
Es darf ja jeder seinen eigenen Stil anwenden, aber ich persönlich bin der Meinung dass absolute Zugriffe nichts mehr in einem SPS-Programm verloren haben - und schon gar nicht in SCL.

Und dann wäre das Kopieren einer Stuktur oder eines ganzen Feldes wieder mit einer Zuweisung erledigt.

Beispiel:
Code:
"DB_Hans".ZielStruct := "DB_Otto".QuellSturct;
' oder
"DB_Hans".ZielFeld := "DB_Otto".QuellFeld;

Im Zweifelsfall kann man mit SCL auch Sichten über eine Variable legen (Stichwort - AT).

PS: bei so einer Zuweisung wandelt der Compiler das ganze sowieso in einen Blockmove
 
Zuletzt bearbeitet:
Naja ...
Es gibt meißtens einen anderen Weg - dafür müßte man natürlich den aktuellen kennen.

Ganz generell : Die Siemens Systemfunktionen sind immer schneller als etwas, dass du dir mit Step7-Befehlen (und SCL wird ja auch zu Step7) zusammenbauen kannst.

Also ... wofür willst du das mit dem Blockmove denn machen ? Was ist der Sinn deines Bausteins ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na ... und wenn ich mich an Aventinus mit dran hänge - es geht auch :
Code:
myZielArray := meinQuellArray ;
Voraussetzung bei diesen Zugriffen ist nur, dass immer Quelle und Ziel identisch aufgebaut sind.
Aber ganz oft braucht man die ganze hin- und herkopiererei gar nicht ...
 
Ok, mal ein bischen mehr Info zur Aufgabenstellung:

von extern werden Zeichenfolgen bzw. Befehle (ASCII) in ein Array of char übertragen. Da diese unterschiedliche Länge haben möchte ich zuerst das Endzeichen suchen, dann die bis dorthin liegenden Zeichen in ein String überführen und diesen Auswerten. Außerdem liegen teilweise hinter einem Befehl noch Parameter, die ebenfalls aus dem char-Array herauszufiltern sind.

Gruß MK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde das ganze Array of Char gleich in den Sting mit maximaler Länge überführen. dann in einer Schleife die Endekennung suchen und mit den IEC-Funktionen (Left, Right, Mid usw.) die einzelnen Teile in extrahieren.
 
Ich würde das ganze Array of Char gleich in den Sting mit maximaler Länge überführen. dann in einer Schleife die Endekennung suchen und mit den IEC-Funktionen (Left, Right, Mid usw.) die einzelnen Teile in extrahieren.

Daran habe ich auch schon gedacht und probiere es jetzt.
 
... wenn du aus deinem Char-Array übrigens vielleicht lieber einen String machen möchtest, so ginge dafür prima der Befehl AT (der auch schon von Aventinus erwähnt wurde) um das "Kopieren" dem SCL zu übergeben ...

Um bestimmte Zeichen in einem String zu finden gibt es dann auch die String-Funktion FIND ...
 
Zurück
Oben