Frage zum Programmcode

anne

Level-1
Beiträge
347
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich bin neu hier - und leider noch ziemlich blutige Anfängerin. :-(

Naja, wie auch immer. Trotz allem habe ich im Forum nach einer Art Mittelwertbildung gesucht und bin auch fündig geworden:

Code:
L     12                       //Startadresse des Arrays
      SLD   3                 //Pointer erzeugen
      LAR1                   // ins AR1 laden
 
      L     0.0               //Temp-Variable Summe auf 0 setzen
      T     #Summe
 
      L     7
nex2: T     #Position
 
      L     DID [AR1,P#4.0] //Aktuelle Position im Array
      L     #Summe           //Temp-Variable
      +R                         //Addieren der Werte und in
      T     #Summe          //Summe abspeichern
      +AR1 P#4.0            //Adressregister erhöhen
 
      L     #Position
      LOOP  nex2            //Sprung zu Schleife
 
      L     #Summe         //Temp-Variable durch
      L     8                  //Anzahl Elemente des Arrays
      /R                       //teilen
      T     #Mittelwert   //Speichern in Mittelwert

Allerdings ist auch schon eine Frage aufgetaucht, ich glaube die könnt ihr mir ganz sicher beantworten:

So wie ich es verstanden habe, soll doch ein Array mit den Feldern 0 bis 7 aufgefüllt werden und aus diesen acht Werten dann anschließend ein Mittelwert gebildet werden.

Müsste es dazu in Zeile 8 nicht folgendermaßen heißen?

L DID [AR1,P#0.0]

Dieser Befehl würde doch dann das erste Feld füllen, während die originale Programmzeile doch einen Wert in das zweite Feld ablegt - oder irre ich mich da?

Lieben Dank für eine Antwort.

Grüße
anne

PS: Super Forum hier!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für den Link vierlagig, aber so richtig schlauer bin ich noch immer nicht - ganz im Gegenteil... :confused:

1) Irgendwie vermisse ich in meinem dargestellten Code die Stelle, an der der aktuelle Wert in ein Array-Feld geladen wird. Fehlt das hier, oder an welcher Stelle passiert das?

2) Mittels der Anweisungen

L DID [AR1,P#4.0]
L #Summe
+R
T #Summe
+AR1 P#4.0

sollen doch die gespeicherten Werte der einzelnen Felder addiert und nach #Summe transferiert werden, um anschließend eine Mittelwertbildung vorzunehmen.

Der Befehl

L DID [AR1,P#4.0]

lädt aber doch das 2. Feld.

Beim nächsten Schleifendurchlauf wird dann das dritte Feld geladen, usw.

Wo aber wird das 1. Feld geladen?

Oder verstehe ich das gänzlich falsch?

Danke!
 
Zu 1: Ich muss sagen die Stelle vermisse ich auch...

Zu 2 Sofern ... "L 12 //Startadresse des Arrays" wirklich die Startadresse des Arays ist spricht DID [AR1,P#4.0] das Doppelwort mit Adresse 16 an.

Ach und nochwas...

Code:
nex2: T     #Position  //hier schreibst du nach dem Rücksprung noch ein weiteres mal die Varaible Position. Funktioniert zwar da du sie vor dem Rücksprung lädst ist aber irgendwie unschön.

         L     DID [AR1,P#4.0] // Ich würde das nex2 eher hier setzen
         L     #Position
         LOOP  nex2            
 
        L     #Summe       
        L     8                
        /R                       
        T     #Mittelwert
 
Zuletzt bearbeitet:
Sofern ...
L 12 //Startadresse des Arrays
Sofern das wirklich die Startadresse des Arays ist spricht DID [AR1,P#4.0] das Doppelwort mit Adresse 16 an.

Ja, genau!
Und es sollte doch so sein, dass die Startadresse dem ersten Array-Feld zugeordnet ist. Demnach spricht dann der Befehl

L DID [AR1,P#4.0]

doch das zweite Array-Feld an.

Wo aber wird das erste Feld angesprochen?
 
Hallo anne!

Zeig mal den Bausteinkopf her.
Besonders die Adressen vom array, summe und mittelwert.
Vielleicht überschneiden die sich ja irgendwo mit der indirekten Adressierung.
 
..................
Sorry, falsch gelesen. Den Offset verstehe ich auch nicht. Ist eigentlich unnötig.


Oder kann es sein, daß da noch was fehlt? Wenn du den neuen Wert direkt in 12.0 schreibst, macht das Sinn. Dann fehlt auch noch das Weiterschieben.
Hier werden momentan nur Werte verarbeitet die schon im Array stehn.

Gruß Dr.M
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
hätte man den verlinkten beitrag sorgfältig gelesen, wäre man auf die adressproblematik gestoßen, weswegen mehrfach auch das direkte laden der anfangsadresse hingewiesen wurde, aber mittlerweile bin ich offensichtlich auch nur noch eine gebetsmühle...
 
Nun, in dem verlinkten Beitrag wird aufgezeigt, dass es sinnvoller ist, die Startadresse des Arrays über den Befehl

LAR1 P##aRealArray //Startadresse des Arrays ins Adressregister laden

zu laden.

Habe das jetzt mal in den Programmcode eingeflochten - hoffe das stimmt!

Offensichtlich fehlte in dem von mir dargestellten Code noch das Laden der Werte in die einzelnen Array-Felder - habe da noch etwas gefunden...

U #Trigger
FP #Flanke
SPBN END

// ---- Laden der Werte in die einzelnen Array-Felder --- //

LAR1 P##Register // Laden der Startadresse des Arrays

L 7
nex1: T #Position

L DID [AR1,P#4.0]
T DID [AR1,P#0.0]
+AR1 P#4.0

L #Position
LOOP nex1

L #IN_Wert
T #Register[7]

// --- Mittelwertbildung --- //

LAR1 P##Register // Laden der Startadresse des Arrays

L 0.0
T #Summe

L 7
nex2: T #Position

L DID [AR1,P#4.0]
L #Summe
+R
T #Summe
+AR1 P#4.0

L #Position
LOOP nex2

L #Summe
L 8
/R
T #Mittelwert

END: NOP 0


So, somit wäre das Laden der Werte in die einzelnen Array-Felder geklärt.

Was mir aber noch immer nicht klar ist:

L DID [AR1,P#4.0] //Aktuelle Position im Array
L #Summe //Temp-Variable

Hier müsste doch im ersten Schleifendurchlauf das 1. Feld des Arrays geladen werden. Passiert das auch?

Danke, anne
 
Zuletzt bearbeitet:
@Anne

Dein Code bildet die Summe der letzten sieben Doppelwörter eines Feldes von acht Doppelwörtern und führt eine Division durch acht aus. In diesem Sinne stimmt der berechnete Durchschnittswert nicht.

In dem Code fehlt ausserdem das von vierlagig aufgezeigte Weiterschieben der Werte sowie die Übernahme des neuen Werts.

Markus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Anne

Dein Code bildet die Summe der letzten sieben Doppelwörter eines Feldes von acht Doppelwörtern und führt eine Division durch acht aus. In diesem Sinne stimmt der berechnete Durchschnittswert nicht.
Markus

Hm, also den Schleifendurchlauf um 1 erhöhen?


Code:
U #Trigger
FP #Flanke
SPBN END
 
[COLOR=orange]// ---- Laden der Werte in die einzelnen Array-Felder --- //[/COLOR]
 
LAR1 P##Register    // Laden der Startadresse des Arrays
 
L 7 
nex1: T #Position
 
L DID [AR1,P#4.0] 
T DID [AR1,P#0.0] 
+AR1 P#4.0 
 
L #Position 
LOOP nex1 
 
L #IN_Wert 
T #Register[7] 
 
[COLOR=orange]// --- Mittelwertbildung --- //[/COLOR]
 
LAR1 P##Register    // Laden der Startadresse des Arrays
 
L 0.0 
T #Summe
 
L [COLOR=red][B]8[/B][/COLOR]
nex2: T #Position
 
L DID [AR1,P#[COLOR=red][B]0[/B][/COLOR].0] 
L #Summe 
+R 
T #Summe 
+AR1 P#4.0 
 
L #Position
LOOP nex2 
 
L #Summe 
L 8 
/R 
T #Mittelwert 
 
END: NOP 0


Was haltet ihr von diesem (modifiziertem) Code - passt das so?

Vielen Dank!
 
Supi, danke Markus!

Wenn der Programmcode

Code:
L 8
nex2: T #Position
 
L DID [AR1,P#0.0] 
L #Summe 
+R 
T #Summe 
+AR1 P#4.0 
 
L #Position
LOOP nex2

jetzt richtig ist, dann war der Programmcode aus meinem Eröffnungsthread

Code:
L     7
nex2: T     #Position
 
      L     DID [AR1,P#[B][COLOR=red]4[/COLOR][/B].0] 
      L     #Summe          
      +R                         
      T     #Summe         
      +AR1 P#4.0            
 
      L     #Position
      LOOP  nex2

bezüglich L DID [AR1,P#4.0] aber doch falsch, oder wie muss ich das verstehen?

LG
anne
 
Zuletzt bearbeitet:
Na ok,
ich denke das wird dann wohl für mich ein Geheimnis bleiben...

Leider kenne ich mich (noch) nicht so gut aus, dass ich weiß, auf was ich in dem angegebenen Link achten muss, um eine Antwort auf meine Frage zu erhalten.

Aber trotzdem danke!

anne
 
Na ok,
ich denke das wird dann wohl für mich ein Geheimnis bleiben...

Leider kenne ich mich (noch) nicht so gut aus, dass ich weiß, auf was ich in dem angegebenen Link achten muss, um eine Antwort auf meine Frage zu erhalten.

Aber trotzdem danke!

anne

jetz fang nicht gleich an zu weinen.
offensichtlich fängt das array nicht bei 12 sondern bei 16 an, kann das sein?
oder ist es vielleicht ein array[0..8] oder [1..9]?
jedenfalls wird die adresse des ersten feldes aben 16 sein und nicht 12 ... und ich bleibe dabei, die startadresse so zu laden ist und bleibt gelinde gesagt fUck, man könnte auch unsauber sagen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
jetz fang nicht gleich an zu weinen.

Hm, du meinst ich sollte nicht so mädchenhaft sein? :p

Sorry - aber in dem von mir geposteten Code fängt die Startadresse des Arrays schon bei 12 an; zumindest nach meinem Verständnis.

Und in der besagten Programmzeile wird die Adresse 16 geladen, also bereits das 2. Feld.
 
Hm, du meinst ich sollte nicht so mädchenhaft sein? :p

ja, leider ist das in der testosteron-dominierten steuerungswelt...

Sorry - aber in dem von mir geposteten Code fängt die Startadresse des Arrays schon bei 12 an; zumindest nach meinem Verständnis.

Und in der besagten Programmzeile wird die Adresse 16 geladen, also bereits das 2. Feld.

is mir doch egal, was im code steht. interessant wäre die umgebung zu kennen. also wie ist das array im baustein definiert?!
 
jetzt richtig ist, dann war der Programmcode aus meinem Eröffnungsthread


Code:
L 7nex2: T #Position L DID [AR1,P#4.0] L #Summe +R T #Summe +AR1 P#4.0 L #Position LOOP nex2
bezüglich L DID [AR1,P#4.0] aber doch falsch, oder wie muss ich das verstehen?

Im Code Deines Eröffnungsthreads war vor allem die Division durch acht falsch. Bezüglich des Offset stimme ich mit den Vorvotanten überein. Solange die Umgebung (sprich: die Felddefinition) nicht bekannt ist, steht auch nicht fest welcher Offset richtig ist. Fest steht, dass obenstehender Code zur Initialadresse im AR1 beim ersten Durchlauf schon die Grösse eines Elements addiert; das könnte z.B. bei einem Feld welches von [0..8] läuft funktionieren (wenn Du das Element 0 nicht verwenden willst).

Markus
 
Zurück
Oben