Saia PCD - DBs in Saia AWL

Schetter

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

Ich programmiere normalerweise Simatic S7 und habe jetzt etwas auf einer Saia PCD zu tun. Ich habe hier das Problem, dass das eigentliche AWL-Programm von einem automatischen Tool generiert wird. Bitte fragt nicht warum - historische Sache.

Nun kann dieses Tool - aus gutem Grund - nur eine gewisse Anzahl an Lines of Code. In dem AWL-Programm befinden sich DB-Definitionen. Eine Unmenge davon. Ich habe 901 Lines of Code (LOC) nur voll mit:

DB 4000 [10]
DB 4001 [10]
DB 4002 [10]...
...
DB 4899 [10]
DB 4900 [10]

Ich habe also einen erheblichen Teil meiner LOC nur mit diesen Definitionen "verschwendet". Nun weiss ich nicht ob man da nicht vielleicht indexiert irgendeine Scheife laufen lassen könnte um die LOC zu reduzieren.

Bitte beachten: Ich habe kein Speicherproblem oder ähnlichers. Es geht wirklich "nur" um die schiere anzahl an LOC, die durch diese DB-Zeilen unnätig (?) aufgebläht wird.

Danke,
lG,
Schetter
 
Zuletzt bearbeitet:
Hallo nochmals!

Kann man nicht die 901 Zeilen mit:

DB 4000 [10]
DB 4001 [10]
...
DB 4899 [10]
DB 4900 [10]

gefahrlos durch

DB 4000 [9010]

ersetzen?

Später greift der Block ohnhin nur via DB 4000 und Index auf dieses Feld zu.

Ich vertehe die Idee des Autors hinter den verschiednen Zeilen nicht - vielleicht gibt es ja einen Grund den ich nicht kenne. Hat irgendjemand eine Idee?

Danke,
Schetter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Bitte beachten: Ich habe kein Speicherproblem oder ähnlichers. Es geht wirklich "nur" um die schiere anzahl an LOC, die durch diese DB-Zeilen unnätig (?) aufgebläht wird.

Was genau machst du denn mit diesen DB Zeilen? Kopierfunktionien oder ähnliches?

Grundsätzlich kannst du durch 4000 [9010] ersetzen. Aber natürlich nur wenn du wirklich ab 4000 indexiert zugreifst und nicht dann irgendwo wieder 4010 [10] auftaucht.

Du könntest es auch einfach mal ausprobieren. Oder hier einen Auszug aus dem Programm posten.

mfG René
 
Danke!

Also die eigentliche Stelle wo die Daten geschrieben werden sieht so aus:

ACC H
SEI = 66

PUTX DummyR30
DB 4000

ACC H
INC = 66 ; DummyCoun Counter


Es wird also nur auf DB 4000 zugegriffen.

Das ganz dient zur temporären Speicherung von Daten. Es gibt 10 Datenkanäle, welche in DummyR30 .. DummyR39 liegen.
Ich nehme an, der obere Aufruf funktioniert nur, weil DB 4000 eben so defineirt ist:
DB 4000 [10] und somit genau 10 Werte hinein geschrieben werden können.

Wenn ich das nächste Mal zu dieser Stelle komme und der Index in "= 66" erhöht wurde, dann würde ich wohl auf DB4001 zugreifen und es werden wieder 10 Werte gepeichert (von den angrenzenden Registern DummyR30 .. Dummy R39).

Mit dieser Überlegung kiomme ich dazu, dass ich nicht einfach DB 4000 [9010] schreiben kann, oder?

Dann bleibt wohl nur mehr die ganzen DB-Definitionen in einer Schleife aufzurufen. Ist es möglich so etwas wie:

DB R1000 [10]

zu defineiren und R1000 einfach von 4000 bis 4900 Laufen zu lassen?

Das müsste doch die LOC erheblich reduzieren - falls möglich.

Danke,
Schetter
 
Der Code verwirrt mich jetzt gerade etwas. Ich muss aber anmerken das ich bis jetzt noch nicht grossartig mit DBs gearbeitet habe.

Aber dein programm macht ja nix anders als das dummyregister (und die 9 darauffolgenden) in den db 4000 zu kopieren.

Was dann passiert ist fraglich da irgendwie keinerlei vernünftiger code.

Die Operation INC incrementiert irgendwas. Ein = 66 kann man eigentlich nicht incrementieren.

Wenn man den Index incrementieren will geht das mit:
INI K 99 oder R 100 oder sowas. Auf jedenfall muss man ihm den Indexendwert angeben.

Die Initialisation des Indexregisters passiert ebenfalls mit einer konstante oder einem Register aber = 0 (oder 66) kann funktionieren entspricht aber nicht der Saia Konvention.

Also ich nehme jetzt mal an dass das Programm funktioniert halt auf sehr unkonventionelle Art und Weise.

Ich sehe jetzt aber keine Möglichkeit da was einzusparen wenn du 10 Register in einen DB schreiben willst. Putx adressiert eigentlich das Register + indexzähler. dazu müsste man den Indexzähler aber mit RSI neu bewerten (10 mal mehr nicht nur ein Increment da ansonsten im nächsten DB einfach das nächste Register plus die darauffolgenden bis DB gefüllt kopiert wird).

Ich weiss etwas kompliziert geschrieben.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, wir sind uns hier ziemlich einig. Auch mich verwirrt der Code :).

Wie gesagt beschäftige ich mich üblicherweise mit Siemens SPSen. Das SAIA-Problem ist "Vergangheitsbewältigung". Aber gut.

Also dieses "= 66" scheint irgendein Parameter zu sein welcher bei der Verwendung des Funktionsblocks initialiesiert wird. Und an der Stelle 66 steht eben der akutelle Index der in das Indexregiseter geladen wird, dann inkrementiert (und nicht in meinem Ausschnitt) später wieder an die Stelle = 66 zurückgeschrieben wird. Ich habe das heute das erste MMal gesehen, aber ich stelle mir diese = 66-Dinger einfach als Veriablen vor. Ich denke das ist nicht sooo verkehrt - zumindest so wie sie hier angewendet werden.
Es gibt dort auch noch einen Vergleich auf 900 und der korrespondiert mit den 901 DBs die definiert werden. Wenn ich nun einfach ein DB mit 9010 Stellen definiere, dann speichert mir der Code dort nicht immer nur die Register DummyR30 bis DummyR39 sondern noch viel mehr bis in Regionen nach DummyR39 wo schon garnichts mehr defineirt ist => schlecht. Ich kann also die 901 Definitionen nicht umgehen.

Jetzt will ich die Definitionen in einer Schleife machen, habe aber keine Ahnung ob das funktioniert. Bin schon gespannt...

Danke,
Schetter
 
Also die Definition kannst du ganz bestimmt nicht indexieren, da lässt sich garnix einsparen.
Du könntest dir allenfalls die Definition komplett ersparen wenn du mit Put X Registerarrys kopierst.
Wenn ich mich recht entsinne wird wenn man den DB nicht definiert einfach einer in der grösse der benötigten Datenmenge erstellt.

Also so

Code:
AM1:        SEI    K 0
AM2:        PutX   DummyR[10]
                   DB 4000
            JR     H AQ1
            INI    K 900
            JR     H AM2
AQ1:

DummyR muss dann aber als Array eingerichtet sein von der entsprechenden Anzahl Elementen dann zählt der Index bis zum DB4900 hoch mit je 10 Elementen pro DB.

mfG René
 
Cool, danke.

Mit dieser Information (dass der DB mit der benötigen Grösse angelegt wird sobald ich darauf schreibe) habe ich ja nun tatsächlich 2 Möglichkeiten:

1. Einfach mit einer Schleife ähnlich deiner die DBs anlegen und füllen wie gehabt.

2. Die DBs wärend des Füllens anlegen lassen.

Ich muss eben ein wenig aufpassen, dass die DummyRs dann ein Array sind (damit der Code "weiß" wieviele werte er kopieren soll, da ja die Defintion fehlt). Aber ich denke that's it.

Vielen herzlichen Dank,

Schetter
 
Zurück
Oben