Bin grade Bind, DB inhalt in UDT Var. kopieren!

Potenzial

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

vorarb noch mal bin blutiger Einstierger und finde grade meinen Fehler nicht... ;)

Ich versuche die ganze Zeit aus einem DB-Array von einem UDT Typ eine Variabele herraus zu kopieren, nach den Beispielen von:



http://spsforum.eu/showpost.php?p=77858&postcount=1
http://www.sps-forum.de/showpost.php?p=245815&postcount=11

Die Struktur des UDT ist auf dem Bild zu sehen.

Vorab beziehe ich mich auf den ersten Datensatz des Arrays.

Übergabe Parameter:
zielDBW = w#16#1
anzSchrtitWudt10W = w#16#8
anfangsAdrZielDbW =w#16#0

Code:
// Baue DB Zeiger 
      L     B#16#10                     // Lade Wert für einen Bereichsübergeifender Zeiger
      T     LB     0                    // Speicher in zielANYPDbx Byte 0
      L     B#16#2                      // Lade Wert für Datentypcodierung Byte
      T     LB     1                    // Speicher in zielANYPDbx Byte 1
      L     #anzSchrtitWudt10W          // Lade die Länge des UDT10 - 8 BYTE
      T     LW     2                    // Speicher in zielANYPDbx Byte 2
      L     #zielDBW                    // Lade Adresse des DB
      T     LW    4                    // Speicher in zielANYPDbx Byte 4

      LAR1  P#DBX 0.0                   // Lade Zeiger auf Globaldendatensatz
      L     DW#16#0
      L     #anfangsAdrZielDbW          // L
      SLD   3
      +AR1  
      TAR1  LD     6

// Baue tSensor Zeiger
      L     B#16#10                     // Lade Wert für einen Bereichsübergeifender Zeiger
      T     LB    10                    // Speicher in zielANYPDbx Byte 10
      L     B#16#2                      // Lade Wert für Datentypcodierung Byte
      T     LB    11                    // Speicher in zielANYPDbx Byte 11
      L     #anzSchrtitWudt10W          // Lade die Länge des UDT10
      T     LW     2                    // Speicher in zielANYPDbx Byte 12
      L     0                           // Auf kein DB Refernzieren!
      T     LW     4                    // Speicher in zielANYPDbx Byte 14
      L     P##tSensor                  // Lade Adresse des tSensors
      T     LD    16                    // Speicher sie ab Byte 16

// Kopiere Inhalt des DB Sensor x in tSensor

      CALL  "BLKMOV"
       SRCBLK :=#zielANYPDbx
       RET_VAL:=#RetValSFC20
       DSTBLK :=#anyPtSensor

// Teste
      L     #tSensor.BgKAdr // Hier steht 320 im DB
      T     #testint

Vielen Dank im Vorraus P
 

Anhänge

  • UDT10.jpg
    UDT10.jpg
    225,2 KB · Aufrufe: 18
  • FC10 - Fehler.jpg
    FC10 - Fehler.jpg
    301,4 KB · Aufrufe: 21
http://www.sps-forum.de/showthread.php?t=12923

Hast dir das schon mal angeschaut. Vielleicht findest du es selbst raus was falsch ist?
LG :ROFLMAO:

Sehe gerade, dass du das schon getan hast.Lese es nochmals durch und vergleiche mit dem was du fabriziert hast.
Kleiner Tipp.
+AR1
TAR1
Bist du sicher, dass das so gehört?
Wer lesen kann ist klar im Vorteil.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
[FONT=&quot]@Gerhard K
Ja schau schon die ganze Zeit drauf.

Will halt das Array später halt durch iterieren und so die UDTs auslesen

[/FONT] LAR1 P#DBX 0.0 // Lade Zeiger auf Globaldendatensatz
L DW#16#0 // Alles Null setzten
L #anfangsAdrZielDbW //
SLD
+AR1
TAR1 LD 6


Du meinst ich kann mir das "SLD 3" sparen?

P
 
Nein was soll das
+AR1
TAR1

bewirken??

Code:
L     B#16#10                   //10h für s7
      T     LB     0
      L     B#16#02                   //Typ BYTE
      T     LB     1
      L     8                         //Anzahl (Wiederholungsfaktor)
      T     LW     2
      L     33                         //Datenbaustein
      T     LW     4
    [COLOR=red]  L     14                        //Anfangsadresse[/COLOR]
[COLOR=red]     SLD   3                         //Pointer bauen[/COLOR]
[COLOR=red]     T     LD     6[/COLOR]
[COLOR=red]     L     B#16#84                   //Speicherbereich (hier DB)[/COLOR]
[COLOR=red]     T     LB     6[/COLOR]

Und was meinst du mit Globaldatensatz?? Einen Global DB??
 
Zuletzt bearbeitet:
Noch was. Hab mir dein Bild angesehen.
Ist ein Struct und kein Array!!
Da hast ja INT und BOOL gemischt.

Du willst nur einen Wert da raus kopieren und diesen dann weiterverarbeiten??
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Noch was. Hab mir dein Bild angesehen.
Ist ein Struct und kein Array!!
...

Du willst nur einen Wert da raus kopieren und diesen dann weiterverarbeiten?? Gestern 17:00

Also habe mein Struct-UDT10 genommen und im DB 10 ein Array gebildet von Typ UDT10, wie es Vierlang vorgemacht hat:
http://www.sps-forum.de/showpost.php?p=149476&postcount=7

Dieses Datensatz Array will ich später durch iterieren und dann mit Daten füllen.

Zuerst lese ich die das UDT aus, bzw. ziehe mir die Adresse raus von der Baugruppe die ich mit PEW [xxx] auslesen will. Werte das Signal / Zustand aus und schreibe es dann wieder zurück.


Da hast ja INT und BOOL gemischt.

Zuerst stehe im UDT die Baugruppen+Kanaladresse und dann die Zustände.
Das ich ein Byte Speicherplatz verschwende weis ich.
[FONT=&quot]
Nein was soll das
+AR1
TAR1

bewirken??

Will halt damit durch den Speicher des DBs iterieren bzw über das Arrayfeld und muss immer ein UDT10 Datensatz[6Byte-größes des UTD10] weiter springen pro Iteration
Code:
LAR1 P#DBX 0.0 // Lade Zeiger auf Globaldendatensatz
L DW#16#0 // Alles Null setzten
L #anfangsAdrZielDbW // 
SLD 
+AR1 
TAR1 LD 6
[/FONT]
 

Anhänge

  • UDT10.JPG
    UDT10.JPG
    66,2 KB · Aufrufe: 13
  • DB10.JPG
    DB10.JPG
    84,6 KB · Aufrufe: 11
Habe noch mal das ganze etwas umgestrickt,
jetzt sieht es mehr nach dem letzten (besten) Beispiel von Volker aus.

Weiter hin habe ich das
[FONT=&quot]LAR1 P#DBX 0.0 // Lade Zeiger auf Globaldendatensatz
L DW#16#0 // Alles Null setzten
L #anfangsAdrZielDbW //
SLD
+AR1
TAR1 LD 6[/FONT]
Raus gelassen, da das der Bereichszeiger doch abgedeckt sollte und den kann ich dann später hochzählen?

Der Aufbau des ANY-Zeigers:
Code:
Bit |15.. ..8 | 7.. ..0 |
Byte 0 | 10h für S7 | Datentyp | Byte 1
Byte 2 | Wiederholungsfaktor | Byte 3
Byte 4 | DB-Nummer (oder 0) | Byte 5
Byte 6 | Speicherbereich | 0 0 0 0 0 B B B | Byte 7
Byte 8 | B B B B B B B B | B B B B B b b b | Byte 9

Trotzdem versaubeutl ich den Any-Zeiger für den tSensor (typ UDT10), bzw. habe noch Probs. mit dem richtigen Bereichszeiger, siehe Screenshot.

Code:
       LAR1 P##zielANYPDbx               // Lade Adresse des zielANYPDbx

       L    B#16#10                      // Lade Wert für einen Bereichsübergeifender Zeiger
       T    LB [AR1,P#0.0]               // Speicher "B#16#10" an die Stelle des zielANYPDbx mit dem "offset" P#0.0
       L    B#16#02                      // Lade Typ: Byte
       T    LB [AR1,P#1.0]               // Speicher Typ Byte an die Stelle des zielANYPDbx mit dem "offset" P#1.0
       L    #schrtittWudt10W             // Lade Schrittweite / Bytes die geschrieben werden sollen.
       T    LW [AR1,P#2.0]               // ... mit dem offset P#2.0
       L    #zielDBW                     // Lade die Nummer des Ziel DBs
       T    LW [AR1,P#4.0]               // .. mit dem offset P#4.0
//LAR1 P#DBX     0.0
       L    DW#16#00000000
       L    #anfangsAdrZielDbW
       SLD            3
       T    LD [AR1,P#6.0]
       L    B#16#84                      //Speicherbereich (hier DB)
       T    LB [AR1,P#6.0]


       LAR1 P##anyPtSensor
       L    B#16#10
       T    LB [AR1,P#0.0]               // Speicher "B#16#10" an die Stelle des zielANYPDbx mit dem "offset" P#0.0
       L    B#16#02                      // Lade Typ: Byte
       T    LB [AR1,P#1.0]               // Speicher Typ Byte an die Stelle des zielANYPDbx mit dem "offset" P#1.0
       L    #schrtittWudt10W             // Lade Schrittweite / Bytes die geschrieben werden sollen.
       T    LW [AR1,P#2.0]               // ... mit dem offset P#2.0
       L    0                            // Lade die Nummer des Ziel DBs, da kein DB-Any Pointer ist steht hier eine 0
       T    LW [AR1,P#4.0]               // ... mit dem offset P#4.0


// FEHLER AB  HIER!!!
       L    P##tSensor                   // Lade Adresse der TempVar tSensor typ UDT10
       T    LD [AR1,P#6.0]               // .. mit dem offset P#6.0
// Bereichszeigertyp müsste 6 sein [temporäre Lokaledaten], sollte  aber auf jeden fall richtig mit,  L P##tSensor  erfasst sein
//     L    86 // Bereichszeigertyp müsste 6 sein [temporäre Lokaledaten]
//T    LB [AR1,P#6.0]               // Überschreibe Bereichszeigertyp mit dem offset P#6.0

// FEHLER BIS HIER!!!


       CALL "BLKMOV"
         SRCBLK:=zielandypdbx
         RET_VAL:=RetValSFC20
         DSTBLK:=anyPtSensor
Danke noch mals an Alle! [ =i
 

Anhänge

  • fehlerScreenFC10.JPG
    fehlerScreenFC10.JPG
    110,3 KB · Aufrufe: 14
Code:
// Bereichszeigertyp müsste 6 sein [temporäre Lokaledaten], sollte  aber auf jeden fall richtig mit, 
 L P##tSensor  //erfasst sein 
 T LD[AR1,P#6.0]
 L    86          // Bereichszeigertyp müsste 6 sein [temporäre Lokaledaten]
 T    LB [AR1,P#6.0]// Überschreibe Bereichszeigertyp mit dem offset P#6.0

// FEHLER BIS HIER!!!

Code:
L #tSensor
SLD 3
T LD[AR1,P#6.0]
L B#16#86  // Speicherbereich (Lokaldaten)
T LB{AR1,P#6.0]

Probier das mal.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bisher gehts immer noch nicht,...

danke so weit...
Lade gleich den nächsten Fehler Screen, wird die letzte Kommentationszeile angepannger..
 

Anhänge

  • fehlerScreenFC10-2.JPG
    fehlerScreenFC10-2.JPG
    94,1 KB · Aufrufe: 17
Zuletzt bearbeitet:
tSensor ist eine Temporärie var, Adr 20, typ UDT10.

Also reicht das nicht:
Code:
// FEHLER AB  HIER!!!
       L    P##tSensor                   // Lade Adresse der TempVar tSensor typ UDT10
       T    LD [AR1,P#6.0]
Warscheinlich ein blöder Anfängerfehler, aus unwissenheit oder aus... ?

Denke aber Du meinst genau die Stelle?


@Gerhard: Wie berechnest du diese Anfangsadresse?
Mit der Anfangsadresse meinst Du die anfangsAdrZielDbW!?

Die wird vom User in den FC Übergeben, hier ist es W#16#0!?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn ich ehrlich sein soll weiß ich noch garnicht was du vor hast,
kannst du das mal näher beschreiben?
Du möchtest bestimmt irgendwelche Werte von einen Sensor in einen
bestimten Datenbaustein schreiben...oder?
Kannst du das nicht direkt tun mit den SFC14/15?
 
debug P##tSensor

[FONT=&quot]Also habe jetzt einfach mal "untersucht" was der [/FONT]
[FONT=&quot]Zitat:[/FONT]
[FONT=&quot]L P##tSensor [/FONT]
[FONT=&quot]zurück gibt, hier steht die Bereichscodierung und Adresse meines Erachtens richtig drin!

Bereichscodierung (gelb):
86(hex);
1000 |0110
Bereichsübergreifend JA |temporäre Lokaldaten

Speicheradressierung (grün):
...10100 | 000
20 |0 // Dez.
Byteadresse | Bitadresse

Siehe Screenshot.

Wäre echt nett wenn ich Unterstützung bekommen würde, ist ja nicht so als ob ich nichts machen würde!?[/FONT]
 

Anhänge

  • fehlerScreenFC10-3 - pointer tSensor.JPG
    fehlerScreenFC10-3 - pointer tSensor.JPG
    78,6 KB · Aufrufe: 9
generiere mal bitte eine komplette quelle deines bausteins.
verfasse eine ordentliche fehlerbeschreibung!
(anders als: //fehler ab hier ... //fehler bis hier)
erstelle eine detailierte beschreibung dessen, was du vor hast!

...und dann sehen wir weiter.
 
Also ich möchte meine die Kanäle meiner Analogeingabebaugruppe SM 331; AI 8 x 16 Bit; (6ES7331-7NF00-0AB0), später in einer loop-schleife abfragen, und diese werte in ein DB speicher, das ein Array[0..16] vom Typ UDT10 beinhaltet.

Die StartAdresse Wird normalerweise über geben. Wenn Parameter leer ist soll er sich die Adresse des ersten Arrayfelde nehem, daher soll erst einmal der erste UDT Wert aus dem DB-Array in ein Temporäre (tSensor) kopieren.
Dort wird die Adresse der Baugruppe+Kanal heraus kopiert und die Baugruppe mit (PEW [adr]), ausgelesen, ausgewertet und wieder zurück in den DB geschrieben, dann ist der nächste dran (Loop).

Als „Anfänger“ hoffe ich mal das ich die Frage stellen darf, ist der SFC14/15 nicht für den einen Bus da und nicht für eine direkte Baugruppe?


Die Baugruppe ist so angeschlossen, ...
http://www.sps-forum.de/showpost.php?p=266794&postcount=5


@vierlagig:


Mache ich! (( =
Im welchem Format soll ich es hochladen?
Wenn ich Dich richtig verstanden hab?


Und schon mal danke Alle[ =
 
Ich HASSE Copy and Past!

Also wie soll ich es sagen?

Habe jetzt min einen halben Tag nur verschwendet wegen blöden Copy and Past und in Verbindung mit nicht sichtbaren Zeichen, also Formation aus dem Forum oder beim kopieren aus der Deklarationstabelle von WIN-SPS! Könnte würgen!

Lade euch noch mal die fehlerhaften Bausteine hoch! Viellicht ist / war es ja noch was anders!?
@4lagig:
Musste erst mal die Funktion finden wie man die Exportiert... ((x



Die FC10 - nIO.AWL enthält den fehlerhaften FC! ((;
die FC10 - IO.AWL enthält den funktionierenden FC + mehr...

Hänge auf wunsch auch noch mal den DB10 + UDT10 dran...

Der FC10 wurde immer so aufgerufen:
Code:
       CALL "SensorenAuswertenFC10"
         zielDBW:=W#16#0001
         anfangsAdrZielDbW:=W#16#0000
         schrtittWudt10W:=W#16#0006
Zusätzlich lade ich noch mal den blöden FehlerScreen...
Echt könnte mehr als würgen...

Wenn Ihr mir sonst irgend welche Vorschläge machen könnt bin ich gerne dazu zu haben! [ =


Trozdem WÜRG! +RRRRRRRRR+


Glaube ich nehme mir jetzt erst mal eine Stündchen Auszeit und fahr nach Haus....



PS:
@HelmutvdR
Als „Anfänger“ hoffe ich mal das ich die Frage stellen darf, ist der SFC14/15 nicht für den einen Bus da und nicht für eine direkte Baugruppe?
 

Anhänge

  • FC10 - IO.txt
    4,5 KB · Aufrufe: 6
  • FC10 - nIO.txt
    6 KB · Aufrufe: 6
  • fehlerScreenFC10.JPG
    fehlerScreenFC10.JPG
    110,3 KB · Aufrufe: 9
Zuletzt bearbeitet:
Zurück
Oben