TIA TIA - Softwarestruktur

Zuviel Werbung?
-> Hier kostenlos registrieren
@zako Oder man nutzt Array mit Index, kann dann aber keine so schönen symbolischen Namen mehr nutzen und hat ein Problem, wenn man den DB wechseln will, weil man z.Bsp. Rezeprgruppen in DB verwaltet. Da fehlt mit irgendwie noch ein ganz kleines Stück, aber villeicht fällt uns noch etwas ein. :)

IndirekterFeldzugriff.jpg

Schaut doch ganz hübsch aus ;).
Wenn man es über mehrdimensionale Arrays macht, dann ist man auch recht flexibel.
 
Aufgrund der späteren Erweiterbarkeit wollen wir aber einfach nicht alles in einem DB mit einem riesigen Array! Wenn man dann später mal erweitern muss, hatt man wahrscheinlich die Bausteinreserve aufgebraucht, und muss den Baustein überschreiben. Das geht bei einer großen Förderanlage einfach nicht! Die kann Ich nicht einfach so mal leerfahren!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn man dann später mal erweitern muss, hatt man wahrscheinlich die Bausteinreserve aufgebraucht, und muss den Baustein überschreiben.

Dachte bei der 1500 gehen die Werte beim überschreiben nicht mehr verloren bzw. bleiben sicher erhalten.....

Geht das eigentlich alles in die Richtung keine DB mehr zu verwenden? Beckhoff bzw. Codesys etc. kennen ja auch keine Datenbausteine ala Siemens? :confused:
 
Zuletzt bearbeitet:
Dachte bei der 1500 gehen die Werte beim überschreiben nicht mehr verloren bzw. bleiben sicher erhalten.....

Geht das eigentlich alles in die Richtung keine DB mehr zu verwenden? Beckhoff bzw. Codesys etc. kennen ja auch keine Datenbausteine ala Siemens? :confused:

ja, aber nur wenn man die bausteinreserve gross genug macht, d.h dann kannst du auch gleich einfach 100dert weitere array elmente anlegen... und ab und an kommts dann trotzdem vor das tia meint der db wäre inkosistent...
 
Wenns fürs indirekte db öffnen nichts gibt, dann bleib ich erstmal bei awl und indirekter adressierung, nur das ich die adressen einzelner elemente per any pointer adressiere, mal schaun wie perfomant das auf ner 1500er läuft! nur das debuggen ist halt beschissen, da man die adress und db register nicht mehr beim beobachten sieht...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenns fürs indirekte db öffnen nichts gibt, dann bleib ich erstmal bei awl und indirekter adressierung, nur das ich die adressen einzelner elemente per any pointer adressiere, mal schaun wie perfomant das auf ner 1500er läuft! nur das debuggen ist halt beschissen, da man die adress und db register nicht mehr beim beobachten sieht...
Da wäre ein Vergleich mit der Variante wie von Siemens vorgeschlagen interessant, bei dem jedes mal der komplette Datensatz kopiert wird.

Also z.B. ein UDT von 512 Bytes Größe. In einer Schleife soll auf eine Anzahl x (z.B. 100) unstrukturierte Instanzen dieser UDT auf ein Element wie ein Integer zugegriffen werden.

Bei Variante a) wird wie von Siemens vorgeschlagen mit einer Funktion gearbeitet welche bei jeder Instanz kompletten UDT auf eine lokale Instanz umkopiert.

Variante b) benutzt "nicht optimierte" DBs mit AWL und indirekter Adressierung wie es bei S7-Classic möglich war.
 
Da wäre ein Vergleich mit der Variante wie von Siemens vorgeschlagen interessant, bei dem jedes mal der komplette Datensatz kopiert wird.

Also z.B. ein UDT von 512 Bytes Größe. In einer Schleife soll auf eine Anzahl x (z.B. 100) unstrukturierte Instanzen dieser UDT auf ein Element wie ein Integer zugegriffen werden.

Bei Variante a) wird wie von Siemens vorgeschlagen mit einer Funktion gearbeitet welche bei jeder Instanz kompletten UDT auf eine lokale Instanz umkopiert.

Variante b) benutzt "nicht optimierte" DBs mit AWL und indirekter Adressierung wie es bei S7-Classic möglich war.

ich probier da mal ein bischen rum und poste dann etwas über das zeitverhalten!

problem ist, ich hab nur ne 1518 zur hand und daher kein plan wies später mit kleinen cpus aussieht!
 
Hi all

S. hat keine Möglichkeit für uns optimierte Datenbausteine so flexibel zu verwenden wie es mit ANY, AUF DI, AR2 und AWL bei standard Datenbausteinen geht.
-- Ärger --

Ich habe mich schon ein paar mal mit Variant versucht. Und mit den neuen Funktionen VariantPut und VariantGet kann man einiges von dem was mit ANY, AUF DI, AR2 und AWL geht auch in SCL, FUP und KOP bei Optimierten machen.
Das ist manchmal schneller als mit AR2, wenn die Strukturen klein sind und manchmal langsamer, wenn die Strukturen groß sind.
Jetzt kommt es drauf an wieviel des Programms mit diesen seltsamen Zeigern arbeitet.

Ein Variant an der Schnittstelle ist eine Referenz, an kann ihn versorgen womit immer man will. D.h. da wird nix kopiert. Das ist schnell. Die beiden Variant-Funktionen kopieren die Daten aber dann doch in eine lokale Variable, die genau den Typen haben muss, mit dem man 4 Aufrufe drüber den Variant versorgt hat. :-(

Bei dem einen Altprogramm aus Step7 V5 Zeiten das ich hatte, konnte ich die Kopieraktion an vier Stellen bündeln. D.h. 99% des Programms arbeiten mit der Kopie und 1% arbeitet mit den Orginaldaten in verschiedenen DB. Das Programm läuft jetzt auf einer 1516. Es hat in der migrierten AWL-ANY-Version 136ms Zykluszeit. In der nachgearbeiteten SCL-FUP-Variant-Version hat es eine Zykluszeit von 44ms. Aus der 319 hatte es eien Zykluszeit von ein bischen über 200ms.

Bei einem anderen Altprogramm werden auf einer großen Struktur in den verschiedensten Bausteine Zugriffe gemacht. AWL-ANY benötigt zwischen 85 und 95ms. Die nachgearbeitet Version hat 24 VariantGet und 6 VariantPut und braucht 140ms. Mist.

Dann gibt es noch einen Trick, der aber auch nicht wirklich weit kommt. Es gibt sogenannte ArrayDB. Das sind DB, die aus einem Array of UDT bestehen. Auf diese kann man mit ReadFromArrayDB und WriteToArrayDB zugreifen. Der DB wird mittels eines Inputs von Typ ANY_DB ausgewählt und dann gibt man noch einen index für den Zugriff auf das Array mit.

Um genau das zu bekommen, was Jochen machen will kann man nun folgendes machen. Man erzeugt sich viele ArrayDB of myUDT. Wobei aber immer nur ein Element im Array ist. Dann macht man sich in einem DB ein Array of ANY_DB. Und in einem anderen DB egt man sich einen myUDT an. Dann kann man in einer Funktion mittels Index aus dem Array den DB auswählen und erhält mittel ReadFromArrayDB( db := ArrayOfANY_DB[ index ], index := 0, dest => "Arbeitskopie".myUDTvar ) eine Kopie des Inhalt aus dem Array DB. Die Gegenrichtung klappt ganz ähnlich. Es ist auch nicht nötig myUDTvar in einem andern Db zu haben, geht auch in der Temp.

Alles in allem ein rechter Krampf, aber jetzt hat man eine Multiplexer der optimierten Inhalt über die DB-Nummer, denn nichts andres ist im ANY_DB, auswählt.
Nachteil 1: Jeder ANY_DB hat einen Overhead von 48 Byte. Für kleine Strukturen ist eine Struktur pro ArrayDB sehr unwirtschaftlich. Aber man kann ja dann 100 davon reinlegen.
Nachteil 2: Die Funktionen kopieren die Daten, d.h. für große Strukturen wird es wieder unwirtschaftlich.
Nachteil 3: Wie bekommt man die DB-Namen in das Array of DB_ANY. Bisher klappt das nur über die DB-Nummer ... Was soll das?

Es ist zum aus der Haut fahren. Man erkennt die Ansätze, aber irgenwie ist das alles unfertig. Es fehlen die Möglichkeit einen Variant im DB zu speichern und auf den Variant ohne eine Kopie zuzugreifen.

Was die 1516 allerdings deutlich schneller kann als die 319 ist der Zugriff auf viele DB. Eines meiner migrierten Programme greift in einem FC auf viele DB zu, 36 DB werden verwendet. Der Baustein besteht im wesentlichen aus AUF DBa, L b, AUF DBc, T d. Zykluszeit auf der 319 33 ms. Davon die Hälfte in dieser unsäglichen Kopierorgie. Das bekommt man raus, wenn man mal den einen Call per M-Bit überspringt. Da läuft das Programm zwar nicht mehr richtig, aber der Rest verbrät immernoh die gleiche Zeit. Zykluszeit auf der 1516 16 ms, das Kopieren verbraucht irgendwie nur 1ms oder sogar weniger.


'n schön' Tach auch
HB
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das hört sich ja alles sehr kompliziert an...
Bei diesem Variant Parametertypen sehe ich noch als Nachteil, dass es bei der Beschaltung des Aufrufs keine Typprüfung gibt.

Wenn ich mir was wünschen durfte, dann einen Datentypen wie:
data : reference to myUDT;

Pointerarithmetik oder sonstige Zaubereien sind nicht erlaubt. Damit hätte man eine Typsicherheit, und könnte mindestens 10 halbgare Funktionen aus dem Befehlsatz entfernen.
 
Das laufende umkopieren ist ja auch nicht wirklich eine Lösung für mich, dadurch wird die Wahrscheinlichkeit das meine Visu irgendwelche Bits im DB korrigieren kann immer geringer.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde auch sagen das mit der case-schleife sicher nicht das schlechteste (Laufzeit) ein wenig Tipparbeit, wir bewegen uns nunmal zwischen den Welten.

Will ja nicht besser wissend rüber kommen aber nur zu deiner Info und falls du mal mit jemand drüber redest: Die CASE Anweisung ist keine Schleife sonder eine Verzweigung / Fallunterscheidung.

Grüße Pico
 
und ich vermute mal es gibt auch bei Siemens welche die sagen das war der falsche weg, wir hätten lieber gleich Codesys kaufen sollen.

... das würde ja keine Vorteile bringen. Leute die mit CODESYS arbeiten haben ja mit SIMOTION die entsprechende Alternative. Der SIMOTION SCOUT ist ja auch im TIA Portal integriert.
Die Frage ist hier, warum macht man mit Datenbausteinen weiter und nicht wie bei SIMOTION / CODESYS z.B. auf globale/lokale Variablen.
Es gibt wohl viele Anwender die diese DB- Denkweise verinnerlicht haben und das weiterhin fordern. Das schließt ja nicht aus, dass das auch noch kommt. Aber mit den optimierten Bausteinen bekommt man halt noch einen Performancehub.
 
@Jochen,
wie ist es eigentlich wenn du deine Information nicht auf
einen Baustein begrenzt, sondern auf mehrer Datenbausteine
verteilst. So könntest du mir einen Indexzeiger auf die gewünschte
Information zeigen. Kommt jetzt eine Station dazu erweiterst du
alle Datenbausteine um einen neuen Index bzw Eintrag.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Jochen,
wie ist es eigentlich wenn du deine Information nicht auf
einen Baustein begrenzt, sondern auf mehrer Datenbausteine
verteilst. So könntest du mir einen Indexzeiger auf die gewünschte
Information zeigen. Kommt jetzt eine Station dazu erweiterst du
alle Datenbausteine um einen neuen Index bzw Eintrag.

Finde Ich nicht besser! Da ich dann trotzdem im Programm nur mit einem aindex arbeite, und nicht mit einem Namen. Im Moment hat ja mein Platz ein symbolischen namen, der dem Platznamen entspricht, wenn der nun nur noch eine Zahl ist wird ja mein programm nicht übersichtlicher sondern schwierieger verständlich, und ich will ja durch neuerungen keine verkomplizierung!
 
Finde Ich nicht besser! Da ich dann trotzdem im Programm nur mit einem aindex arbeite, und nicht mit einem Namen. Im Moment hat ja mein Platz ein symbolischen namen, der dem Platznamen entspricht, wenn der nun nur noch eine Zahl ist wird ja mein programm nicht übersichtlicher sondern schwierieger verständlich, und ich will ja durch neuerungen keine verkomplizierung!

Ich bin auch gerade dabei mein Programm von der Classic nach TIA zu migrieren. Ich habe an einigen Stellen auch von wiederholenden symbolisch benannten Strukturen auf Arrays gewechselt, um statt mit Any-Pointer über den Laufindex eine Schleife über alle Elemente bei optimierten Bausteinen verwenden zu können.

Da die symbolischen Namen bei mir auch eine wichtige Bedeutung haben, habe ich mir dafür Anwenderkonstanten angelegt. Ich habe für das Array eine PLC-Variablentabelle angelegt und dort von 1 bis n jeweils eine Anwenderkonstant definiert. Im Programm kann ich dann mit Hilfe der Konstanten auf die einzelnen Elemente des Arrays zugreifen, ohne mir merken zu müssen, welche Position, Platz (o.a.) welchem Index im Array zugeordnet ist.
 
Zurück
Oben