Addierer

_Praktikant_

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

ich habe vor kurzem mein Praktikum in einer SPS-Abteilung begonnen und
meine Vorkenntnisse sind eher gering :???:
Zur Einübung soll ich 2 (32bit) Dualzahlen addieren, aber ohne die vorhandene Add.funktion.
Die bisherigen Beiträge zur indirekten Adressierung haben mir auch noch nicht die Erleuchtung gebracht (ich hoffe hier auf Hilfe zur Aufgabe).
Mein vorläufiger Ansatz (für die Schleife):

Code:
                  // Laden der 
                  beiden Doppelwörter      

                  L 32
          loop:   T #Schleifenzähler
                  
                  X L 0.0              //summand1
                  X L 2.0              //summand2
                  X #übertrag
                  = L 4.0              //ergebnis



                  L #schleifenzähler
                  LOOP loop

                  //Ergebnis speichern

Mir gehts jetzt egtl. auch nur um die Schleife und v.a. um die Verarbeitung/
Verknüpfung des Übertrags (mit ind. Adr.), hab noch keine laufende Lösung?!
Für Tipps/Hilfen wär ich sehr dankbar
Gruß _Praktikant_
 
Zuletzt bearbeitet:
Hi

Zur Einübung soll ich 2 (32bit) Dualzahlen addieren, aber ohne die vorhandene Add.funktion.

Würde sagen:

Wandle eine Zahl in eine Negative Zahl um ( Zahl *-1)

Subtrahiere dann die Beiden Zahlen.

Reihenfolge der Subtraktion beachten !


Zahl = Zahl_1 + Zahl_2

identisch mit

Zahl = Zahl_1 - (Zahl_2 *-1)


Wo ist das Problem.


Irgenwie DOOF die Aufgabenstellung :ROFLMAO:

Sollst du Progen oder Grundlagen Mathematik machen :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na prima, da haben sie dir ja gleich ne tolle Aufgabe gestellt, ob die wissen das da mindestens eine Stolperfalle lauert?

Also deine Schleife ist schon mal im Ansatz richtig.
Denk daran, daß deine Schleife rückwärts zählt. Wenn du also indirekt
adressieren willst, mußt du dir noch eine Variable haben die hochläuft.
Z.Bsp.

Code:
L 32
L #Schleifenzaehler
-I
T #Zaehlvar
Da ist dann natürlich eine echte Addition drin, aber das ist ja hoffentlich nicht verboten.

Summand_1, Summand_2 und das Ergebnis legst du im Tempbereich des Bausteins hintereinander als DINT an.
Am Anfang, vor der Schleife werden Summand_1, Summand_2 in diese Temp-Var hineinkopiert. Das Ergebnis auf 0.
Innerhalb der Schleife kannst du dann wie folgt indirekt zugreifen:

Code:
      L     P##Summand_1_Temp; //die Adresse von Summand_1_Temp wird geladen
      LAR1  ; 

      L     32; 
      L     #Schleifenzaehler; 
      -I    ; 
      +AR1  ; //das bewirkt, daß z.bsp. bei +8, das AR1 um 8 Bit erhöht wird!

//Ergebnisbit berechnen  
      X      [AR1,P#0.0]; //summand1
      X      [AR1,P#4.0]; //summand2
      X     #Uebertrag_Temp; //übertrag
      =      [AR1,P#8.0]; //ergebnis
Nach der Schleife, das Ergebnis in die Autput-Variable schreiben.

Ich stell mal bewußt nicht den kompletten FC ein, du sollst ja was lernen. ;)
Wenn du nicht weiterkommst stelle hier die Fragen, ich helf dir weiter, bis es läuft, danach weißt du hoffentlich auch warum, das läuft.

Noch ein paar wichtige Links, die solltest du zuerst mal lesen:

http://www.sps-forum.de/showthread.php?t=8887
http://de.wikipedia.org/wiki/XOR
http://de.wikipedia.org/wiki/Dualsystem#Schriftliche_Addition hier vor allem die Ergebnistabelle, wegen der Berechnung des neuen Übertrags !

Zu der schicken Siemens-Stolperfalle kommen wir dann auch noch :ROFLMAO:.
 
Hi

Würde sagen:

Wandle eine Zahl in eine Negative Zahl um ( Zahl *-1)

Subtrahiere dann die Beiden Zahlen.

Reihenfolge der Subtraktion beachten !


Zahl = Zahl_1 + Zahl_2

identisch mit

Zahl = Zahl_1 - (Zahl_2 *-1)


Wo ist das Problem.


Irgenwie DOOF die Aufgabenstellung :ROFLMAO:

Sollst du Progen oder Grundlagen Mathematik machen :confused:

Ich denk mal, er soll das wirklich binär machen.
 
Hi Ralle

Ich denk mal, er soll das wirklich binär machen.
Warum, ist die Lösung von mir falsch.

In der Frage stand NIX von Schleifen UND Indirekter Adressierung. :ROFLMAO:


@Ralle
Da ist dann natürlich eine echte Addition drin, aber das ist ja hoffentlich nicht verboten.
Addition ist Addition.

Verboten ;-)

Will auch mal Recht haben. :-(
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@gravieren
Deine Lösung ist bestimmt nicht falsch, wird aber wohl das Thema verfehlen.

Also entweder Note 1 für den einfachsten Weg zur Lösung oder Note 6 für Thema verfehlt.

Ich denke schon dass der Lösungsansatz von Ralle schon eher an das hin kommt was der Aufgabensteller haben will!
 
Hi Ralle


Warum, ist die Lösung von mir falsch.

In der Frage stand NIX von Schleifen UND Indirekter Adressierung.


@Ralle
Addition ist Addition.

Verboten ;-)

Will auch mal Recht haben. :-(

Gut, gut, hast recht :ROFLMAO:. Falsch hab ich gar nicht behauptet, grins.

Er sprach von indirekter Adressierung, daher kam ich darauf.
Man kann das Ganze auch komplett zu Fuß machen, und 32 Mal die XOR-Verknüpfungen etc. hintereinander weg schreiben. Das geht bestimmt sogar in KOP/FUP :ROFLMAO:!
 
Hi Steve81


Zur Einübung soll ich 2 (32bit) Dualzahlen addieren, aber ohne die vorhandene Add.funktion.
Klare Ansage :)


Ich denke schon dass der Lösungsansatz von Ralle schon eher an das hin kommt was der Aufgabensteller haben will!
Kennt du den Konrad (Aufgabensteller);)
Nebenbei bemerkt.
Bei meinen Progs (Habe schon einige Dutzend geschrieben (810D,840D)
gibt es selten Konstrukte mit mehr als 8 Zeilen.

Habe schon nach 10 Jahren meine Logiken Problemlos noch lesen können.
(Kann jedoch auch an meinen vielen Kommentaren im Prog liegen)
(Werde nach KB-Anweisungen bezahlt, und Kommentare zählen auch dazu :ROFLMAO: )
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kennt du den Konrad (Aufgabensteller);)

Nein kenne ich nicht.
Deine lösung finde ich ja an sich auch super, da sie die Aufgabenstellung wie wir sie kennen erfüllt und absolut einfach zu verstehen ist.

@_Praktikant_
Ich denke du solltest dich noch mal zu den Lösungsansätzen äusern, schließlich kannst du am besten abschätzen was der Aufgabensteller von dir will.
 
Hi Steve81

@_Praktikant_
Ich denke du solltest dich noch mal zu den Lösungsansätzen äusern, schließlich kannst du am besten abschätzen was der Aufgabensteller von dir will.
Komisch, ich bin bald 20 Jahre Verheiratet und weis NICHT einmal was meine Frau "will" ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zur Einübung soll ich 2 (32bit) Dualzahlen addieren, aber ohne die vorhandene Add.funktion.

Folgender Programmcode sollte auch ohne indirekte Adressierung funktionieren. :)

Es ist dabei der Wertebereich für DINT-Zahlen von -2.147.483.648 bis 2.147.483.647 zu beachten.

Code:
      L     MD   100                    // Zahl 1
      T     MD   120                    // Zahl 1
 
      L     MD   110                    // Zahl 2
      T     MD   130                    // Zahl 2
 
 
      L     32
M01:  T     MW   200                    // Schleife
 
 
      L     MD   120                    // Zahl 1
      L     MD   130                    // Zahl 2
      XOD   
      T     MD   140                    // Zwischenwert
 
      L     MD   120                    // Zahl 1
      L     MD   130                    // Zahl 2
      UD    
      T     MD   150                    // Überlauf
 
      L     MD   150                    // Überlauf
      SLD   1
      T     MD   150                    // Überlauf
 
 
      L     MD   140                    // Zwischenwert
      T     MD   120                    // Zahl 1
 
      L     MD   150                    // Überlauf
      T     MD   130                    // Zahl 2
 
 
      L     MW   200                    // Schleife
      LOOP  M01
 
 
      L     MD   140                    // Zwischenwert
      L     MD   150                    // Überlauf
      OD    
      T     MD   160                    // Ergebnis

Gruß Kai
 

Anhänge

  • FC60.pdf
    2,9 KB · Aufrufe: 11
  • VAT 02.jpg
    VAT 02.jpg
    244,9 KB · Aufrufe: 20
  • VAT 04.jpg
    VAT 04.jpg
    242,6 KB · Aufrufe: 13
Zuletzt bearbeitet:
Folgender Programmcode sollte auch ohne indirekte Adressierung funktionieren. :)
affe00005.gif


Stöhn, wie wärs denn mit einem Ansatz, statt der kompletten Lösung!
 
Zuletzt bearbeitet:
Hallo,
danke erst mal für die schnellen Antworten:s12:
Also die Aufgabe soll binäre Addition sein, mit Schleife und
ind. Adr.
Werd gleich morgen mit den Tipps von Ralle versuchen in der
aufgabe weiter zu kommen!
Meld mich wieder...
Mfg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tad

Also, die Aufgabe ist wirklich gut :twisted: .

Indirekte Adressierung, Schleife und Stolperklippen bei der Ermittlung des Übertrags! Eine wirklich besch.. äh gelungene Kombination für eine Übungsaufgabe. Viel Spaß!

Kleiner Tipp:
  • Befehl TAD ansehen!
  • ein Übertrag erfolgt, wenn
  • 1. beide bits in den Zahlen "1" sind, ODER
  • 2. ein bit "1" ist UND ein Übertrag ansteht
Gruß, Onkel
 
Also, die Aufgabe ist wirklich gut :twisted: .

Indirekte Adressierung, Schleife und Stolperklippen bei der Ermittlung des Übertrags! Eine wirklich besch.. äh gelungene Kombination für eine Übungsaufgabe. Viel Spaß!

Kleiner Tipp:
  • Befehl TAD ansehen!
  • ein Übertrag erfolgt, wenn
  • 1. beide bits in den Zahlen "1" sind, ODER
  • 2. ein bit "1" ist UND ein Übertrag ansteht
Gruß, Onkel

Die Tips sind gut :ROFLMAO:.
 
Die Tips sind gut :ROFLMAO:.
Na setze noch einen zur ind. Adressierung drauf. Ist nur ein Vorschlag, natürlich geht es auch anders. Ich würde es in einer FC mit AR1 und AR2 adressieren.

Code:
...
...
      L     32
L001: T     #TEMP_INT
//*** Binärergebnis unter Berücksichtigung des Übertrag
      X      [AR1,P#0.0]
      X      [AR2,P#0.0]
      X     #UEBERTRAG
      =     #EINS                       // Ergebnisbit
 
//*** Übertrag
...
...
...
      =     #UEBERTRAG
 
      U     #EINS
      =      [AR2,P#0.0]                // am Ende Summand in AR2
 
...
...
      +AR1  P#0.1
      +AR2  P#0.1
      L     #TEMP_INT
      LOOP  L001


Gruß, Onkel
 
Hallo,

also weil ich grad komplett verwirrt bin und nicht vorwärts komm..
sorry wenn ich blöde fragen stelle ( bin halt totaler anfänger und tue
mir schwer mit der umsetzung in prog.code).
Die links hab ich mir angeschaut und die theorie ist soweit klar:
für den übertrag müsste es 4 möglichkeiten für einen übertrag und
4 für keinen (je abhängig von den summanden) geben.
Fragen:
Summand_1, Summand_2 und das Ergebnis legst du im Tempbereich des Bausteins hintereinander als DINT an.
Mir wurde am anfang dword gesagt -> beides möglich??
Am Anfang, vor der Schleife werden Summand_1, Summand_2 in diese Temp-Var hineinkopiert.
Ist hier kopieren von werten aus DB in temp-var gemeint?
HTML:
L     32; 
      L     #Schleifenzaehler; 
      -I    ; 
      +AR1  ;
:confused: -I => #schleifenzähler - 32 ( Akku1 -Akku2) und szähler ist doch < 32 => neg Wert

Was fehlt denn noch alles bei der schleife von onkel dagobert?
XOR-verknüpfung von s1,s1 und altem übertrag und...?

Wie gesagt sorry, aber fang ganz von vorne an, mfg!
 
Zuletzt bearbeitet:
Zurück
Oben