Arbeiten mit Array

slma

Level-1
Beiträge
82
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

soll in einem globalen DB ein Array anlegen, dessen Größe von der Anzahl der Anlagen abhängt.
Das Array soll auf UDT1 zugreifen und von dort die Daten nehmen.
Wie schreibe ich wenn ich darauf zugreifen will mit Lade/Transferiere Befehl??
Weiters soll es die Werte weiterschieben, damit die nächste Anlage am selben Platz speichern kann, ohne dass ich Daten verliere!
Hoffe es ist verständlich formuliert!

Danke
 
also m.W. ist es in S7 bis jetzt nicht möglich, dynamischen Speicher zu allokieren. Du könntest allenfalls ein Array anlegen, dass immer groß genug ist und dann halt nur einen Teil davon nutzen, also die aktuelle Größe <= Maximalgröße.

aha, geht doch mit CREATE_DB
 
Zuletzt bearbeitet:
also m.W. ist es in S7 bis jetzt nicht möglich, dynamischen Speicher zu allokieren. Du könntest allenfalls ein Array anlegen, dass immer groß genug ist und dann halt nur einen Teil davon nutzen, also die aktuelle Größe <= Maximalgröße.


Es gibt einen SFB Create_DB und Delete_DB. Damit kann man so etwas lösen, falls er das so meinte.

pt
 
ok das ist schonmal gut! danke! Aber beim Array schreibe ich ja ARRAY[1..8]OFUDT...mein Baustein in dem alle Variablen sind ist aber UDT1...oder verwechsle ich da was??

wie sehen eigentlich die Aufrufe für andere datentypen aus?
Ich kenne nur

L DB1.DBW2 //Wort laden
L DB1.DBD2 // DWORD laden

was gibt es da noch so? habe nirgendwo infos darüber gefunden.


Und wie kann ich die werte weiterschieben um danach auf der selben Adresse zu speichern?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ok das ist schonmal gut! danke! Aber beim Array schreibe ich ja ARRAY[1..8]OFUDT...mein Baustein in dem alle Variablen sind ist aber UDT1...oder verwechsle ich da was??

wie sehen eigentlich die Aufrufe für andere datentypen aus?
Ich kenne nur

L DB1.DBW2 //Wort laden
L DB1.DBD2 // DWORD laden

was gibt es da noch so? habe nirgendwo infos darüber gefunden.


Und wie kann ich die werte weiterschieben um danach auf der selben Adresse zu speichern?

Ich würde das mit dem SFC 20 lösen!
Da kannst du dir dann über einen dynamischen AnyPointer die größe der Bereiche die du kopieren willst Adressieren.

godi
 
jawohl danke!
bleibt nur mehr eine frage:

wie sehen eigentlich die Aufrufe für andere datentypen aus?
Ich kenne nur

L DB1.DBW2 //Wort laden
L DB1.DBD2 // DWORD laden
L DB1.DBB2 // BYTE laden

was gibt es da noch so? habe nirgendwo infos darüber gefunden!

danke schonmal!
 
Code:
 L     "DB_Betriebsdaten".Daten_Aktuell.Datum     // L     DB100.DBW   10
 L     "DB_Betriebsdaten".Daten_Aktuell.Zeit      // L     DB100.DBD   12
 L     "DB_Betriebsdaten".Daten_Aktuell.BSTD1     // L     DB100.DBD   16
Datentypen wie z.Bsp. String oder Date_and_Time (zusammengestzte Datentypen) kann man nicht komplett mit Ladebefehlen umkopieren. Man kann sie als IN/OUT/INOUT an FC/FB antragen. Man kann sie Byte-/Word-/Doppelwortweise oder mit dem SFC20 (Blk_Move) umkopieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
mehr lade und transferbefehle gibt es nicht.
mehr als ein dword kannst du nicht direkt tranferieren/adressieren.

für 'datenblöcke' die mehr als 4byte haben nimmst du entweder die sfc20 oder nimmst einfach mehrere einzeltransfers.

z.b. date_and_time das sind 6byte.
entweder mit sfc20 und angabe der anfangsadresse
q: P#DB1.DBX 0.0 BYTE 6
z: P#DB2.DBX 10.0 BYTE 6
oder so
l db1.dbd0
t db2.dbd10
l db1.dbw4
t db2.dbw14

nochmal zu verständnis.
ein udt enthält nur die struktur wie dein db später aussehen wird.

edit: warum bin ich heute eigentlich so langsam mit dem schreiben ??? :ROFLMAO:
 
mehr lade und transferbefehle gibt es nicht.
mehr als ein dword kannst du nicht direkt tranferieren/adressieren.

für 'datenblöcke' die mehr als 4byte haben nimmst du entweder die sfc20 oder nimmst einfach mehrere einzeltransfers.

z.b. date_and_time das sind 6byte.
entweder mit sfc20 und angabe der anfangsadresse
q: P#DB1.DBX 0.0 BYTE 6
z: P#DB2.DBX 10.0 BYTE 6
oder so
l db1.dbd0
t db2.dbd10
l db1.dbw4
t db2.dbw14

nochmal zu verständnis.
ein udt enthält nur die struktur wie dein db später aussehen wird.

edit: warum bin ich heute eigentlich so langsam mit dem schreiben ??? :ROFLMAO:

ok danke vielmals!

Dann ist mir noch unklar wie ich in Kalles Beispielprogramm auf die Variable Zeit zugreifen, z.B. mit einem Ladebefehl??
Könnte mir da jemand den AWL-Code posten mit der richtigen Adresse (wie in seinem Programm vorgegeben) ??

Noch eine letzte frage:
Wenn ich eine Variable im DB als BOOL definiere, kann ich auf dieses einzelne Bit zugreifen? Wenn ja, wie sieht da der Ladebefehl aus (mit Beispielwerten) ?

mfg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
U DB100.DBX20.3 <-- Datenbaustein 100, Datenwort 20, Bit 3
= M 100.0

Pylades

OK das ist schonmal hilfreich...
bezieht sich aber leider nicht auf das Bsp. von Kalle wo die Werte im DB100 "Ringpuffer" Array sind, dieses Array ist verbunden mit UDT1 und aus diesem UDT möchte ich ein Bit/Byte/Word/Dword laden.

wie sieht dann die Adressierung aus??

mfg
 
OK das ist schonmal hilfreich...
bezieht sich aber leider nicht auf das Bsp. von Kalle wo die Werte im DB100 "Ringpuffer" Array sind, dieses Array ist verbunden mit UDT1 und aus diesem UDT möchte ich ein Bit/Byte/Word/Dword laden.

wie sieht dann die Adressierung aus??

mfg

Aus einem UDT kann man nichts laden, weil der UTD nur die Struktur vorgibt:

TYPE UDT 100
VERSION : 1.0


STRUCT
Datum : DATE ;
Zeit : TIME ;
BSTD1 : DINT ;
BSTD2 : DINT ;
BSTD3 : DINT ;
GesZ : DINT ;
END_STRUCT ;
END_TYPE
Und hier:

L "DB_Betriebsdaten".Daten_Aktuell.Datum // L DB100.DBW 10
L "DB_Betriebsdaten".Daten_Aktuell.Zeit // L DB100.DBD 12
L "DB_Betriebsdaten".Daten_Aktuell.BSTD1 // L DB100.DBD 16
hat Ralle schon geschrieben wie auf Word und DWord zugegriffen wird.
Bit und Byte sind in der Struktur nicht enthalten.

Pylades
 
Aus einem UDT kann man nichts laden, weil der UTD nur die Struktur vorgibt:

Und hier:

hat Ralle schon geschrieben wie auf Word und DWord zugegriffen wird.
Bit und Byte sind in der Struktur nicht enthalten.

Pylades

he das ist sehr gut! DANKE!!! hat mir wirklich geholfen!

Aber eine Frage habe ich trotzdem noch...Ich möchte die daten_aktuell sagen wir in das Ringpuffer-Array schreiben. Wie führe ich diese Anweisung durch? Wie muss das Array definiert sein? als ARRAY OF UDT oder nur ARRAY ? die größe bei mir wäre [1..40]...
Muss ich hier beachten dass daten_aktuell 6 Einträge hat oder muss ich dazu keine Angabe machen?

Wäre toll wenn ihr mir noch einmal helfen könntet!!!
 
Daten_Aktuell und Ringpuffer haben ja die gleiche Struktur, deshalb
als ARRAY OF UDT 100 deklarieren. Um die Anzahl der Einträge brauchst Du Dir dann keinen Kopf mehr machen.

Das eintragen der aktuellen Daten in den Ringpuffer würde ich mit dem SFC 20 (Blk_Move) machen. Siehe --> http://www.sps-forum.de/showthread.php?t=12923

Pylades
 
Zuletzt bearbeitet:
Zurück
Oben