Ein Bit aus Doppelwort finden

Flo

Level-1
Beiträge
133
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus zusammen,

mal eine Frage an die S5/S7 cracks.

sorry erst mal für die Überschrift, aber ich weiss nicht was ich mein Problem treffend beschreiben kann.

Ich habe ein Merkerdoppelwort (z.B. MD10).
in dem MD10 ist immer nur ein bit gesetzt (z.B. m10.4).
Das würde ja als Dezimalzahl den WErt 16 ergeben.
Ich würde allerdings gerne das ergebnis 5 bekommen (da es ja das 5.te Bit im MD10 ist, das gesetzt ist).
Möglichkeit 1:könnte man natürlich hergehen und sagen MD10 hat WErt 16, und dann über abfragen die gewünschte Zahl (5) irgendwo zuweisen über lade/transfer Befehl (L 5, T xx).
Möglichkeit 2: Eine Schleife in der das MD10 immer um eine Stelle nach rechts geschoben wird, und in der Schleife eine Variable inkrementieren, die Schleife dann beenden wenn das Bit an erster Stelle steht.
Hoffe ihr versteht meine Erklärung . Geht das nicht irgendwie eleganter und einfacher?
mfg, Flo

 
TI-S7-Lib: FC96 "ENCO"

Dafür gibt es in Step7 eine fertige Function: ENCO
siehe: Bibliotheken > Standard Library > TI-S7 Converting Blocks > FC96 ENCO
(Bibliotheken im KOP/AWL/FUP-Editor einblenden: Strg-G oder Strg-K)

Der FC96 macht genau das, was Du in Deiner Möglichkeit 2 beschrieben hast
(in einer Schleife das Doppelwort rechts schieben bis ein 1-Bit gefunden wird).

Du legst das Doppelword an den Bausteineingang IN und in RET_VAL bekommst Du
die Nummer des niedrigsten gesetzten Bits (0..31).
Achtung: ist das Doppelwort=0 (kein Bit gesetzt), dann wird auch 0 zurückgegeben!

Die Step7-Hilfe zum Baustein ENCO ist allerdings etwas konfus und irreführend.
Lies besser die Bausteinbeschreibung in der PDF: Start > SIMATIC > Dokumentation >
Step7 > STEP 7 - System- und Standardfunktionen für TI-S7-Konverter
(C:\Programme\Siemens\Step7\S7MANUAL\S7STDL2A\S7stdl2a.pdf)

Gruß
Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wozu braucht man sowas?
Brauchst du anschliessend wirklich die Bit-Nr. und nicht das Bit an sich?


Ich würde das wenn möglich mit Symbolischer Adressierung lösen, zb:
ParameterWord MD10 :DWORD
ParamFlag0 M10.0 :BOOL
ParamFlag0 M10.1 :BOOL
ParamFlag0 M10.2 :BOOL

Oder aber in SCL mit einer AT-Sicht
 
Wenn du dir sicher sein kannst dass immer nur ein, und mindestens ein Bit gesetzt ist, geht sowas:

Code:
      L     #dw_in
      DTR   
      SLD   1
      SRD   24
      L     126
      -I    
      T     #bitpos

Ich hatte irgendwann schonmal so eine Schweinerei mit DTR gemacht... :grin:
 
Ich habe ein Merkerdoppelwort (z.B. MD10).
in dem MD10 ist immer nur ein bit gesetzt (z.B. m10.4).
Das würde ja als Dezimalzahl den WErt 16 ergeben.

Hilft dir zwar bei deinen Problem nicht, aber M10.4 auf ein ergibt nicht den Dezimalwert 16 im MD10. M13.4 würde in deinem Beispiel 16dez ergeben, da Siemens die Byte von links nach rechts zählt.

Gruß Woldo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wird ihm schon helfen, denn M10.4 ist ja damit nicht das 5. Bit sondern das 29.


PS: Falls das mal jemand auf der S7-200 machen möchte, die hat auch die von PN/DP erwähnte eingebaute Funktion ENCO, allerdings nur für Word:
Microwinhilfe schrieb:
Die Operation Hexadezimalzahl in Bit wandeln schreibt die Bitnummer des niederwertigsten Bit im Eingangswort IN in das niederwertigste Halb-Byte (4 Bit) des Ausgangsbyte (OUT).
 
Zuletzt bearbeitet:
Hilft dir zwar bei deinen Problem nicht, aber M10.4 auf ein ergibt nicht den Dezimalwert 16 im MD10. M13.4 würde in deinem Beispiel 16dez ergeben, da Siemens die Byte von links nach rechts zählt.

Gruß Woldo

ja,stimmt natürlich, danke. mein fehler

@PN/DP: denke das ist das was ich brauche, danke!

wozu mann das braucht?
nun, ich halte es eigentlich immer so (muss dazu dagen, das ich überwiegend Codesys programmiere) das meine Schrittketten Case- Anweisungen in ST sind.

Das sieht dann in etwa so aus:
Code:
case auto_step of

0:
result_auto_Step:='Hier kommt die Beschreibung des aktuellen Schritts rein';

if .... blabla

1:
usw.

end_case
den String übergebe ich dann direkt ans HMI als Schrittkettenanzeige.
Da ich in S7 die Schrittketten in AWL programmiere wollte ich einfach das Schrittketten DW so auslesen um dann damit eine Schrittbeschreibung zu realiseren.
mfg,Flo
 
Wenn du gerne mit CASE arbeitest, und hier nun mit AWL,
dann solltest du dir die Sprungleiste also den Befehl "SPL" mal näher ansehen.
Der entspräche weitestgehend dem CASE-Befehl.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
die Sprungleiste kenn ich, da wir aber bei uns in S7 fast ausschliesslich mit der "traditionellen" SR Schrittkette arbeiten (ausser wir dürfen/müssen mit Graph), möchte /sollte ich hier der Linie treu bleiben.
Die Schrittkettenbeschreibung möchte ich in der SPS machen, weil ich die alternative (Textlisten) nicht besonders glücklich finde.
trotzdem danke fürn hinweis.
mfg,flo
 
Zurück
Oben