Step 7 SCL DB Pointer

hanz-landau

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

Ich hab ein Problem. Ich möchte ein Modell eines Hochregallagers automatisieren. Und zwar habe ich mir ein DB angelegt in dem ich 50 structs habe (für jeden Lagerplatz einen Struct) jeder Struckt besteht aus meinem UDT (UDT besteht aus:
  • +0.0 belegt (bool)
  • zustand der ware (int)
  • artikel name (string[20])
  • gewicht (real)
)
die Daten die in dem UDT sind für jedes Fach gleich. Zu diesen Daten kommen die Positionen für von X und Z um das Fach anzufahren.

Den DB möchte ich mittels einer SCL Quelle durchsuchen, auslesen verarbeiten und umschreiben.

Allerdings habe ich davon absolut keine Ahnung habe mich mal versucht einzulesen im Forum aber ich habe halt absolut keine Ahnung von Pointern oder ähnlichem

Danke im voraus schon mal
 
Da Du in SCL programmieren willst, musst Du Dich nicht mit Pointern beschäftigen. Ich schlage Dir ein zweidimensionales Array von Deinem UDT vor. Fang mal an und stell dann konkrete Fragen, dann wird Dir hier sicher weiter geholfen.
Gruß
Erich
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dank für die Antwort. Ich hab mein UDT jetzt so auf gebaut:
Belegt bool
Zustand int
Artikel string [20]
Gewicht real
Pos_x int
Pos_x int
Palette_vorhaden bool

Zu meiner Scl Quelle

Var
Lagerplatz : array [ 0. .9,0. .4 ] of UDT
End_var
 
Bis auf die Tippfehler sieht das brauchbar aus.
Du musst aber das Array in einem globalen Datenbaustein oder als statische Variable eines FB anlegen.
Jetzt kannst Du in einem Baustein mit zwei ineinander geschachtelten FOR-Schleifen den Artikel suchen. Auf geht's!
Gruß
Erich
 
Zuletzt bearbeitet:
Hallo,
interessehalber wollte ich die Aufgabe auch programmieren, ist ja nur ein kurzer Code. Hat auch ganz gut geklappt, bis auf den String. Ich ruf den Baustein im OB1 auf und übergib die Werte an temporäre Variablen. Das ganze ist ja nur zum Lernen. Den Lagerplatz, den ich aufrufe habe ich auch mit Werten vorbelegt.

Wäre cool, wenn mir jemand erklären kann wo mein Fehler steckt. Mit String habe ich zuvor noch nie gearbeitet.

Schöne Weihnachten

Code:
FUNCTION_BLOCK FB43
VAR_INPUT
    x: INT;
    y: INT;
END_VAR
VAR_OUTPUT
    Belegt: BOOL;
    Zustand: INT;
    Artikel: STRING[20];
    Gewicht: REAL;
    END_VAR
VAR_TEMP
    // temporäre Variablen
END_VAR
VAR
    // statische Variablen
END_VAR
Belegt:= Test_DB.Stellplatz[x,y].Belegt;
Zustand:=Test_DB.Stellplatz[x,y].Zustand;
Artikel:=Test_DB.Stellplatz[x,y].Artikel;
Gewicht:=Test_DB.Stellplatz[x,y].Gewicht;
    // Anweisungsteil
    
    ;
END_FUNCTION_BLOCK
 
Habs gerade nicht da, aber soweit ich mich erinnere war im ersten Byte 20 und im zweiten eine 1.
In den anderen steht dann die Information
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist ein komisch. Ich möchte den String steuern, klappt auch soweit. Aber wenn ich den DB beobachte schreibt er ein A rein.
Wie schon erwähnt. Ich hab zuvor noch nie mit String gearbeitet.... Es kann daher auch ein totaler Anfängerfehler sein.

Beobachten2.JPG
 
Das ist ein komisch. Ich möchte den String steuern, klappt auch soweit. Aber wenn ich den DB beobachte schreibt er ein A rein.
Wie schon erwähnt. Ich hab zuvor noch nie mit String gearbeitet.... Es kann daher auch ein totaler Anfängerfehler sein.
Strings in einem DB kannst Du nicht beobachten, das siehst Du daran, dass das Feld ausgegraut ist.
In Deiner VarTab musst Du das zweite Byte auf die aktuelle Länge setzen (hier also auch 20).
 
Strings in einem DB kannst Du nicht beobachten
Direkt beobachten kann man Strings tatsächlich nicht. Wenn man den Datenbaustein aber in der Onlineansicht öffnet und danach auf
beobachten geht, bekommt man zumindest den Wert des Strings zu diesem Zeitpunkt präsentiert.
Wenn man den Wert dann ändert muss man den DB allerdings wieder schließen und neu öffnen. Leider schön blöd.

@Andi_
Zur Info. Das erste Byte im String beschreibt die deklarierte Länge, das zweite die tatsächliche Länge der Zeichenkette die drin steckt. Wenn du den String daher manuell über die Variablentabelle vorbelegst, dann musste du das zweite Byte auch entsprechend anpassen.
 
Dann müsste trotzdem das erste S drinnen stehen und im Ob1 angezeigt werden??
Ach so meintest du das..
Nein dann wird er nicht angezeigt. Strings kann man nicht als Ausgangsparameter angezeigt bekommen.
Das 'S' das du suchst wirst du aber vermutlich mit L #Artikel[1] als Hex-Wert W#16#53 sehen.

Nimm statt den Temp-Werten lieber einen DB, dann kannst du die vorher beschriebene Methode oder die Variablentabelle verwenden.

Leider sind die Mechanismen zum beobachten von Strings stark begrenzt.
 
Zurück
Oben