TIA Dynamische symbolische Adressierung

Zuviel Werbung?
-> Hier kostenlos registrieren
Halte ich jetzt mal für mindestens grenzwertig bis falsch.

Beispiel1: Ein Bit in einem DB (optimiert) belegt ein Byte (Laut Hersteller: Siemens).
Beispeil2: Der Speicher wird Zugriffoptimiert verwaltet Bytes zusammen Worte zusammen ... (Laut Hersteller: Siemens).

Da gibt's sogar entsprechende Doku zu.

Die SPS wird etwas anders verwaltet als PC's...
Mit Programm start sind hier die Adressen und Speicherbereiche eindeutig bekannt! Zur Laufzeit kommt es so nicht zuunvorhergesehenen Engpässen.
Ich würde es nicht als gänzlich falsch bezeichnen, den hier zitierten Text aber auch nicht.
Es passt nur leider nicht so richtig mit dem Prinzip aud Aufbau einer SPS übereinander.
Aktuelle S7-1500er arbeiten mit einem 32-Bit Prozessor.

Bei dem Beispiel wird davon ausgegangen das ein Emulator hinter dem Code steht der zur Laufzeit alles umrechnen muss. Dem ist bei der SPS nicht so. Beim Übersetzen werden in den Projektdateien maschinenoptimierte Daten erzeugt die geladen werden. Diese werden beim Übersetzen so umsortiert das die CPU mit einem Maschinenbefehl z.B. einen REAL-Wert lesen kann. Wäre das ganze nicht symbolisch sondern direkt, dann könnte das ungünstig aussehen und eventuell sogar verdreht sein. Also könnten 2 Befehle notwendig sein plus das manuelle Drehen der Worte. Das kostet Zeit.
Damit das nicht geschieht gibt es die Smybolik die vor dem Laden alles "richtig" umsortiert sodass die CPU nur einen Maschinenbefehl einsetzen muss. Der Nachteil aber ist, das man im Programm selbst nicht weiß an genau welcher Stelle das nun sortiert wird. Das bleibt das Geheimnis von Siemens, mehr oder weniger. Also ist eine direkte Adressierung nicht möglich.


Zeiger:
Es wurde oben beschrieben das es das alles mal gab, dann hat Siemens es eingestampft um dann über Umwege doch wieder zu ermöglichen.
Vielleicht sollte man einfach mal den Gedanken folgen das es früher eben so war das man mit nahen "Maschinenbefehlen" (AWL) gearbeitet hat, aufgrund von Speichermangel sehr häufig platzsparend programmieren musste, aber heute mit wesentlich komplexeren Programmen gearbeitet wird die natürlich viel besser dokumentiert sein müssen und es einfach genug Speicherplatz gibt. Desweiteren werden auch immer mehr "Hochsprachen" vereinfacht. Das ist also nicht nur in der SPS so. Wer nicht mag das es alles "leichter" wird, der sollte überdenken warum dem so ist das er es nicht mag.

Die Tatsache das Siemens beschreibt wie es über Umwege doch wieder möglich ist liegt vielleicht ja auch an nichts anderem als das es so viele Einwände und Fragen gab wie es nun gemacht werden könnte, es für Siemens günstiger war einfach mal ne FAQ zu schreiben statt es jedem einzeln zu erklären.

Aus meiner persönlichen Meinung sehe ich in keinem einzigen meiner Anwendungsfälle (Fördertechniken, Sondermaschinen, Lüftungs- und Lackieranlagen) die Notwendigkeit das SPS-Programm mit nicht optimierten Bausteinen zu erstellen. Ich bin sogar davon überzeugt das es mir Unmengen an Arbeit erspart, auch später bei der Fehlersuche.
Zeiger auf verschiedene DBs benötige ich nicht. Wenn ich eine Anlage mit verschiedenen Positionen habe, dann erstelle ich wie ich oben schon geschrieben habe einen FB der jeweils mit einem anderen IDB und anderen Eingangsparametern aufgerufen wird. Das ist übersichtlicher, da ich direkt zu jeder Zeit sehen kann was exakt wo passiert. Sobald die DBs aber durchgehend wechseln weil ich Zeiger nutze und zufällig alle 2 Sekunden ein anderer DB aufgerufen wird, dann wird die Fehlersuche schnell zur Qual und das Programm muss eventuell sogar im Haltebetrieb überprüft werden. Also steht die Produktionskette.
Die einzige Krücke die ich aktuell sehe sind die Bitmeldungen in den Basic-Panels. Die sind für mich wirklich nervig, auch wenn ich meinen Weg gefunden habe die sehr komfortabel zu erstellen und zu nutzen.
 
Dein SPS Programm wird aber nicht in nativen Maschinencode übersetzt. Das wird in einen Bytecode für eine virtuelle Maschine (ähnlich Java VM) erzeugt welches dann in einer Sandbox im SPS Betriebssystem läuft. Darum sind alle Überlegungen bezügl. Optimierungen von Speicherzugriffen und sonstigen Codeoptimierungen hinfällig, weil alles von der Siemens Implementierung der VM abhängt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Tatsache das Siemens beschreibt wie es über Umwege doch wieder möglich ist liegt vielleicht ja auch an nichts anderem als das es so viele Einwände und Fragen gab wie es nun gemacht werden könnte, es für Siemens günstiger war einfach mal ne FAQ zu schreiben statt es jedem einzeln zu erklären.

Siemens beschreibt es ja nicht nur, sondern sie bauen diese Funktionen erst ein. Dieser Ref-To Zeiger ist beispielsweise mit TIA 15 erst gekommen, der DB_ANY afaik auch erst zu der Zeit.

Ansonsten hast du schon recht, je weniger Zeiger umso wartbarer sind die Programme auch.
 
Dein SPS Programm wird aber nicht in nativen Maschinencode übersetzt. Das wird in einen Bytecode für eine virtuelle Maschine (ähnlich Java VM) erzeugt welches dann in einer Sandbox im SPS Betriebssystem läuft. Darum sind alle Überlegungen bezügl. Optimierungen von Speicherzugriffen und sonstigen Codeoptimierungen hinfällig, weil alles von der Siemens Implementierung der VM abhängt.
Nee, nativ nicht, davon geh ich in keinster Weise aus. Es wird nur optimiert statt stumpf 1:1 übernommen. Aber die Überlegungen sind nicht hinfällig sondern sind von Siemens dokumentiert.

Siemens beschreibt es ja nicht nur, sondern sie bauen diese Funktionen erst ein. Dieser Ref-To Zeiger ist beispielsweise mit TIA 15 erst gekommen, der DB_ANY afaik auch erst zu der Zeit.

Ansonsten hast du schon recht, je weniger Zeiger umso wartbarer sind die Programme auch.
Wenn man nun bedenkt das erst keine Möglichkeiten mehr existieren und später hinzugefügt werden könnte man schon davon ausgehen das genügend Anfragen da waren.
Ich mein, das die das ursprünglich vergessen haben glaube ich mal nicht, aber wer weiß das schon.
 
Halte ich jetzt mal für mindestens grenzwertig bis falsch.

Beispiel1: Ein Bit in einem DB (optimiert) belegt ein Byte (Laut Hersteller: Siemens).
Beispeil2: Der Speicher wird Zugriffoptimiert verwaltet Bytes zusammen Worte zusammen ... (Laut Hersteller: Siemens).

Da gibt's sogar entsprechende Doku zu.

Die SPS wird etwas anders verwaltet als PC's...
Mit Programm start sind hier die Adressen und Speicherbereiche eindeutig bekannt! Zur Laufzeit kommt es so nicht zuunvorhergesehenen Engpässen.
Das ist richtig. Mein Beispiel war auch eher abstrakt, d.h. man sollte die Idee hinter der Optimierung erkennen. Dann ist die kleinste adressierbare Einheit eben 1 byte. Ich mach das mal richtig in meinem Beitrag. (Ich kann es leider nicht mehr ändern - Dann bleibt es halt falsch stehen). Aber danke für den Hinweis.

Das mit den Bytes zusammen und Worte zusammen (also Daten gleichen Typs zusammen) ist nicht aus meiner Erklärung ersichtlich gewesen?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Dein SPS Programm wird aber nicht in nativen Maschinencode übersetzt. Das wird in einen Bytecode für eine virtuelle Maschine (ähnlich Java VM) erzeugt welches dann in einer Sandbox im SPS Betriebssystem läuft. Darum sind alle Überlegungen bezügl. Optimierungen von Speicherzugriffen und sonstigen Codeoptimierungen hinfällig, weil alles von der Siemens Implementierung der VM abhängt.
Meinst du den MC7 bzw. MC7+ Code? Wie genau der code interpretiert oder zur Laufzeit optimiert wird, ist in der Tat unbekannt. Aber ich vermute mal, dass das interpretieren/zur Laufzeit optimieren schneller geht, je ähnlicher der code dem prozessor-spezifischem Maschinencode ist.
 
Zuletzt bearbeitet:
Um jetzt mit dem enthaltenen Daten zu arbeiten, kann man einfach den Variant dereferenzieren:
VariantGet(SRC:=#myVariant,
DST=>#myValues);

So holst du dir die in dem DB gespeicherten Werte und speichest sie in myVariant. Um jetzt in den Positionen einen Eintrag zu suchen und dann an eine NC oder so weiterzugeben, reicht das ja. Um direkt im PositionenDB zu arbeiten, kannst du dir eine Referenz auf den DB holen, in dem Stil:
#myReference ?= #myVariant;
#myReference^.pos2 := 0815;

Der myRefence dann im Temp der Bausteinschnittstelle deklarieren als REF_TO "PosDB"

Ich hab ein Problem:
In meinem Pos-DB hab ich ein
Code:
Array[1..x] of UDT
wobei die Länge dieses Arrays unterschiedlich ist...
 
Eine S7 SPS kann kein Array zur Laufzeit erstellen. Evtl müsstest du das Maximum angeben und nur die gewünschten Arrays danach verwenden, die weiteren ignorieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aaah, du meinst in jedem Positions-DB mal z.B. 64 Positionen definieren, davon benutze ich aber zum Beispiel nur zwischen 5 (für den kleinsten Bereich) und 52 (für den grössten Bereich)?

Ja, das könnte klappen...

Ich werde definitiv meinem Chef für das nächste Projekt eine "Monolith"-Struktur vorschlagen, also alle Positionen in einem DB...


Edit: Hmm, nächstes Problem. Ich habe jetzt mittels #tempPosArray^[#i].PosNr nach meiner Position gesucht und diese gefunden. Kann ich jetzt die Referenz auf diese Position als Bausteinausgang rausgeben, so dass ich andernorts dann mit dieser Position arbeiten kann? Wenn ich
Code:
VAR_OUT
    oRefToPos    :    REF_TO "Position";
END_VAR;

VAR
    tempPosArray:    REF_TO Array[1.."C_MAX_ANZ_POS_IN_DB"] of "Position"
END_VAR;

BEGIN_BLOCK
    #oRefToPos := REF(#tempPosArray^[#i]);
END_BLOCK
versuche, dann geht das nicht, da ich ja bereits dereferenziert habe. Aber ich will ja eine Referenz auf eine Position erstellen, welche ein Unterelement meiner anderen Referenz ist.
 
Zuletzt bearbeitet:
Schau Dir mal dieses Beispiel https://www.sps-forum.de/threads/alternierungsbaustein-beliebig-vieler-pumpen.99730/#post-750801 an.
Dort wird u.a. ein Array unbestimmter Größe übergeben und dann dessen Größe bestimmt und entsprechend abgearbeitet.
Auch bei der Uebergabe mit Array[*] steht zur Laufzeit stets fest, welche Laenge das uebergebene Array hat. Weil das Array das man uebergibt ja definiert ist. Die Funktion taugt dafuer, einen allroundbaustein zu schreiben, den man ohne Anpassung immer wieder an verschiedenen Maschinen einsetzen kann, aber fuer wirkliche dynamische Arrays muesste man die zur Laufzeit erstellen oder redimensionieren koennen.
Wirkliche dynamische Arrays sind AFAIK bei S7 nicht moeglich. Vermutlich aus guten Grund, denn da holt man sich so allerlei Speicherfehler.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die verschiedenen Positions-DB müssen aber nicht zwingend die gleiche Array-Größe bei den Array of udt haben, wenn man sie dann mit dem gleichen Baustein verarbeiten möchte.

Mein Beitrag bezog sich vor allem darauf:
In meinem Pos-DB hab ich ein
Code:
Array[1..x] of UDT
wobei die Länge dieses Arrays unterschiedlich ist...
Evtl müsstest du das Maximum angeben und nur die gewünschten Arrays danach verwenden, die weiteren ignorieren.
Aaah, du meinst in jedem Positions-DB mal z.B. 64 Positionen definieren, davon benutze ich aber zum Beispiel nur zwischen 5 (für den kleinsten Bereich) und 52 (für den grössten Bereich)?
Man kann also durchaus den jeweiligen DB an den jeweiligen Bereich spezifisch anpassen.
 
Zuletzt bearbeitet:
Die verschiedenen Positions-DB müssen aber nicht zwingend die gleiche Array-Größe bei den Array of udt haben, wenn man sie dann mit dem gleichen Baustein verarbeiten möchte.

Mein Beitrag bezog sich vor allem darauf:
Man kann also durchaus den jeweiligen DB an den jeweiligen Bereich spezifisch anpassen.

Ja, das habe ich auch gemacht.
Okay, ich rekapituliere: ich habe 2 Arrays, eines davon in einem Index-DB, meinem "Telefonbuch". Darin sind alle Bereiche aufgeführt, jeweils mit der ersten und letzten Positionsnummer pro Bereich sowie der Nummer des DBs, in welchem die Positionen zu finden sind. Mit Schievels grandiosem Ansatz kontne ich jetzt über eine Referenz meine DB-Nummer umwandeln und greife jetzt auf meinen DB zu, in welchem meine Positionen sind (ob das funktioniert muss ich noch testen). Hierbei arbeite ich mit einem Variablen Array, das heisst mir ist egal wie gross das Array im Index-DB ist. Nun habe ich also über DB-Any und Variant einen Variant, der auf meinen DB zeigt. Pro Bereich habe ich einen Positions-DB, in welchem in einem Array jeweils alle Positionen aufgeführt sind.
  • DB1201: Array[1..7] of "Position"
  • DB1202: Array[1..34] of "Position"
  • DB1203: Array[1..11] of "Position"
  • DB1204: Array[1..3] of "Position"
Wenn ich nun also meinen Variant auf eine Referenz legen will, dann muss ich bei dieser Referenz ja definieren "REF_TO Array[x..y] of UDT", in diesem Fall "REF_TO Array[1..x] of "Position""
Bei einer Referenz kann ich kein Array mit Variablen Arraygrenzen angeben. Da hab ich also schon mal Pech.
Nun habe ich also alle DB auf "Array[1..64] of "Position"" angepasst, wobei die obere Arraygrenze über eine globale Konstante definiert ist.
Damit kann ich nun Arbeiten und mit einer FOR-Schlaufe über das referenzierte Array iterieren und meine Position suchen.
Nun habe ich (hoffentlich) meine Position gefunden und möchte nun am Bausteinausgang die Referenz auf diese eine Position, aslo "REF_TO "Position"" ausgeben.

Wie mache ich das jetzt?
 

Anhänge

  • BeispielReferenz.zip
    285,7 KB · Aufrufe: 4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab ich nicht getestet und ist grad nur ein Schuss ins blaue zu später Stunde: afaik sind doch UDTs als In/Out Variablen bei FB Call by Reference. könnte man da nicht einfach dereferenzieren und dann das UDT am
In/out ausgeben?
 
Theoretisch schon. Aber dann müsste ich immer am Anfang und am Ende des Bausteins, wo ich die Position brauche, die Funktion nochmals aufrufen, damit nach der Bearbeitung die Daten wieder zurückgelegt werden. Mit ner Referenz fänd ich's halt "schöner".
 
Da faellt mir jetzt nur noch ein, dass man die Referenz auf das ganze Array ausgibt und die index-Variable dazu und man dann damit weiter arbeiten kann. Aber die Idee hattest du sicher auch schon.
Wuerde mich mal interessieren, was der Siemens Support dazu sagt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Interessanterweise wird nur das Caret-Zeichen rot markiert. Als Text erhalte ich "Der referenzierte Operand ist im Abschnitt 'Dynamic' nicht zulässig."

Im Internet findet sich nichts zu dieser Meldung...
 
Zurück
Oben