PEW/PAW über Schleife und indirekter Programmierung einlesen/auslesen

WieGehtDas

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

ich bin noch Anfänger in der SPS-Programmierung (ca. 1 Jahr fertig mit Studium) und habe folgendes Problem. Über Profibus DP ist eine IM an eine WinLC angebunden. Die Peripherie Eingangs-Worte möchte ich auf einen DB schreiben. Hierbei möchte ich aber nicht jeden PEW einzeln laden und auf die gewünschte DB-Adresse transferieren. Dieser Vorgang soll in einer Schleife ablaufen. Hat jemand eine Idee dazu?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal ein paar Schnipsel

4 Eingangsworte

Code:
      L     #iEA_Adresse                //Hardware E/A Adresse
      SLD   3                           //Bitbereich ausblenden
      T     #wEA_Temp                   //temporär speichern

      TAR1  #dTempAR1                   //Adressregister retten
      TAR2  #dTempAR2                   //Adressregister retten


      LAR1  #wEA_Temp                   //Startadresse der Quelle in AR1
      LAR2  P##PI                       //Startadresse des Ziels in AR2

      L     PED [AR1,P#0.0]             //1.PED-Word laden
      T     D [AR2,P#0.0]               //und in PI-Temp schreiben

      L     PED [AR1,P#4.0]             //2. PED-Word laden
      T     D [AR2,P#4.0]               //und in PI-Temp schreiben

      LAR1  #dTempAR1                   //Adressregister zurückschreiben      
      LAR2  #dTempAR2                   //Adressregister zurückschreiben
4 Ausgangsworte

Code:
      TAR1  #dTempAR1                   //Adressregister retten
      TAR2  #dTempAR2                   //Adressregister retten

      LAR1  P##PO                       //Startadresse der Quelle in AR1
      LAR2  #wEA_Temp                   //Startadresse des Ziels in AR2

      L     D [AR1,P#0.0]               //PO-Temp 1.DW laden
      T     PAD [AR2,P#0.0]             //und in 1. PAD-word (byte 0/1/2/3) schreiben

      L     D [AR1,P#4.0]               //PO-Temp 2.DW laden
      T     PAD [AR2,P#4.0]             //und in 2. PAD-word (byte 4/5/6/7) schreiben

      LAR1  #dTempAR1                   //Adressregister zurückschreiben
      LAR2  #dTempAR2                   //Adressregister zurückschreiben
 
Hab ich das so richtig verstanden?

L 512
SLD 3
LAR1 // ergibt einen pointer von P#512.0 in adressregister1
L pew [AR1,P#0.0] // lädt das Pew 512
T Db201.dbw2

Damit müßte zumindest erstmal das PEW 512 auf den DB201 Adresse 2 geschrieben werden, oder?
 
Zuletzt bearbeitet:
Hallo,
nach deiner Änderung ist es so korrekt ... Davor ... :confused:

Gruß
Larry

Nachsatz:
Wenn du nun in einer Schleife den Wert des AR1 immer um P#2.0 erhöhst würdest du so dann das jeweils nächste PEW addressieren ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab ich das so richtig verstanden?

L 512 //
SLD 3
LAR1 // ergibt einen pointer von P#512.0 in adressregister1
L pew [AR1,P#0.0] // lädt das Pew 512
T Db201.dbw2

Damit müßte zumindest erstmal das PEW 512 auf den DB201 Adresse 2 geschrieben werden, oder?

Ja_______________________-
 
Ja sorry Larry, das hatte ich vorher nur fix rein kopiert und dabei irgendwie auch gleich reingestellt ohne es bearbeitet zu haben. :-D

Damit könnte ich im nächsten Schritt versuchen über das ganze eine Schleife zu legen:

L 512
T #Temp1 // Startadresse des ersten PEW

L 10 // Anzahl der PEW's
Next: T MB 1 // Schleifen-Anfang

L #Temp1
SLD 3
LAR1 // ergibt einen pointer von P#512.0 in adressregister1
L pew [AR1,P#0.0] // lädt das Pew 512
T #Temp2 // Adresse DB bspw. DB201.dbw2

L #Temp1 // Berechnung der nächsten PEW-Adresse --> PEW 514
L 2
+D
T#Temp1

L #Temp2 // Berechnung der nächsten DB-Adresse --> DB201.dbw4
L 16
+D
T#Temp2

L MB 1
Loop Next


Könnte das so funktionieren?
 
Zuletzt bearbeitet:
Code:
L #Temp2 // Berechnung der nächsten DB-Adresse --> DB201.dbw4
L 16---> warum 16??? Du willst doch nur um 1 Wort(L 2) erhöhen, oder??
+D
T#Temp2

Außerdem würde ich das mit AUF DB xy machen
und danach
T DBW[AR2,P#0.0]
machen.
 
@Gerhard K

Japp so mach ich das auch beim DB, das hab ich aus Faulheit nur nicht mit hingeschrieben. Ich hol mir die DB Adresse so und transferiere sie auf Temp2.

Da es sich aber bei Temp2 um die gesamte Adresse handelt rechne ich plus ein Wort also 16.
 
Zuletzt bearbeitet:
Code:
L 512
SLD 3
LAR1
 
L 2
SLD 3
LAR2
 
Auf DB 201
 
L 10 // Anzahl der PEW's
Next: T MB 1 // Schleifen-Anfang
 
 
L PEW [AR1,P#0.0] // lädt das Pew 512
T DBW[AR2,P#0.0] // Adresse DB bspw. DB201.dbw2 
 
+AR1 P#2.0
+AR2 P#2.0
 
L MB 1
Loop Next

Ich würde es so machen, wenn die DBW nacheinander beschrieben werden sollten.
LG gerhard

PS: Die Adressregister vorher noch sichern und danach wieder Rückschreiben!!!
 
Zuletzt bearbeitet:
@ gerhard

Ich ruf aus dem OB1 eine Funktion auf und übergeb da als IN: die anfangsadresse des DB's im meinem Fall das DB201.dbw2.

Im FC ist die Schnittstelle IN als Pointer deklariert mit dem Name "DB-Auswahl".

So hol ich mir die gesamte Adresse:

// Lade Zeiger
L P##DB-Auswahl
LAR1
// Lade DB-Nummer
L W [AR1, P#0.0]
T #NoDB
// Lade Bereichszeiger
L D [AR1, P#2.0]
T #Temp2

Dieses Netzwerk befindet sich vor der Schleife. Ich hoffe ich konnte mich verständlich ausdrücken... ;-)
 
:confused: ... wie auch immer - ich würde es auch so machen, wie im Beispiel von Gerhard_K vorgestellt (Beitrag #14) ...
Und ganz wichtig : den Zusatz mit dem Pointer-sichern auf jeden Fall berücksichtigen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Larry, Gerhard

Wieso ist das sichern der Adressregister wichtig?

Ja der Beitrag#14 von Gerhard ist wesentlich durchsichtiger als der meinige. Aber beides funktioniert habs ausprobiert... :-D

Naja viele Wege fürn nach Rom, ich habs da wohl etwas komplizierter gemacht als es ist. :-D
 
Das Sichern des AR1 ist nicht so zwingend nötig - das vom AR2 schon.
Irgendwann fängst du mal an, das Ganze in einem FB und da als Multi-Instanz zu machen. Da wirst du dann auf einmal feststellen, dass das Eine oder Andere dann nicht mehr funktioniert, da der Multi-FB das AR2 für sich selbst auch nutzt - deshalb immer das zurück-biegen, was man vorher verbogen hat. Hat man sich das erst einmal angewöhnt stolpert man später dann nicht mehr darüber - vor allem wenn man das schon zig Mal so gemacht hat und es immer funktionierte ...

Gruß
Larry
 
Zurück
Oben