Step 7 Probleme beim indirekten Auslesen eines Arrays

svgr90

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin liebe Kollegen,

ich will ein Array über indirekte Adressierung auslesen, finde jedoch nicht den Fehler, warum dieser mir nicht die Werte ausliest. Vielleicht kann mir hier jemand helfen.
Ich will mir bei einen bestimmten Druck, die richtigen Werte aus dem Datenbaustein holen. Leider habe ich noch nicht so viel Erfahrung mit indirekter Adressierung und bin gerade dabei das zu verstehen.

Danke.

2025-09-10_11h59_27.png2025-09-10_12h00_51.png
 
An dem Code ist erstmal nichts falsch ... was für Werte liest du denn ein ? Welchen Wert hat Index ?
Andere Frage : warum machst du das in AWL ? In SCL hättest du jetzt gar kein Problem ...

Edit : Harald hat Recht - das habe ich übersehen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da fehlt nur noch ein "* 8" (SLD 3), weil Pointer nicht Byte-Adressen (P#DBBn) sondern Bit-Adressen (P#DBXn.n) adressieren.

Code:
L #Index
+ -1
SLD 5    //SLD 2 (ist * 4 wegen REAL) + SLD 3 (* 8 für Bitadresse)
LAR1

AUF DB ...
L DBD [AR1, P#32.0] //aus rho_tab[]
T #rho

L DBD [AR1, P#60.0] //aus h_tab[]
T #h
 
Super, vielen Dank. Jetzt klappt alles.

Der Index beläuft sich auf 7 und hat konstante Werte. Ich will damit die Wärmeleistung berechnen, indem ich mir Rho und h aus einer Tabelle hole. SCL beherrsche ich leider "noch" nicht, deswegen konnte ich das nicht darüber machen.
 
Der Index beläuft sich auf 7 und hat konstante Werte.
:unsure: Du meinst, der Wert des #Index ist immer 7?

Dann bräuchtest du keine indirekte Adressierung, sondern könntest direkt aus den betreffenden Variablen kopieren:
Code:
L "HeatData".rho_tab[7]  // DB1712.DBD56
T #rho

L "HeatData".h_tab[7]    // DB1712.DBD84
T #h

oder nimm eine MOVE-Box in KOP/FUP
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Super, vielen Dank. Jetzt klappt alles.

Der Index beläuft sich auf 7 und hat konstante Werte. Ich will damit die Wärmeleistung berechnen, indem ich mir Rho und h aus einer Tabelle hole. SCL beherrsche ich leider "noch" nicht, deswegen konnte ich das nicht darüber machen.
Mit ChatGPT oder dem Microsoft Copilot kommt man da schnell zu etwas Funktionierendem und hilft beim Einstieg.
 
:unsure: Du meinst, der Wert des #Index ist immer 7?

Dann bräuchtest du keine indirekte Adressierung, sondern könntest direkt aus den betreffenden Variablen kopieren:
Code:
L "HeatData".rho_tab[7]  // DB1712.DBD56
T #rho

L "HeatData".h_tab[7]    // DB1712.DBD84
T #h

oder nimm eine MOVE-Box in KOP/FUP
Da habe ich mich wohl etwas doll falsch ausgedrückt.😅 Je nach Druck, den ich mir von einem Sensor hole, soll er den passenden Index wählen und dann die Berechnung ausführen.
Mit ChatGPT oder dem Microsoft Copilot kommt man da schnell zu etwas Funktionierendem und hilft beim Einstieg.
Du wirst lachen, der Code den ich hier am Anfang gepostet habe, ist von CHatGPT. Ich habe ihm auch mehrmals mit Informationen gefüttert, jedoch hat er mir immer das gleiche gegeben und hier fehlte leider etwas Wissen, um den Code zu korrigieren. ;)
 
Du wirst lachen, der Code den ich hier am Anfang gepostet habe, ist von CHatGPT. Ich habe ihm auch mehrmals mit Informationen gefüttert, jedoch hat er mir immer das gleiche gegeben und hier fehlte leider etwas Wissen, um den Code zu korrigieren. ;)

Bei SCL funktioniert es sogar sehr gut, wichtig halt immer korrigieren und neue Informationen dazu rückmelden.
Bei AWL funktioniert das nur schlecht. S7 Classic ist da auch so ein Ding und für TIA ist es besser.
Hilft jedenfalls mal mit grundsätzliche Ansätze für alternative Lösungen, wenn man einmal den Wald vor lauter Bäume nicht mehr sieht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du wirst lachen, der Code den ich hier am Anfang gepostet habe, ist von CHatGPT.;)
Tja, die KI verstehen ja nicht wirklich, was sie da so antworten. Sie können nur berechnen, welche Buzzwords in der Antwort vorkommen müssen. Ob die Antwort irgendeinen Sinn macht oder sogar funktioniert, dass "wissen" sie nicht. Sie sind nur viel schneller als ein Mensch, um unheimlich überzeugend klingende Antworten von sich zu geben. Man muss aber schon noch schlauer als die KI sein, um deren Antworten bewerten und verwenden zu können, bzw. schon um die richtig formulierten Fragen ("Prompt") zu stellen.

SCL "beherrschst" du zwar auch noch nicht, doch hättest du die KI explizit nach einer Lösung in SCL gefragt, dann wäre wahrscheinlich sogar eine funktionierende Antwort gekommen.
Für welche SPS hast du ChatGPT denn eigentlich gefragt?

finde jedoch nicht den Fehler, warum dieser mir nicht die Werte ausliest.
Bei dem Fehler müsste die CPU detailliert einen Programmierfehler gemeldet haben (im Diagnosepuffer) und vielleicht sogar in STOP gegangen sein. Das hast du uns gegenüber leider nicht erwähnt. Hättest du das mitgeteilt, dann wäre vermutlich sofort von uns der richtige Hinweis gekommen, dass da noch ein "SLD 3 " fehlt.
 
Moin svgr90,

Da habe ich mich wohl etwas doll falsch ausgedrückt.😅 Je nach Druck, den ich mir von einem Sensor hole, soll er den passenden Index wählen und dann die Berechnung ausführen.

Was ich verstehe ist:
Der Druck (Bsp. 0-100 bar) soll bei in Bereiche aufgeteilt werden und, je nach Bereich, einen bestimmten Index ausgeben, um auf entsprechende Berechnungsparameter zuzugreifen.
Wenn es die Indizes 0..7 gibt und die Druckbereiche linear ausgewertet werden sollen, kann man einfach skalieren:

Index := (8/101) * Druck;

Wobei man natürlich beachten muss, dass man mit Datentypen rechnet (z.B. Real oder andere Einheiten), damit man die Dezimalstellen berücksichtigen kann.

Wenn es nichtlinear ist, muss man sich die entsprechende Funktion heranziehen und umrechnen.

Man kann auch stufig segmentieren und einfach mit '>' arbeiten. Also, wenn Druckwert > 0, dann Index 0, wenn größer 12, dann Index 1, ...
Dabei ist der Vorteil, dass man die Schaltpunkte individuell einstellen kann.

ABER:
Für eine Lösung braucht man mehr Informationen.


EDIT: ich hatte mich nur auf #7 bezogen, aber die Berechnung für den Index scheint es ja schon zu geben?
 
Zurück
Oben