Step 7 Dynamischer Datenbaustein

TimeOUT

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

ist es möglich einen Datenbaustein dynamisch zur Laufzeit zu erweitern, bzw. verkleinern?

Hintergrund ist folgender:
Ich bekomme über einen Zeitraum eine zufällige Anzahl an Telegrammen rein, die ich alle zwischenspeichern möchte, damit der Anwender sich diese später anschauen kann.
Dabei kann die Anzahl der eintreffenden Telegramme von 1 bis 10 variieren.

Ich weiss ich könnte auch direkt einen DB mit bis zu 10 "Speicherbereichen" für die Telegramme erstellen, aber evtl. gibt es ja euch eine elegantere Lösung.

Habe etwas vom SFC22 (Create_DB) gelesen, war mir aber nicht sicher ob das, das richtige ist.

Gruß
timeout
 
Hallo,
im Prinzip kannst du das natürlich machen (gemacht habe ich so etwas aber noch nie) - bei deiner Anwendung aber nach meiner Meinung schon wieder nicht. In dem Moment, wo du das z.B. 9.Telegramm reinbekommst muss es den Speicherplatz dafür ja schon geben. Darüber hinaus müßtest du deinen DB-Inhalt ja dann auch irgendwohin sichern, damit du den DB löschen um ihn neu (in anderer Größe) erzeugen zu können. Nun die gesicherten Daten da rein und die neuen da hinzu.

Ich würde da dann doch zu der Variante des vordefinierten DB greifen - da "sparst" du m.E. an der falschen Stelle ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
eine dynamische Erweiterung eines DBs ist während der Laufzeit nicht möglich! Ich habe für ein "Hochschulprojekt" mal den Weg gewählt einen DB dyn. zu löschen und anschließend mit einer anderen Länge wieder anzulegen. In der Praxis würde ich so ein Vorgehen aber nicht empfehlen.
==> Mein Tipp: Erstelle dir ein DB mit 10 "Speicherbereichen" ;-)
 
Alles klar!

Vielen Dank für die Tipps

/edit:

Ich habe jetzt mal einen DB700 erstellt, in dem ich eine Struktur angelegt habe, die mir das Telegramm zwischenspeichert.

Jetzt versuche ich mit einem ANY-Pointer und BLKMOV die eintreffenden Telegramme in den DB zu kopieren. Aber anscheinend ist meine Notation des Pointers nicht ganz korrekt.
Ich habe mich an diversen Beiträgen im Forum mal orientiert:

-Data_Pointer im FB als ANY in temp angelegt

Code:
LAR1 P##Data_Pointer
L W#16#1002
T LW [AR1, P#0.0]
L #Length_IN
T LW [AR1, P#2.0]
L 700
T LW [AR1, P#4.0]
L 0
SLD 3
OD DW#16#84000000
T LW [AR1, P#6.0]

CALL "BLKMOV"
SRCBLK := #InData1
RET_VAL := #RetVal_SFC20
DSTBLK := #Data_Pointer

Ich nehme an das ihm was mit Laden der Anfangsadresse nicht passt.

Gruß
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich frage mich in welcher Konstellation es nötig oder sinnvoll sein könnte einen DB aus dem Programm heraus während der Laufzeit zu erzeugen. Man spart ja überhaupt nichts. Die Software die man runterläd ist so gross wie sie ja nunmal ist. Es macht also keinen Sinn Platz zu sparen. Und wenn der Platz vorhanden ist, kann man ja diesen gleich für einen SpeicherDB nutzen, wenn er nicht vorhanden ist, nützt es ja auch nichts wenn die Software einen DB generieren kann, denn der Platz ist ja eh nicht da.
Und man hat auch keine Vorteile wenn ungenutzter Platz vorhanden ist, oder?

mfG René
 
Vorallem such da mal einen Fehler. Wenn ein DB ständig neu erzeugt wird.
Halte ich für keine gute Idee.
Ich habe die Funktion mal genutzt, um Parameterdaten zu sichern, bevor der eigentliche Parameter DB neu runtergeladen wurde.
War ein mords Fuck bis das sauber gelaufen ist.
 
Code:
LAR1  P##Data_Pointer
      L     W#16#1002
      T     LW [AR1,P#0.0]
      L     #Length_IN
      T     LW [AR1,P#2.0]
      L     W#16#700
      T     LW [AR1,P#4.0]
      L     0
      SLD   3
      T     LD [AR1,P#6.0]
      L     B#16#84
      T     LB [AR1,P#6.0]

      CALL  "BLKMOV"
       SRCBLK :=#InData
       RET_VAL:=#RetVal_SFC20
       DSTBLK :=#Data_Pointer

Scheint nicht zu funktionieren..
Wenn ich über Laden und transferieren gehe schreibt er sie mir in den DB700, nur irgendwie will der Pointer einfach nicht.
Er soll mir ab Adresse 0.0 anfangen in den Baustein zu schreiben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Scheint nicht zu funktionieren..
Dann scheint wohl irgendwas falsch zu sein..



:roll:



Mal konkreter werden: Was sagt der RET_VAL der SFC20? Was sagt der Diagnosepuffer der CPU ;)?
Woher kommt #InData, was steht da drin?

Wenn Du nicht sicher bist, ob Du den/die ANY-Pointer richtig erzeugst, dann versuche den SFC20 zunächst mit fest angegebenen Adressen, z.B.
Code:
      CALL  "BLKMOV"
       SRCBLK :=P#DB123.DBX 0.0 BYTE 10
       RET_VAL:=#RetVal_SFC20
       DSTBLK :=P#DB700.DBX 0.0 BYTE 10
Wenn das funktioniert, dann ersetze die festen Adressen durch ANY-Pointer.

Ändere mal so:
Code:
      LAR1  P##Data_Pointer
      L     W#16#1002
      T     LW [AR1,P#0.0]
      L     #Length_IN
      T     LW [AR1,P#2.0]
[COLOR="#FF0000"]      L     700[/COLOR]
      T     LW [AR1,P#4.0]
[COLOR="#FF0000"]      L     P#DBX0.0[/COLOR]
      T     LD [AR1,P#6.0]

      CALL  "BLKMOV"
       SRCBLK :=#InData
       RET_VAL:=#RetVal_SFC20
       DSTBLK :=#Data_Pointer

Zeilenkommentare wären auch nicht verkehrt, besonders wenn man nicht weiß was der geschriebene Code tut. ;)

Harald
 
BOING!

Ich Depp hatte in die Variable für den DB = B#16#700 anstatt den 700 HExwert eingetragen :rolleyes:
Habe noch ein paar Änderungen vorgenommen und jetzt geht es auf jedenfall ;)

/Edit:
Um nochmal auf meine ursprüngliche Frage zurückzukommen.
Ich habe ja jetzt einen festen DB erstellt in den er mir meine InData reinschreibt. Das funktioniert auch ohne Probleme.
Wie ich bis jetzt gelesen habe ist es sehr aufwendig einen DB zur LAufzeit zu erzeugen.

Kann ich meinen DB700 wie eine Art "Muster" benutzen?
In ihm befinden sich für jedes Telegramm eine separate Struktur (also: Telegramm1, Telegramm2, usw.)
Ist es möglich, dass er mir mit jedem übertragenem Telegramm eine neue Struktur in diesem DB erstellt, nach dem gleichen aufbau wie der vorangegangenen Telegramme?

Die telegramme sind ähnlich wie Messwerte die auch über einen Zeitraum irgendwo gespeichert werden müssen.
 
Zuletzt bearbeitet:
Du kannst dir einen UDT anlegen mit deiner Struktur für das Telegramm.
Diesen UDT kannst du zb 10 mal in deinem DB anlegen.
Dann hast du Speicherplatz für 10 Telegramme.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

super, das geht auf jedenfall schon mal in die Richung die ich mir vorgestellt habe.

Allerdings habe ich jetzt 10 Telegrammstrukturen fest in meinem DB. Wenn ich jetzt nur ein Telegramm erhalte sind die restlichen 9 quasi überflüssig.
Ist es hier möglich zur Laufzeit mir immer eine neue Telegrammstruktur im DB anzulegen von meinem UDT, wenn ein neues Telegramm eintrifft?

Sprich (Im DB am anfang):
Telegramm1 UDT700 Telegramm#1

*es kommt noch ein Telegramm rein*

Telegramm2 UDT700 Telegramm#2 (wird autom. erstellt und darin gespeichert)

Gruß
 
Wie schon weiter oben beschrieben ist es vollkommen egal wenn die 9 restlichen Speicherplätze überflüssig sind.
Das dynamische anfordern eines Speichers (wie zB in C mit malloc) ist in einer SPS nicht möglich und auch nicht sinnvoll da es ja nicht mehrere Prozesse gibt die auf einen großen Speicher zugreifen.

Du musst dir eben überlegen wie viele Telegramme du speichern willst/musst.
Ist dein Speicher zu klein dann musst du dir eine andere CPU zulegen.
 
Zurück
Oben