Seltsamer Effekt bei DB Auslesen in einer Schleife

WolfgangP

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

ich habe hier gerade eine Anwendung bei der ich eine Heizungsrückschaltung einer Industrieanlage realisieren muss.

Hintergrund:

In der Anlage sind 20 Heizlasten zwischen 15kW und 66kW vorhanden. Insgesamt darf aber von der Anlage maximal 500kW gezogen werden.
Bestimmte Lasten dürfen zurückgeschaltet werden, andere auf keinen Fall.

Die Heizungsregelung ist bereits vorhanden.

Vorgehensweise:

1. Ich ersetze in der Heizungsregelung die Ausgänge mit Merkern
2. Ich summiere anhand der Merker die aktuelle Anforderung an Leistung der Anlage, entscheide welche Heizungen ich zurückschalte, welche heizen dürfen und gebe das an die Ausgänge entsprechend weiter.

Realisierung:

Ich habe 4 Datenbausteine

DB50 beinhaltet 20x die Pointeradresse der Merker
DB51 beinhaltet 20x die Pointeradresse der Ausgänge
DB52 beinhaltet 20x die jeweilige Heizlast in kW für jeden der 20 Kanäle
DB53 beinhaltet 20x die Information ob ein Kanal rückgeschaltet werden darf oder nicht.

Diese 4 DBs lasse ich im 10s Takt routieren, damit bei der nachfolgenden Schleife jeweils die Verteilung der Kanäle eine andere ist.

In einer Schleife addiere ich die angeforderten Lasten auf, überschreitet die Summe der bisheringen Lasten das Maximum werden nachfolgende Kanäle einfach nicht geschaltet.

Dabei habe ich nun folgenden Effekt.

Ich habe eine lokalvariable namens #index, die ich von 0 bis 19 hochzähle.

Um einen Pointer zu laden gehe ich wie folgt vor:

Code:
 L #index
L 4
*I
SLD 3
LAR 1
AUF DB 50
L [AR1,P#0.0]
T #merker
das funktioniert einwandfrei.

Lade ich allerdings nun das MW mit der Last:
Code:
 L #index
L 2
*I
SLD 3
LAR 1
AUF DB 52
L [AR1,P#0.0]
T #Last
bin ich immer um ein Datenwort nach hinten verschoben, im Vergleich zum Merker der ja als dword vorliegt, die Last liegt als int vor.

Weiß jemand wo mein Denkfehler liegt?

Danke.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok das hätte ich dazusagen sollen :)

bei #index=0 liest er das DB52.DBW2 an. Ich bin draufgekommen weil mir die SPS in Stopp gegangen ist und der effekt erst weg war als ich ein 21. Datenwort angefügt hatte. Dann hab ich gesehen dass immer das nächsthöhere DW gelesen wird. Ich erhöhe aber definitiv den #index nicht.
 
wie wird denn der #index gebildet? wird er definitiv auf null gesetzt? denn DBW2 deutet ja auf eine 1 im index hin, oder? ...denn der code ist so ja in ordnung...
 
Also so, wie der Code dasteht, funktioniert er sowieso nicht. Bei mir mault da der Simatic Manager sofort die Zeilen
Code:
L [AR1,P#0.0]
an.
Vielleicht liegt da der Hase im Pfeffer. Beim Laden des Pointers (DWord breit) passt wohl
Code:
L DBD[AR1,P#0.0]
Bei den Ints hingegen ein
Code:
L DBW[AR1,P#0.0]
Das verschobene Wort würde sich damit auch erklären lassen, wenn immer ein Doppelwort geladen wird.
 
Zurück
Oben