Datensicht auf einen Datenbautein in SCL erstellen

DerDelphianer

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
Bin Neu in der SPS-Welt.
Ist es möglich eine Sicht mit dem AT-Befehl auf einen Datenbaustein zu erstellen.
Situation:

UDT55:

Struct
A: Int;
B; Int;
MYARRAY[0..9] of byte;
endStruct;


DB55
datensatz0: UDT55
datensatz1: UDT55
.
.
.

Ich habe einen Datenbaustein DB55 mit ca 100 Datensätzen vom Typ UDT55 definiert.
Ich möchte über einen Index auf einen bestimmten Datensatz, z.b. Datensatz[0] zugreifen können und dann MYARRAY mit einer Sicht lesen und schreiben können? Dies soll aber ohne Kopiervorgänge ablaufen.

Ist dies möglich? Habe gelsen das man keine Sichten auf DB's erstellen kann.

Gibt es wirklich keinen Weg?

MfG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Thomas,

Danke für die schnelle Antwort. Das kann ich nicht. Ich arbeite an einem Projekt in dem die meisten Sachen vorgegeben sind. somit kann ich an der Struktur des DB55 und der des UDT55 nichts ändern.
MfG
 
in etwa so (aus dem Kopf)

UDT_ARRAY := ARRAY_OF_UDT(100) AT DB55


Dann kannst du auf UDT_ARRAY(index) zugreifen!


Wenn du es nicht wirklich weiter hilft gucke ich Morgen mal drum, hab das Geschäftslaptop nicht daheim!

Grüße

Marcel

P.S: Die Runden Klammern sind Eckig... bin zu Faul bei MacOS zu überlegen wie die Tastenkombi geht :p
 
Also eine schöne Lösung komplett in SCL fällt mir da nicht ein. Wenn man einen kleinen Teil in AWL schreibt kann man aber was passables bauen.
Den Baustein über den du auf die Daten per Array zugreifen willst legst du als FB an, welcher den Parameter
Code:
VAR_IN_OUT
  daten : ARRAY[0..99] of UDT55;
END_VAR
besitzt.

Damit erreicht man dass dem FB die Daten als Zeiger übergeben werden. Das kann man daran erkennen dass im Instanz-DB die Variable "daten" 6 Bytes einimmt.
Jetzt kann man den Parameter am Aufruf des FB aber nicht mehr symbolisch beschalten.
Mit etwas AWL kann man aber tricksen, wenn man den Parameter "daten" beim Aufruf freilässt, und über den Instanz-DB den Pointer passend beschreibt:
Code:
AUF "datenStruct" // Dummy Befehl damit der DB geöffnet wird, erhält wenigstens einen Rest Symbolik und das Gebastel taucht in der Querverweisliste auf
L DBNO // Nummer des DB laden
T DB1.DBW 0  // Angenommen DB1 ist der Instanz-DB des oben erwähnten FBs
L P#DBX0.0 // Startadresse von "datenStruct".Daten.Satz1 im DB
T DB1.DBD2

Die Adressen DB1.DBW0 und DB1.DBD2 sind abhängig von deinem Instanz-DB und der Adresse an der der Parameter "daten" in diesem DB liegt.

Schön ist das nicht unbedingt, aber vielleicht kommt ja noch eine elegantere Lösung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Achso was ich gerade noch lese...

Falls du keine AT-Sicht auf den DB machen kannst, dann mach ne Struktur die du im die ganzen UDTs legst, und nenn sie "Container" o.ä. und mach dann AT DB55_NAME.CONTAINER

Grüße

Marcel
 
Hallo Marcel,
den Konstrukt ARRAY_OF_UDT gibt es nicht. Habe das so porbiert.

FUNCTION SichtLesen : VOID
VAR_TEMP
UDT_ARRAY : ARRAY[0..2] OF UDT55;
END_VAR
UDT_ARRAY := ARRAY_OF_UDT[100] AT DB55
END_FUNCTION

Was meinst du mit dem Container. Könntest Du mir ein Codebeispiel schreiben ?



Hi Thomas,
Das mit dem AWL würde ich gern vermeiden wenn es geht. Wie gesagt, Ich bin noch blutiger Anfänger. Habe bis vor 2 Wochen nur in Hochsprachen wie Delphi und C# programmiert.
MfG
 
Zurück
Oben