TIA TIA V15 SCL Operand DD ist nicht definiert.

Mario Larski

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

bin neu in Sachen SCL.

Habe das Problem das beim übersetzen eines SCL Programms 2 Fehler bzgl. Definition von Operanden auftauchen und ich nicht verstehe warum.

Es soll ein Tankstand in Litern dargestellt/umgerechnet werden.
Möchte anhand des Standes in mm/cm einfach die Werte aus einer Peiltabelle darstellen.

Im Anhang ein Screenshot vom SCL und DB.

Schon mal vielen Dank.
 

Anhänge

  • SCL.JPG
    SCL.JPG
    177,9 KB · Aufrufe: 82
  • DB.JPG
    DB.JPG
    157,8 KB · Aufrufe: 66
Zuviel Werbung?
-> Hier kostenlos registrieren
Dein Problem ist nicht nur das 2x DD...

Hast Du da Code von Step7 classic zu TIA migriert? (Wo hast Du den Code her?)
Für welche CPU soll der Code sein?

1) In Step7 classic kann man mit DD (DB-Doppelword DBD) auf Speicheradressen in einem DB indiziert zugreifen, z.B. DD[4] meint das DBD4. In TIA geht das nicht so. Da musst Du vermutlich die Anweisung PEEK verwenden (das geht aber nur bei DB, wo die Variablen auch Adressen (einen Offset) haben).

2) Die Werte in Deinem DB sind INT (16 Bit = 2 Byte). Du rechnest aber die Adressen (Offset im DB) als wären die Werte DINT (32 Bit = 4 Byte).

3) Den Sinn Deiner FOR-Schleife verstehe ich nicht. Müsstest Du da nicht einen Wert in der Tabelle suchen, der >= Deinem #Niveau_in_cm ist? Also Werte aus der Tabelle lesen? Dein Code liest in der FOR-Schleife gar nicht aus der Tabelle. Oder entspricht der Index in die Tabelle den cm? Dann brauchst Du keine FOR-Schleife.
Warum hat Deine Tabelle keinen Wert bei 0 cm? Besser Du fügst noch einen 0-cm-Wert am Anfang (Offset 0.0) ein, anstatt aufwendig im Code eine Sonderbehandlung bei 0 cm zu programmieren.

Ich habe gerade kein TIA greifbar und weiß nicht die Parameter von PEEK, doch der Code für das Lesen aus Deiner Peiltabelle (plus 0-Wert) müsste etwa so aussehen:
Code:
#iNiveau_in_cm := REAL_TO_INT(#Niveau_in_mm / 10.0);  //#iNiveau_in_cm ist ein Int in Temp

#iNiveau_in_cm := LIMIT(MN := 0, IN := #iNiveau_in_cm, MX := #Anzahl_Peilpunkte - 1); //(Anzahl Peilpunkte ist inkl. Wert bei 0 cm)

#iOffset := #iNiveau_in_cm * 2;  //Adresse für Tabelle mit INT-Werten, erster Wert für 0 cm

#Stand_Aktuell := PEEK(16#84, #DB_Peiltabelle, #iOffset); //PEEK Syntax?

IF #iNiveau_in_cm = #Anzahl_Peilpunkte - 1 THEN
    #Stand_Naechster := #Stand_Aktuell;
ELSE
    #Stand_Naechster := PEEK(16#84, #DB_Peiltabelle, #iOffset + 2); //PEEK Syntax?
END_IF;

#Differenz := ...
4) Muß Dein Programmcode wirklich mit Peiltabellen mit unterschiedlicher Anzahl Peilpunkte klarkommen? Besser wäre es wenn Du ein Array an den Baustein übergibst, dann müsstest Du keine Adressen ausrechnen sondern könntest schön symbolisch adressieren und der Code würde auch mit "optimierten" DB funktionieren. Ich vermute, für das lineare Interpolieren aus Tabellen mit Arrays (mit Werte-Paaren) gibt es auch für TIA schon fertige Bausteine (LGF_...?)

PS: sehe ich das richtig, daß die Variablen in Deinem DB Zahlen als Name haben? :confused: Gewöhne Dir so einen Scheixx gar nicht erst an - in "seriösen" Programmiersprachen dürfen Variablennamen keine Zahlen sein. Nimm anstatt 1, 2, 3 ... besser Namen wie Wert_1, Wert_2, Wert_3 ... Das ist nicht wirklich mehr Schreibaufwand, nach dem Wert_1 schreibt ja TIA die weiteren Namen für Dich. (Oder nimm besser ein Array)

Harald
 
Erstmal Dank für deine schnelle und ausführliche Antwort.

Der Code kommt von einem Kollegen aus der S7 Classic Welt und läuft auf einer S7315-2DP.
Wollte nun diesen Code als Beispiel nehmen, um mich in SCL ein wenig einzuarbeiten.
Zuhause nutze ich eine S7315-2DP aber projektiert mit TIA, an der ich den Code übernehmen wollte.

1.) Die Anweisung PEEK habe ich mit der CPU im TIA leider nicht zur Verfügung.
2.) Hatte gestern rumprobiert und vergessen das wieder abzuändern.
3.) Sucht die FOR Schleife nicht die grobe Zahl in in cm in der Peiltabelle ?
4.) Denke das wäre eine schöne Sache da es dann nicht nur für diesen sondern auch für weitere Tanke Anwendung finden könnte. Werde mal versuchen, dass mit einem Array aufzubauen.

Habe einfach die Peiltabelle aus Excel kopiert und mir keine Gedanken darüber gemacht. Danke für den Tipp.
 
Der Code kommt von einem Kollegen aus der S7 Classic Welt und läuft auf einer S7315-2DP.
Warum verwendest Du nicht den Code vom Kollege, wenn der schon funktioniert? Du kannst den Code in TIA migrieren.

3.) Sucht die FOR Schleife nicht die grobe Zahl in in cm in der Peiltabelle ?
Nein, in Deiner FOR-Schleife wird lediglich der Schleifenzähler #Tankstand_Zaehler solange um 1 erhöht bis er > #Niveau_in_cm ist. Dafür braucht man keine Schleife. Kann es sein, daß Dir die Mathematik hinter der Interpolation mit einer Peiltabelle nicht klar ist und deshalb auch nicht programmieren kannst?

Du musst Dich entscheiden, ob Deine Peiltabelle "Stützpunkte" als Werte-Paare (jeweils cm + Liter) enthält, oder nur die Liter-Werte und den Eingangswert cm als Index. Für die Interpolation mit Wertepaaren gibt es fertige Bausteine für Step7 classic SCL z.B. von OSCAT die LINEAR_INT und POLYNOM_INT.

Es wäre hilfreich, wenn Du Deinen Code oder den Code des Kollegen hier als Quelltext postest oder als Textdatei anhängst, weil für Programm-Korrekturen ist es ziemlich aufwendig, Deinen Code von Deinem Bild abzutippen.

Du könntest auch versuchen, ob Du für Deine Werte eine Näherungsformel verwenden kannst. Dazu Deine Werte in Excel eingeben, als Diagramm darstellen und schauen ob sich eine passende Trendlinie/Trendformel finden läßt. Oder Du postest hier die Werte, dann könnten wir das für Dich versuchen.

Harald
 
Ich wurde Haralds Vorschlag nehmen - eine genauere Niveauwert durch Interpolation berechnen.
Dazu wurde ich aber auch sofort von die arkaische Verfahren mit Ganzzahlen mit implizite Dezimalpunktverschiebung ins Fliesskommazahlen wechseln.

Stammt das Programm ursprünglich von ein S5-Programm ? Dass mit den Verwärtszähler und kein Interpolation erinnert mich von S5, genauer die Kleine CPUs die fast kein Mathematik konnte. Dann musste man mit solche Tricks spielen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stammt das Programm ursprünglich von ein S5-Programm ? Dass mit den Verwärtszähler und kein Interpolation erinnert mich von S5, genauer die Kleine CPUs die fast kein Mathematik konnte. Dann musste man mit solche Tricks spielen.
Es gab bei S5 CPUs, die in der Tat eine sehr sparsame Auswahl an Befehlen hatten, aber dann gab es für alles Mögliche die entsprechenden Standard-FBs, so dass man trotzdem z.B. multiplizieren und dividieren konnte, ohne dass man etwas selbst stricken musste.
Ich verstehe aber nicht, woran Du denkst, wenn Du von "solche Tricks" sprichst. Ich finde die Stelle gar nicht, wo der Trick "durchschimmert". Meinst Du, einmal eine Division eingespart, um dann anschliessend umso heftiger zu dividieren?
Ich vermute eher, dass die Routine ursprünglich für eine 2-spaltige Tabelle ausgetüftelt und dann später (gedankenlos) auf eine 1-spaltige reduziert ("vereinfacht") wurde, was auch den DatenTyp INT als Relikt bei den DDs erklären könnte?
 
Es gab bei S5 CPUs, die in der Tat eine sehr sparsame Auswahl an Befehlen hatten, aber dann gab es für alles Mögliche die entsprechenden Standard-FBs, so dass man trotzdem z.B. multiplizieren und dividieren konnte, ohne dass man etwas selbst stricken musste.
Ich erinnere diese Standard-FBs sehr wohl. Bei S5-100U Reihe kostete diese Standard-FBs millisekunden, nicht microsekunden. Dann musste man den Asuführung von solche Bausteine auf den Zeitpunkt verzögern wo es die Maschinenzykluszet am wenigstens beeinflusste. Oder andere kreative Lösungen finden. Und das war für Ganzzahlaritmetik. Sprich nicht von Fliesskommaaritmetik. Achja, die 'gute' alte Zeiten.
 
Ich vermute eher, dass die Routine ursprünglich für eine 2-spaltige Tabelle ausgetüftelt und dann später (gedankenlos) auf eine 1-spaltige reduziert ("vereinfacht") wurde
Das vermute ich auch.


Bei CPU 315-2DP gibt es PEEK nicht, es muß mit DB/DW/DD(Adresse) adressiert werden, in TIA allerdings nicht mit eckigen Klammern sondern mit runden Klammern (weil ja nicht ein Array-Element adressiert wird sondern aus einer Zahl eine Adresse gemacht wird). Siehe TIA Hilfe "Indirektes Adressieren von Datenbausteinen (S7-300, S7-400)"
Code:
#Wert := #DB_Peiltabelle.DD(#Offset);

Harald
 
Zurück
Oben