Kodierung

kendoku

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute ich bin ein absolute SPS Neuling, ich habe folgende Aufgabe zu bewältigen weis aber nicht so recht wie ich da vorankommen könnte.

Hier die Aufgabenstellung:
Programmieren Sie einen Funktionsbaustein mit vier Binäreingängen
(„Bit0“,“Bit1“,“Bit2“,“Bit3“) und einem Integer Ausgang („Nummer“), der die Kodierung
entschlüsseln kann und als Integer – Zahl ausgibt.

Am besten in awl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Benutze mal die Suche, sowas oder sowas ähnliches gabs hier schon ein paar Mal:rolleyes:
Und dann setze bitte erstmal einen eigenen Lösungsvorschlag hier rein. Danke!
 
@marlob:
Nu sei mal nicht so...:rolleyes:

Hier mal ein Vorschlag:
Code:
FUNCTION FC 4 : VOID
TITLE =
VERSION : 0.1
 
VAR_INPUT
  bit_0 : BOOL ; 
  bit_1 : BOOL ; 
  bit_2 : BOOL ; 
  bit_3 : BOOL ; 
END_VAR
VAR_OUTPUT
  OUT_INT : INT ; 
END_VAR
VAR_TEMP
  Temp_int : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =
      L     0; //Temporäre Variable vorbelegen
      T     #Temp_int; 
      L     P##Temp_int; //Pointer auf Temporäre Variable
      LAR1  ; 
      U     #bit_0; //Bit_0 in TempVar kopieren
      =      [AR1,P#1.0]; 
      U     #bit_1; //Bit_1 in TempVar kopieren
      =      [AR1,P#1.1]; 
      U     #bit_2; //Bit_2 in TempVar kopieren
      =      [AR1,P#1.2]; 
      U     #bit_3; //Bit_3 in TempVar kopieren
      =      [AR1,P#1.3]; 
      L     #Temp_int; //Inhalt der TempVar  
      T     #OUT_INT; //auf Ausgang schreiben (Wert 0-15)
 
END_FUNCTION
Vermutlich kommen jetzt erst die richtigen Fragen.
Aber er braucht doch auch einen Denkanstoß.:)
 
@marlob:
Nu sei mal nicht so...:rolleyes:

Vermutlich kommen jetzt erst die richtigen Fragen.
Aber er braucht doch auch einen Denkanstoß.:)

na super, ziel der übung ist es doch, etwas zu lernen, oder? jetzt kupfert er deine lösung, ist der held und haut uns bei der nächsten aufgabe wieder wegen einer lösung an ... wenn es nicht vielleicht sogar eine schulaufgabe war ... und denkanstöße gab es ... nö, das kann ich nicht unterstützen!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@vierlagig:
Ich betrachte es nicht als meine Aufgabe hier irgendwen zum selbstständigen Denken und zum Benutzen der Suchfunktion zu erziehen.

Wenn kendoku die Lösung nur abkupfert obwohl er sie nicht verstanden hat und eventuell als Hausaufgabenlösung benutzt obwohl er sie nicht verstanden hat, so schadet er sich letztendlich nur selbst.

Ich bin hier nicht kendokus Lehrausbilder und wenn ich Lust darauf habe ihm eine fertige Lösung vorzustellen, dann tu ich das auch.;)
 
Danke für deine Lösung,
arbeite erst seit ein paar tage mit Simatik, nun zu Anfang ist es kein einsteiger freundliches Programm.
Mit welchen Tool ist dein Quellcode geschrieben.
 
aw: funktionsbaustein

Funktionsbaustein
eigentlich sollte das ein FB sein aber mein Problem war es wie ich die Bits in ein integer reinkrieg also die Syntax dafür. Die Lösung ist ok Brauche zwar noch etwas um sie ganz zu verstehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn wir schon lösungen präsentieren :rolleyes:

Code:
      L     EB     1
      L     W#16#F
      UW    
      T     MW     2
[edit]
lori hat es seit gestern auf mich abgesehen :cool: er kritisierte, das meine lösung nur funktioniert, wenn der bereich ab E1.0 genutzt wird, das ist soweit richtig, folgende kann man aber einsetzen, wenn der bereich bei E1.2 beginnt ... allerdings müssen sie immer noch zusammenhängen :rolleyes:

Code:
      L     EB     1
      T     MW     2

      L     W#16#2
      L     MW     2
      SRW   
      
      L     W#16#F
      UW    
      T     MW     2
für nicht zusammenhängende bits muß dann halt ein pointer, wie es OHGN vorgeschlagen hat oder eine der möglichkeiten, die zottel vorschlug zum zuge kommen :-D
[/edit]

zum verstehen von OHGN seiner lösung mal Pointer, Zeiger, FIFO, LIFO gucken
 

Anhänge

  • funzt.JPG
    funzt.JPG
    18,7 KB · Aufrufe: 22
Zuletzt bearbeitet:
Bits in Integer reinkriegen: Du nimmst ein Wort im Speicher, kopierst deine Bits hinein und sorgst dafür, daß die übrigen Bits 0 sind. Das Wort ist dann dein Integer.

Wenn es KEIN FB/FC sein müßte, könntest du so vorgehen:
L 0
T MW0 //damit sind alle Bits 0
//
// Nun kopierst du deine auf die passenden Stellen:
//
U bit0
= M1.0
U bit1
= M1.1
U bit2
= M1.2
U bit3
= M1.3

MW0 enthält jetzt das Ergebnis.

Natürlich kannst du diesen Code auch in einen FB/FC packen und deine Aufgabe ist rein technisch gesehen gelöst.
Ein paar Leute werden dir diese Lösung "um die Ohren hauen"...
Warum? Dein Baustein verändert bei jedem Aufruf MW0. Noch schlimmer ist, daß man es ihm von außen nicht ansieht. Andere Leute könnten meinen, daß MW0 oder die Merker 0.0 bis 1.7 noch frei seien.
Früher hat man das so gemacht, meist Merker ab 200 für so etwas benutzt und diese "Schmiermerker" genannt.
Neuere SPSen stellen für Zwischenergebnisse in FCs/FBs Lokalvariablen zur Verfügung. OGHNs Beispiel definiert solch eine Lokalvariable als temp_int. Danach benutzt er Addresszeiger, speichert die Adresse von temp_int darin und addiert den Abstand zum jeweilgen Bit, um einzelne Bits dieser Variablen anzusprechen.

Andere Möglichkeit wären:

- Die absolute Adresse der Variablen temp_int herauszufinden und die Bits mittels
U #bit_0; //Bit_0 in TempVar kopieren
= Lx.0 // x= Adresse der temp_int + 1 !!!!
zu kopieren. Das braucht keinen Zeiger, ist aber gefährlich, wenn man die Schnittstelle des Bausteins ändert.

- Statt der Variablen temp_int 16 Bits als lokale Variablen zu definieren und dann mit dem Adresszeiger ein Integer von der Adresse des ersten Bits zu lesen. Das wären nur ein oder zwei Zugriffe über Zeiger statt 4.
 
Zurück
Oben