Indirekt in Datenbaustein schreiben

Gina_Jin

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte Zeitenaufnahmen T1 und T2 (je Mw )
und die Summe von T1+T2 in DB schreiben.

Hier die Merker wo ich sie reinschreibe
Die Werte sollen immer in den DB schreiben.

T1 MW10
T2 MW20
T1+T2= Mw30

// DB 100

Dw 1 Datensatz NR. 1-600( Hier addieren +1)
Dw 3 Frei
Dw 5 Frei


Das ist 1 Datensatz
Dw 8 T1 MW10
Dw 10 T2 MW20
Dw 12 T1+T2= Mw30
Dw 14 Reserve



Das ist 2 Datensatz

Dw 16 T1 MW10
Dw 18 T2 MW20
Dw 20 T1+T2= Mw30
Dw 22 Reserve


Das ist 3 Datensatz

Dw 24 T1 MW10
Dw 26 T2 MW20
Dw 28 T1+T2= Mw30
Dw 30 Reserve

Usw. …. 600 Sätze



So weiter 600 Datensätze in der gleich Struktur

Programmstruktur

// zB. Db100

U M1.0 // Bei jeder Flanke 1 Datensatz weiter schreiben
FP M 10.0 // in den DB und DW1 (addieren +1) erhöhen
BEB
Auf DB 100

L AR1

L Dw1 Datensatz Nr. 1-600 ( Hier addieren +1)
SLD 6
// 1Satz

B DW[ AR1, P0,0] Zeiger auf Dw 8 setzen
LW MW10 T 1 Wert laden
T DW[ AR1, P0,0] T 1 Wert schreiben
B DW[ AR1, P2,0] Zeiger Dw 10
LW MW 20 T 2 Wert laden
T DW[ AR1, P2,0] T 2 Wert schreiben
B DW[ AR1, P4,0] Zeiger auf Dw 12 setzen
LW MW30 T 1+T2 Wert laden
T DW[ AR1, P4,0] T 1+T2 Wert schreiben
icon4.gif

Ob das stimm weis ich nicht.
icon5.gif


Wäre Super wenn Ihr mir helfen könntet .
Wie kann ich es machen.
 
Alle "B DW..." kannst du streichen!
Nicht "LW MW...", sondern "L MW..." schreiben.
Bei den Pointen einen Punkt und vor die Ziffer ein # "P#0.0" !
"T DBW[ AR1, P#0.0]"
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
U M1.0 // Bei jeder Flanke 1 Datensatz weiter schreiben
FP M 10.0 // in den DB und DW1 (addieren +1) erhöhen
BEB
Auf DB 100

L AR1

L Dw1 Datensatz Nr. 1-600 ( Hier addieren +1)
SLD 6

// 1Satz

L MW10 //T 1 Wert laden
T DBW[ AR1, P#0.0] // T 1 Wert schreiben
L MW 20 // T 2 Wert laden
T DBW[ AR1, P#2.0] //T 2 Wert schreiben
L MW30 // T 1+T2 Wert laden
T DBW[ AR1, P#4.0] // T 1+T2 Wert schreiben

Hallo Ralle,:TOOL:
schönen dank für deine schnelle hilfe.
meinst du so,:confused:
Siehe Oben
 
Zuletzt bearbeitet:
Noch nicht ganz, so könnte es gehen:

Code:
      U     M      1.0                  // Bei jeder Flanke 1 Datensatz weiter schreiben
      FP    M     [COLOR="Red"]1.1[/COLOR]                  // in den DB und DW1 (addieren +1) erhöhen --> [COLOR="red"]MW10 benutzt du für T1!, also ist auch M10.0 schon damit belegt [/COLOR]
      SPBN  END

      AUF   DB   100

      L     DBW    0                    //Datensatz Nr. 1-600 ( Hier addieren +1) [COLOR="Red"]--> Datenworte bitte immer gerade adressieren[/COLOR]
      SLD   6
      LAR1  

// Satz

      L     MW    10                    //T 1 Wert laden
      T     DBW [AR1,P#0.0]             // T 1 Wert schreiben
      L     MW    20                    // T 2 Wert laden
      T     DBW [AR1,P#2.0]             //T 2 Wert schreiben
      L     MW    30                    // T 1+T2 Wert laden
      T     DBW [AR1,P#4.0]             // T 1+T2 Wert schreiben

END:  NOP   0

Hier wird aber nirgends aufaddiert, das machst du an anderer Stelle?
Ansonsten nach dem Schreiben der Daten, den Datensatzzähler um 1 erhöhen, aufpassen, bei Überscheiten des Max-Wertes wieder bei 1 anfangen!
Achtung wenn in DBW0 eine 0 steht, überschreibst du DBW 0, 2 und 4 mit deinen kopierten Daten. Also immer dafür sorgen, dass der Inhalt von DBW 0 zwischen 1 und 600 bleibt!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Indirekte daten schreiben Db

Noch nicht ganz, so könnte es gehen:

Code:
      U     M      1.0                  // Bei jeder Flanke 1 Datensatz weiter schreiben
      FP    M     [COLOR=red]1.1[/COLOR]                  // in den DB und DW1 (addieren +1) erhöhen --> [COLOR=red]MW10 benutzt du für T1!, also ist auch M10.0 schon damit belegt [/COLOR]
      SPBN  END
 
      AUF   DB   100
 
      L     DBW    0                    //Datensatz Nr. 1-600 ( Hier addieren +1) [COLOR=red]--> Datenworte bitte immer gerade adressieren[/COLOR]
      SLD   6
      LAR1  
 
// Satz 
 
      L     MW    10                    //T 1 Wert laden
      T     DBW [AR1,P#0.0]             // T 1 Wert schreiben
      L     MW    20                    // T 2 Wert laden
      T     DBW [AR1,P#2.0]             //T 2 Wert schreiben
      L     MW    30                    // T 1+T2 Wert laden
      T     DBW [AR1,P#4.0]             // T 1+T2 Wert schreiben
 
      [COLOR=red] L   DBW    0   // Datensatzahl [/COLOR]
[COLOR=red]     L +1            //  +1 erhöhen[/COLOR]
[COLOR=red]     T DBW    0   // Datensatz um 1 Satz erhöht[/COLOR]
 
END:  NOP   0

Hier wird aber nirgends aufaddiert, das machst du an anderer Stelle?
Ansonsten nach dem Schreiben der Daten, den Datensatzzähler um 1 erhöhen, aufpassen, bei Überscheiten des Max-Wertes wieder bei 1 anfangen!
Achtung wenn in DBW0 eine 0 steht, überschreibst du DBW 0, 2 und 4 mit deinen kopierten Daten. Also immer dafür sorgen, dass der Inhalt von DBW 0 zwischen 1 und 600 bleibt!

Hallo Ralle,
Ich habe oben in rot geschrieben, kann ich es so programmieren
Damit möchte ich den Datensatzzähler nach dem schreiben erhöhen.

icon5.gif
 
Code:
L DBW0
L 1
+I
T DBW0

Und was machst du, wenn du bei 600 bist?
Gleich hinter den Code mit der Aufaddierung einsetzen, dann kannst du auf 601
hochzählen und die 601 wird sofort durch 1 überschrieben. Dann geht es wieder von vorn los, also ein Ringbuffer.
Mal so aus dem Kopf. ;)

Code:
L DBW0
L 600
>I
SPBN NIX

L 1
T DBW0

NIX: NOP 0
 
UTD aufbauen

Kannst dir auch mal diesen Beitrag ansehen

http://sps-forum.de/showthread.php?t=8887&highlight=fifo+indirekt


vielleicht hilft dir das ja weiter.


und wenn du immer den gleichen Datensatz haben mächtest dann würde ich einen UDT erstellen und diesen als Array im DB verwenden. Das ganze noch ein bisschen mit Volkers indirekter Adressierung mischen und tadddaa! du kannst deine Werte sauber aufzeichnen xD

Hallo Befree,

schönen dank für die schnell hilfe,
wie kann ich den UDT auf mit Array aufbauen.

Es sollte so aussehen wie unten
wäre gut wenn du mir kurz darstellen könntest.


Das ist 1 Datensatz
Dw 8 T1 MW10
Dw 10 T2 MW20
Dw 12 T1+T2= Mw30
Dw 14 Reserve

Das ist 2 Datensatz

Dw 16 T1 MW10
Dw 18 T2 MW20
Dw 20 T1+T2= Mw30
Dw 22 Reserve


Das ist 3 Datensatz

Dw 24 T1 MW10
Dw 26 T2 MW20
Dw 28 T1+T2= Mw30
Dw 30 Reserve

usw.. bis 600 Datensatz



:TOOL:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Im Simatic Manager mit einfügen eine UDT einfügen.
Dann diese UDT aufmachen und die Struct definieren, die du brauchst.
Dann einen DB bauen und bei Typ deine Struct einfügen.
Das kannst du so oft machen alswie du willst.

bike


P.S: ich würde mir die Reserve so anlegen, dass alles auf 10er Stellen passt, denn dann hast du es sau einfach.
 
Code:
L DBW0
L 1
+I
T DBW0

Und was machst du, wenn du bei 600 bist?
Gleich hinter den Code mit der Aufaddierung einsetzen, dann kannst du auf 601
hochzählen und die 601 wird sofort durch 1 überschrieben. Dann geht es wieder von vorn los, also ein Ringbuffer.
Mal so aus dem Kopf. ;)

Code:
L DBW0
L 600
>I
SPBN NIX
 
L 1
T DBW0
 
NIX: NOP 0

U M 1.0
FP M 1.1 // in den DB und DW0 (addieren +1)
SPBN END
AUF DB 100
L DBW 0 //Datensatz Nr. 1-600 ( Hier addieren +1)
L 600
>I
SPB END
SLD 6
LAR1
L MW 10 //T 1 Wert laden
T DBW [AR1,P#0.0] // T 1 Wert schreiben
L MW 20 // T 2 Wert laden
T DBW [AR1,P#2.0] //T 2 Wert schreiben
L MW 30 // T 1+T2 Wert laden
T DBW [AR1,P#4.0] // T 1+T2 Wert schreiben

L DBW 0 // Datensatzahl
+1 // +1 erhöhen
T DBW 0 // Datensatz um 1 Satz erhöht
BEB

END: L 1
T DW0
NOP 0



Hallo Ralle,
kann es so schreiben :confused:
deine tipp habe gleich fertig gemacht.
schau dir das bitte mal an.
 
Zuletzt bearbeitet:
Nicht ganz, wenn dein Zähler >600 ist, wird alles umsprungen und einmal kein Wert gespeichert.
Außerdem wird dein DBW0 im Zyklustakt hochgezählt, weil du auch dorthin springst, wenn der Flankenmerker die Bedingung nicht erfüllt, also immer, wenn keine Flanke generiert wurde!!!
Dein BEB wirkt nur, wenn VKE = 1, was soll das also dort?
Ich arbeite gar nicht mehr mit BEB, sondern nur noch mit Sprüngen an eine Marke am Ende des Codes. So kann man in weiteren Netzwerken auch noch etwas programmieren und wundert sich später nicht, dass Code gar nicht ausgeführt wird, weil irgendwo noch ein BEB steht.

Code:
U M 1.0
FP M 1.1 // in den DB und DW0 (addieren +1) 
SPBN END
AUF DB 100

L DBW 0
SLD 6
LAR1 
L MW 10 //T 1 Wert laden
T DBW [AR1,P#0.0] // T 1 Wert schreiben
L MW 20 // T 2 Wert laden
T DBW [AR1,P#2.0] //T 2 Wert schreiben
L MW 30 // T 1+T2 Wert laden
T DBW [AR1,P#4.0] // T 1+T2 Wert schreiben

L DBW 0 // Datensatzahl 
L 1 // +1 erhöhen
+I //+I mag ich einfach mehr, da sieht man besser was gemacht wird :-)
T DBW 0 // Datensatz um 1 Satz erhöht

//wenn > 600 dann gleich 1 hineinschreiben
//Wert steht schon im Akku, man könnte auch noch einmal L DW 0 schreiben 
L 600
>I
SPBN END //wenn nicht > 600, dann ans Ende springen

L 1
T DBW0 

END: NOP 0
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Befree,

schönen dank für die schnell hilfe,
wie kann ich den UDT auf mit Array aufbauen.

Es sollte so aussehen wie unten
wäre gut wenn du mir kurz darstellen könntest.

Du erstellst dir in deinem Projekt einen UDT, meinetwegen den UDT1 "Datensatz". Dann erstellst du dir deinen DB. vergibst den Namen den die Datensätze von 1 bis 600 haben sollen. z.B "Messwert", als Typ schreibst du nun

Code:
Array[1..600]

damit definierst du das es den "Messwert" als Array von 1 bis 600 gibt. Wenn du jetzt mal Enter drückst springt der Cursor automatisch in die Zeile unter dem Array, hier musst du den Typen für das Aaray angeben und in deinem fall schreibst du nun deinen UDT1 hin.

In der Deklarationssicht steht damit nur eine Variable in deinem DB. Der array des UDT1 von 1 bis 600. Gehst du nun in die Datenansicht. siehst du jeder einzelnen Wert.
 

Anhänge

  • UDT_DB_1.jpg
    UDT_DB_1.jpg
    39,4 KB · Aufrufe: 12
  • UDT_DB_2.jpg
    UDT_DB_2.jpg
    135,2 KB · Aufrufe: 17
??? Indirekte Adressierung für DB-DatenBank

U M 1.0
FP M 1.1 // in den DB und DW0 (addieren +1)
SPBN END
AUF DB 100

SLD 6
LAR1
L MW 10 //T 1 Wert laden
T DBW [AR1,P#0.0] // T 1 Wert schreiben
L MW 20 // T 2 Wert laden
T DBW [AR1,P#2.0] //T 2 Wert schreiben
L MW 30 // T 1+T2 Wert laden
T DBW [AR1,P#4.0] // T 1+T2 Wert schreiben

L DBW 0 // Datensatzahl
L 1 // +1 erhöhen
+I //+I mag ich einfach mehr, da sieht man besser was gemacht wird :)
T DBW 0 // Datensatz um 1 Satz erhöht

//wenn > 600 dann gleich 1 hineinschreiben
//Wert steht schon im Akku, man könnte auch noch einmal L DW 0 schreiben
L 600
>I
SPBN END //wenn nicht > 600, dann ans Ende springen

L 1
T DBW0

END: NOP 0

Hallo zusammen,
schönen dank für eure schnelle hilfe Ihr seit super.
:TOOL:
Danke Ralle ,
Ich habe noche eine Frage:
kann an stelle "Mw" auch dort "Dw" aus dem DB 100 nehmen.
Wie müsste ich es einbauen.
Mw 10 => DB100.Dbw2

Mw 20 => DB100.Dbw4

Mw 30 => DB100.Dbw6

Mit dem SLD 6 ist es richtig gewählt, Ich möchte die Werte

1 Datensatz
T1 in DW8 // 1 satz SLD 6 hier laden und reinschreiben
T2 in Dw10
T1+T2 Dw12

2 Datensatz
T1 in DW16 // 2 satz SLD 6 hier laden und reinschreiben
T2 in Dw18
T1+T2 Dw20

3 Datensatz
T1 in DW22 // 3 satz SLD 6 hier laden und reinschreiben
T2 in Dw24
T1+T2 Dw26

4 Datensatz
T1 in DW30 // 4 satz SLD 6 hier laden und reinschreiben
T2 in Dw32
T1+T2 Dw34

Usw. 600

Danke in Vorraus !
 
Da du im DB 100 bleibst, Kannst du das

L DB100.DBW4

auch zu

L DBW4

verkürzen. Nimmst du Daten aus einem anderen DB, dann vergiß nicht das

Auf DB 100

vor den nächsten DBW-Aufruf, der für den DB100 vorgesehen ist einzufügen.
Du könntest die Daten aber auch über die IN-Schnittstelle des FB/FC, in dem der Code steht übergeben, dann kannst du im FB/FC mit Parameteraufrufen für die, zu kopierenden Daten arbeiten.

Achtung!

DBW 8
DBW 16
BDW 24
DBW 32

usw., wenn du mit SLD6 arbeitest!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle,
Warum Achtung?
*vde*
Achtung!

DBW 8
DBW 16
BDW 24
DBW 32



SLD 6 Springt der Zeiger nicht 8, 16, 24,32......

Ich habe ein teil von Programm rausgenommen, meinst du so?
SLD 6
LAR1
L Dbw2 //T 1 Wert laden
T DBW [AR1,P#0.0] // T 1 Wert schreiben
L Dbw 4 // T 2 Wert laden
T DBW [AR1,P#2.0] //T 2 Wert schreiben
L MW 6 // T 1+T2 Wert laden
T DBW [AR1,P#4.0] // T 1+T2 Wert schreiben
 
Nein, er wird verdoppelt, nicht addiert:
Code:
[FONT=Courier New]Add: 4096 2048 1024 512 256 128 064 032 016 008 004 002 001[/FONT]

Ähm, was meinst du Paule?

SLD 3 macht einen Pointer aus dem Satzzähler.
Bleibt noch ein weiters SLD 3, was rechnerisch bedeutet 3 mal mit 2 Multiplizieren

2*2*2, also 8

Macht für der Satzzähler nun

1 *2*2*2 = 8
2 *2*2*2 = 16
3 *2*2*2 = 24
4 *2*2*2 = 32
5 *2*2*2 = 40
...

Lieg ich falsch?

@Gina_Jin

Du hattest dich verschrieben
8,16,22,30 muß heißen 8,16,24,32
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Würde ich jetzt mal so behaupten (ohne jetzt den ganzen Thread gelesen zu haben)
1 *2*2*2 = 8
2 *2*2*2 = 16
3 *2*2*2 = 24
4 *2*2*2 = 32
5 *2*2*2 = 40
von 2 mit SLW/D kommst Du nicht auf 3 sondern gleich auf 4

@Edit: Aber das weißt Du doch Ralle,
ich glaube dann doch eher dass ich da was falsch verstanden habe.
 
Zuletzt bearbeitet:
Ja Paule, ich glaube, du hast da was falsch verstanden.
Hochgezählt wird der Satzzähler und zwar immer um +1.
Der Satzzähler wird geschoben. Jedes 1 Mal Schieben nach links ist das Selbe wie mit 2 Multiplizieren.

1 --> SLD 3 oder *2*2*2 = 8
2 --> SLD 3 oder *2*2*2 = 16
3 --> SLD 3 oder *2*2*2 = 24
4 --> SLD 3 oder *2*2*2 = 32
5 --> SLD 3 oder *2*2*2 = 40
 
Ralle hat schon recht Paule. Da hast du einen Denkfehler.

ist einfach
1*8
2*8

mehr macht er mit dem SLD 6 nicht, denn SLD 3 für das Pointerformat und
SLD 3 für das x*8.
 
Zurück
Oben