Indirekte Adressierung

PapaLeo

Level-1
Beiträge
9
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen. Ich bin neu in Sachen SPS.
Kann mir eine den vorhandenen Code kommentieren, was es macht und an welche Stelle.
Danke im Voraus!
L #ISTW
T "MW 210"
T #conv_akku1
L "MB 210"
T #conv_index
TAK
L #conv_akku1
AUF DB [#conv_index]
T #conv_akku1
L STW
T #conv_stw
L "MB 211"
SLW 4
LAR1
L #conv_stw
T STW
L #conv_akku1
L DBW [AR1,P#0.0]
T "MW 212" // Istwert
L #S_L // Auswertung L
T "MW 210"
T #conv_akku1
L "MB 210"
T #conv_index
TAK
L #conv_akku1
AUF DB [#conv_index]
T #conv_akku1
L STW
T #conv_stw
L "MB 211"
SLW 4
LAR1
L #conv_stw
T STW
L #conv_akku1
L DBW [AR1,P#0.0]
T "MW 214" // Sollwert LAL
L #S_H // Auswertung H
T "MW 210"
T #conv_akku1
L "MB 210"
T #conv_index
TAK
L #conv_akku1
AUF DB [#conv_index]
T #conv_akku1
L STW
T #conv_stw
L "MB 211"
SLW 4
LAR1
L #conv_stw
T STW
L #conv_akku1
L DBW [AR1,P#0.0]
T "MW 216" // Sollwert LAH
L #S_HH // Auswertung HH
T "MW 210"
T #conv_akku1
L "MB 210"
T #conv_index
TAK
L #conv_akku1
AUF DB [#conv_index]
T #conv_akku1
L STW
T #conv_stw
L "MB 211"
SLW 4
LAR1
L #conv_stw
T STW
L #conv_akku1
L DBW [AR1,P#0.0]
T "MW 218"
 
Wie wäre es denn wenn du erst mal das dazukommentierst was du weist bzw. vermutest und wir korrigieren es dann?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wer sowas programmiert frißt auch kleine kinder :shock::-?

interessant wäre zum code auch eine kleine anlagen beschreibung, denn die symbolik ist wirklich nicht unbedingt der hammer

und! falls du weitere code-schnipsel postest -> code-tags benutzen (link findest du in meiner signatur )
 
Zudem fehlen wichtige Teile, z.Bsp. ist nicht ersichtlich, wo das AR1 denn geladen wird. Vielleicht wäre es sinvoller alles zu posten und den interessierenden Teil farblich hervorzuheben. Den Code wirklich zu erfassen macht wenig Sinn, der ist wirklich schauderhaft. Wichtiger wäre mal zu wissen, was suchst du, was soll der Code machen? Sieht irgendwie nach Daten von/an einen Slave (Servo?) aus.
 
Code:
*
//ISTW (IN? oder von sonst irgendwo) in MW210 und conv_akku1 (TEMP?)

      L     #ISTW                 //2222 -> W#16#8AE
      T     "MW 210"              //W#16#8AE
      T     #conv_akku1           //W#16#8AE

//high-byte von ISTW als index in akku1 (in akku2 steht noch ISTW)

      L     "MB 210"              //w#16#8
      T     #conv_index

//akku1 gegen akku2 tauschen (akku1 ISTW;akku2 high-byte von ISTW)

      TAK

//akku1 mit ISTW beschreiben, in akku2 steht jetzt auch ISTW

      L     #conv_akku1           //W#16#8AE

//db-nummer aus high-byte von ISTW

      AUF   DB [#conv_index]      //DB 8

//ISTW mit ISTW überschreiben

      T     #conv_akku1           //W#16#8AE

//Statuswort sichern

      L     STW
      T     #conv_stw

//low-byte von ISTW um 4 nach links schieben (-> * 16) und in adressregister 1 laden

      L     "MB 211"              //W#16#AE
      SLW   4                     //*16
      LAR1                        //W#16#AE0 -> P#348.0

//Statuswort zurücksichern

      L     #conv_stw
      T     STW

//ISTW in akku1

      L     #conv_akku1           //W#16#8AE  

//aus DB [conv_index] das wort [ISTW * 2] in akku1 und in MW212 ablegen, ISTW in akku2 

      L     DBW [AR1,P#0.0]       //DB8.DBW348
      T     "MW 212" // Istwert

//S_L (IN?) in MW210 und conv_akku1

      L     #S_L // Auswertung L
      T     "MW 210"
      T     #conv_akku1

//hier beginnt der selbe mechanismus wie oben

      L     "MB 210"
      T     #conv_index
      TAK
      L     #conv_akku1
      AUF   DB [#conv_index]
      T     #conv_akku1
      L     STW
      T     #conv_stw
      L     "MB 211"
      SLW   4
      LAR1
      L     #conv_stw
      T     STW
      L     #conv_akku1
      L     DBW [AR1,P#0.0]
      T     "MW 214" // Sollwert LAL

//und das ganze nochmal für S_H (IN?)

      L     #S_H // Auswertung H
      T     "MW 210"
      T     #conv_akku1
      L     "MB 210"
      T     #conv_index
      TAK
      L     #conv_akku1
      AUF   DB [#conv_index]
      T     #conv_akku1
      L     STW
      T     #conv_stw
      L     "MB 211"
      SLW   4
      LAR1
      L     #conv_stw
      T     STW
      L     #conv_akku1
      L     DBW [AR1,P#0.0]
      T     "MW 216" // Sollwert LAH

//und nochmal für S_HH (IN?)

      L     #S_HH // Auswertung HH
      T     "MW 210"
      T     #conv_akku1
      L     "MB 210"
      T     #conv_index
      TAK
      L     #conv_akku1
      AUF   DB [#conv_index]
      T     #conv_akku1
      L     STW
      T     #conv_stw
      L     "MB 211"
      SLW   4
      LAR1
      L     #conv_stw
      T     STW
      L     #conv_akku1
      L     DBW [AR1,P#0.0]
      T     "MW 218"
wenn man jetzt noch wüßte, was sich der programmierer dabei gedacht hat ... obwohl - eigentlich willl ich das gar nicht wissen ...
 
Zuletzt bearbeitet:
slw 4
kann bedeuten pointerformat und den wert mal 2 in einem schritt.
PS:Hab mir den code nicht angeschaut,aber ein kollege vonmir benutzt das öfter so.:rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
slw 4
kann bedeuten pointerformat und den wert mal 2 in einem schritt.
PS:Hab mir den code nicht angeschaut,aber ein kollege vonmir benutzt das öfter so.:rolleyes:

Ja, das machen manche Programmierer, wenn sie Wortweise Adressieren wollen, ihre Werte aber normal durchnummerieren.

Adresse DW0 --> Wert 0
Adresse DW2 --> Wert 1
Adresse DW4 --> Wert 2

Das als Pointer

SLD 3
Und dann noch *2
also SLD 4

Man geht also mit für Wert 1 mit 1 rein, der mit SLD 4 errechnete Pointer zeigt dann auf Adresse DW2 usw.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@VL:

Ob sich der S7-Programmierer dabei was gedacht hat? Keine Ahnung!
Aber das Programm sieht so aus, als wäre es ursprünglich mal ein S5-Code gewesen und
wurde durch den Siemens S5-S7-Converter gejagt.

In S5 hätte es so ausgesehen:
Code:
L =ISTW      // Formaloperand in KY DB-Nr, DW-NR
T MW 210    // zwischenspeichern
B MB 210     // DB-Nr. laden
A DB 0        // DB öffnen
B MB 211     // DW-Nr. laden
L DW 0        // Inhalt DW laden
T MW 212    // Istwert speichern
L #S_L       // Auswertung L Formaloperand in KY DB-Nr, DW-NR
T MW 210  // zwischenspeichern
B MB 210     // DB-Nr. laden
 A DB 0        // DB öffnen
 B MB 211     // DW-Nr. laden
L DW 0        // Inhalt DW laden
T MW 214   // Sollwert LAL
...
usw.

Es werden also nur ein paar Werte ausgelesen, die indirekt übergeben werden.

Grüße
Gebs
 
@gebs: das mit dem converter ... ich hab noch nie damit gearbeitet ... kann es sein, dass von da die bezeichnungen (conv_***) der lokaldaten kommen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also in einer sprache die wir verstehen so?

Code:
*
      L     #wIn
      T     #wInTemp

      L     P##wInTemp
      LAR1  
      L     B [AR1,P#1.0]
      T     #iDbNumber
      L     B [AR1,P#0.0]
      SLD   4
      LAR1  
      AUF   DB [#iDbNumber]
      L     DBW [AR1,P#0.0]
      T     #wOut

ob es dann nun wirklich SLD 4 sein muß - mir gefällts ;)
 
ja so ist es intelligent gelöst/umgesetzt.

Das SLD 4 kommt durch die Konvertierung aus S5, weil in der S5 die DBs wortweise
organisiert sind. Ich denke es ist einfacher und weniger Fehleranfällig einmal SLD 4 zu schreiben,
als im ganzen Programm den Aufruf des FC's anzupassen.
Ersatz für SLD 4:
Code:
SLD 1     // S5-Wort-Format nach S7-Byte-Format
SLD 3     // => ins Pointerformat

Grüße
Gebs
 
Das ganz wurde in SCL geschrieben und dann durch den MCS7 Kompiler durchgejagt. Deshalb ist es sehr schwehr, den CODE nachzuverfolgen. Wird verwendet, wenn man nicht will, dass der CODE kopiert werden soll bzw. wenn der CODE geknackt wird (KNOW_HOW_PROTECT).
 
Das ganz wurde in SCL geschrieben und dann durch den MCS7 Kompiler durchgejagt. Deshalb ist es sehr schwehr, den CODE nachzuverfolgen. Wird verwendet, wenn man nicht will, dass der CODE kopiert werden soll bzw. wenn der CODE geknackt wird (KNOW_HOW_PROTECT).

Nö, das sieht mir gar nicht so aus, eher schon ein umgesetztes Step5-Programm.

Und SCL verwendet man i.A. aus anderen Gründen :)
 
Zurück
Oben