Programmanwahl über 2 Dekadenschalter

robomann2011

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, bin neu auf dem Gebiet der Programmierung und benötige eure Hilfe!

Ich will eine Programmanwahl für einen Roboter schreiben, also 1-99 mit Parity Bit.

Es existiert bereits ein altes Programm, aber da sind in jedem Netzwerk die Eingänge e0.0-e0.7 aufgeführt und werden dann abgefragt:

Netzwerk:

e0.0 = 0
e0.1 = 1
e0.2 = 0
e0.3 = 0
e0.4 = 0
e0.5 = 0
e0.6 = 0
e0.7 = 0

= Programm 2

usw...

Jetzt würde ich das ganze gern etwas kompakter machen, also nicht 100 und mehr Netzwerke sondern wenn möglich in wenigen Bausteinen zusammen fassen! Gibt es da eine Möglichkeit, oder vielleicht einen Baustein, mit dem ich das machen kann!?

Die Dekadenschalter können 1,2,4,8 ausgeben, also der erste für Einer,- und der zweite für die Zehner Stellen.

Hoffe ihr versteht was ich meine! :ROFLMAO:

danke schon mal für eure Tipps
 
ich weiß jetzt nicht so genau, wo du hinwillst, aber :
Code:
L EB 0  // lädt den Wert des Eingangsbytes als BCD-Wert
BTI  // wandelt das ganze in INT / Dezimal um
T MW 10  // hier steht nun deine Programm-Nummer als Zahl drin und du kannst damit weiter arbeiten

Das ist jetzt aber Code für eine S7. Ggf. hast du ja auch eine S5 ???

Was soll weiter passieren ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hab eine S7 200. Ich kann schon ein wenig programmieren aber für komplexere Sachen reichts dann doch nicht... :(

Im Grunde will ich aus 2 Dekadenschaltern jeweils 4 Eingänge, sprich insgesamt 8 Eingänge eine Programmwahl 1-99 programmieren.

Der Code soll an den Roboter, dort ausgelesen und dann von ihm verarbeitet werden.

E0.0 = 1 / A0.1+A0.7 = Programm Bit + Parity
 
"Die Dekadenschalter können 1,2,4,8 ausgeben"

Ich vermute mal das der erste Dekadenschalter E0.0-E0.3 beschaltet und der für Zehnerstellen E0.4-E0.7, oder?
Das würde bedeuten das lowbyte und highbyte vor der BTI-Operation maskiert werden müssten.
Alternativ zur BTI/Maskierung (falls nicht in S7-200 möglich) kann eine Werteabhängige Addition in AWL schnell und einfach erfolgen.
Die Parität kann 1:1 mit dem untersten Bit also A0.0 verknüpft werden.

MfG MK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin, ich programmiere in FUP, mit AWL hab ich keine Erfahrungen...

Das die Dekadenschalter 1,2,4,8 können ist mir bewusst, habe ja schon ein Program damit laufen... nur streckt sich das leider über knapp 100 Netzwerke...

Das will ich kompakter haben, damit es übersichtlicher wird! ;)

Auch das es sich um einen BDC Code handelt ist mir bewusst! ;)

Ich kann mir vorstellen was du meinst Mäuseklavier, aber ich weiß nicht wie ich es umsetzen soll... :(
 
Hi,
in AWL sehe das ungefähr so aus:

//Zuerst Zehnerstelle
UN E0.4
SPB M20

L 1
+I

M20: UN E0.5
SPB M40

L 2
+I

M40: UN E0.6
SPB M80

L 4
+I

M80: UN E0.7
SPB M1

L 8
+I

//dann Zehnerstelle mit 10 multiplizieren
M1: L 10
* I
//dann Einerstelle zu addieren
UN E0.0
SPB M2

L 1
+I

M2: UN E0.1
SPB M4

L 2
+I

M4: UN E0.2
SPB M8

L 4
+I

M8: UN E0.3
SPB Mend

L 8
+I

//Ergebnis ins Ausgangsbyte schreiben
Mend: T AB 0
//Parität setzen (ungerade)
U A0.0
= A0.7

so aus dem Kopf heraus. In FUP sind die Sprungmarken z.B. M8 Label, die Sprunganweisungen(SPB) JMP. Ca. 10-20 Netzwerke statt über 100 ;-)

MfG MK
 
Zuletzt bearbeitet:
Grrrmmml... :roll:
bei aller Hilfsbereitschaft, doch wenn man bereits weiß, daß es sich um eine S7-200 handelt, dann sollte für die Programmierbeispiele kein S7-Code verwendet werden - die S7-200 versteht den nicht. S7-200-AWL ist einfach zu verschieden.

Parity "gerade" oder "ungerade" heißt nicht gerade oder ungerade Zahl, sondern die Anzahl der 1-Bits ist gemeint!

So, nun Hinweise zur Lösung:

E0.0 ... E0.7 --> A0.0 ... A0.6
Das Umwandeln der 8 BCD-Eingänge 00...99 hex zu 7 Ausgängen 00..99 dez (00..63 hex) gelingt einfach mit der Operation BCDI (BCD_I).

A0.7 = Parity
Ich verstehe den robomann so, daß er "gerade" ("Even") Parity benutzen will, sprich: die Anzahl 1-Bits im AB0 soll gerade sein.
d.h. ist die Anzahl der 1-Bits in den 7 Bits A0.0 bis A0.6 ungerade, dann soll A0.7 = 1 sein, damit die Gesamtzahl 1-Bits gerade ist. Die S7-200 kennt allerdings keine fertige Operation für die Ermittlung des Paritätsbits. Man könnte nun die Anzahl 1-Bits in A0.0 ... A0.6 zählen oder eine vorberechnete Lookup-Tabelle hinterlegen. Tip für clevere Lösung: Ungerade Parität ist das XOR über alle Bits. Für gerade Parität wird das Ergebnis einfach invertiert. Leider kennt die S7-200 auch keine XOR-Bitverknüpfung, nur XORW (WXOR_W) (auch XORB (WXOR_B) ab neuerer Firmware).

NACHTRAG: http://de.wikipedia.org/wiki/Paritätsgenerator

Harald
 
Zuletzt bearbeitet:
@ Harald,
Wenn ich dass BCD_I block in KOP eingibt komme ein rote Markierung unter das EB0 , bei dass FUP oder AWl Ansicht wurde dass NW nicht ausgegeben (Fehler Meldung)

In Beilage ein nicht getestet prog in 21 Netzwerke in FUB, ich denke dass dass auf jede S7200 lauft.


Gruss

Joop
 

Anhänge

  • 2 Decade BCD.pdf
    11,7 KB · Aufrufe: 17
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich dass BCD_I block in KOP eingibt komme ein rote Markierung unter das EB0
Micro/WIN Compiler schrieb:
FEHLER 36: (Operand 1) Die Größe oder der Datentyp ist für den Operanden ungültig.
BCD_I benötigt an IN und OUT jeweils 16-Bit-Werte (WORD oder INT) --> EB0 vorher in eine 16-Bit-Variable oder Akku übertragen.


In Beilage ein nicht getestet prog
Ein schönes "back to the basics", dessen Funktion wohl jeder nachvollziehen kann.
Allerdings fehlt noch eine Prüfung auf ungültige BCD-Werte und in Netzwerk 12 ist noch ein kleiner (Tipp-)Fehler mit EW0 statt 0.


Hier mal eine Variante, wie ich es wohl machen würde (nicht getestet) in AWL. (KOP siehe PDF im Anhang):
Code:
ORGANIZATION_BLOCK MAIN:OB1
TITLE= 
BEGIN

Network 1 // 2 Dekaden BCD-Schalter EB0 --> Programmnummer 0..99 --> A0.0 .. A0.6
// unzulässige Tetraden ergeben Programmnummer 0
LD     SM0.0
LPS
MOVB   EB0, AC0
UENO
BCDI   AC0
LRD
U      SM1.6
MOVB   0, AC0
LPP
MOVB   AC0, AB0

Network 2 // Anzahl 1-Bits in A0.0 .. A0.6 zählen
LD     SM0.0
LPS
MOVB   0, AC0
U      A0.0
INCW   AC0
LRD
U      A0.1
INCW   AC0
LRD
U      A0.2
INCW   AC0
LRD
U      A0.3
INCW   AC0
LRD
U      A0.4
INCW   AC0
LRD
U      A0.5
INCW   AC0
LPP
U      A0.6
INCW   AC0

Network 3 // ungerade Anzahl 1-Bits? --> Parity --> A0.7
LD     SM0.0
SRW    AC0, 1
U      SM1.1
=      A0.7
END_ORGANIZATION_BLOCK

Harald
 

Anhänge

  • 2 Decade BCD PN_DP.pdf
    11,4 KB · Aufrufe: 11
Und hier eine Variante mit XOR-Paritätsgenerator (nicht getestet):
Code:
ORGANIZATION_BLOCK MAIN:OB1
TITLE= 
BEGIN

Network 1 // 2 Dekaden BCD-Schalter EB0 --> Programmnummer 0..99 --> A0.0 .. A0.6
// unzulässige Tetraden ergeben Programmnummer 0
LD     SM0.0
LPS
MOVB   EB0, AC0
UENO
BCDI   AC0
LRD
U      SM1.6
MOVB   0, AC0
LPP
MOVB   AC0, AB0

Network 2 // ungerade Anzahl 1-Bits? --> Parity --> A0.7
LD     SM0.0
LPS
MOVW   AC0, AC1
UENO
SRW    AC1, 4
UENO
XORW   AC1, AC0
LRD
MOVW   AC0, AC1
UENO
SRW    AC1, 2
UENO
XORW   AC1, AC0
LRD
MOVW   AC0, AC1
UENO
SRW    AC1, 1
UENO
XORW   AC1, AC0
LRD
SRW    AC0, 1
LPP
U      SM1.1
=      A0.7
END_ORGANIZATION_BLOCK

Harald
 

Anhänge

  • 2 Decade BCD XOR.pdf
    9,7 KB · Aufrufe: 13
Hallo Harald,


ich arbeite im Service und musste die letzten Tage auf Montage. Sorry das ich erst jetzt Feedback geben kann! :-(

Ich habs so eingespielt, getestet und siehe da... Es funktioniert wunderbar!!!

Genau so hab ich mir das gedacht, PERFEKT! ;)

Danke für die Hilfe! :)

Kannst du mir aber vielleicht noch kurz zu jedem Baustein erklären, was dort genau gemacht wird!? Ich hab das 2 Decade BCD verwendet.

Merci

Robomann
 
Offenbar hast Du nicht meine kurzen Programme sondern das ausführliche Programm von Joop benutzt. (Und den kleinen Programmierfehler korrigiert? Und noch eine BCD-Prüfung eingebaut?) Das Programm von Joop ist eigentlich sowas von selbsterklärend ... was meinst Du mit "zu jedem Baustein erklären, was dort genau gemacht wird!?" ?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ouh stimmt... es war das erste was mir vom Aufbau her gefallen hat und deswegen habe ich es gleich verwendet! ;)

Werde dein PN DP aber auch noch mal testen! :)

Ich bin leider "Anfänger" im programmieren und benötige noch ein paar Informationen zu den einzelnen Netzwerken. Ich sollte das Programm ja auch erklären können! ;)

Das programmieren hatte ich zu letzt vor 7 Jahren in der BS, von daher fange ich quasi bei Null an! ;)
 
Zurück
Oben