Forum: Mikrocontroller und Digitale Elektronik Integer to Binär-Converter in Step 7


von Paul D. (Gast)


Lesenswert?

Hallo, ich möchte in der Simatic Step 7 Sprache ein Int to Binär 
Umsetzter schreiben. In C ist das kein Problemm hier kommt man gut mit 
der Modulo Funktion weiter. Aber wie ist das bei Step 7? Mir wäre zudem 
wichtig, das die Binärzahl als Folge von Bollwerten in einen Array 
steht.
Kennt sich jemand so gut aus, dass er mir Tipps geben kann? Kann ich 
Modulo in der Sprache SCL auch nutzten? Es gibt wohl auch 
Converter-Boxen nur helfen mir diese wenig...

Vielen Dank schonmal,
Paul

von Mike (Gast)


Lesenswert?

Paul D. schrieb:
> Bollwerte

Was ein Bollwerk ist, ist klar.
http://de.wikipedia.org/wiki/Bollwerk

Aber "Bollwerte"?

von Deltal (Gast)


Lesenswert?

Prinzipiell kannst du ja direkt jedes Bit des Wortes ansprechen und dann 
in ein Array schreiben.

MW100

L M100.0
T ARRAY.BOOL [0]
L M100.1
T ARRAY.BOOL [1]

.. oder ist dir das zu simpel? :)

von Deltal (Gast)


Lesenswert?

Ach und "MOD" funktioniert in SCL natürlich auch..

von Paul D. (Gast)


Lesenswert?

Mike schrieb:
> Paul D. schrieb:
>> Bollwerte
>
> Was ein Bollwerk ist, ist klar.
> http://de.wikipedia.org/wiki/Bollwerk
>
> Aber "Bollwerte"?

Spar die deine Spitzfindigkeiten für den Kindergarten am Montag! Es 
sollte natürlich BOOL heißen. Sry Herr Chefoberlehrer.

von Paul D. (Gast)


Lesenswert?

Deltal schrieb:
> Prinzipiell kannst du ja direkt jedes Bit des Wortes ansprechen
> und dann
> in ein Array schreiben.
>
> MW100
>
> L M100.0
> T ARRAY.BOOL [0]
> L M100.1
> T ARRAY.BOOL [1]
>
> .. oder ist dir das zu simpel? :)

OK! Ne das ist das was ich gesucht habe(muss ja nicht mit der Modulo 
Funktion sein)

Im grunde ist der Intwert ja eh so hinterlegt, weshalb es dann 
sinnvoller sein könnte direkt auf die einzelnen Bits zuzugreifen, statt 
erst eine Funktion zu schreiben, der diese Bits bestimmt. Insofern 
vielen Dank!

Müsste man den Array vorher definieren? Also die Größe?

von Deltal (Gast)


Lesenswert?

Jau.. entweder in nem globalen DB oder in der Instanz (STAT) eines 
Funktionsbausteins.

Die SPS prüft dann auch die Grenzen und meckert wenn du z.B. das 17te 
Bit schreiben willst

von Detlef K. (adenin)


Lesenswert?

Wo ist das Problem?
Du hast irgend wo deinen Integer (zB. DB1.DBW100)
Du kannst auf die einzelnen Bits wie in einem Bit-Array zugreifen.
zB. DB1.DBX100.4

: Bearbeitet durch User
von Paul D. (Gast)


Lesenswert?

Deltal schrieb:
> Jau.. entweder in nem globalen DB oder in der Instanz (STAT) eines
> Funktionsbausteins.
>
> Die SPS prüft dann auch die Grenzen und meckert wenn du z.B. das 17te
> Bit schreiben willst

Wie ist das den ganz genau? das Merkerwort MW100 besitzt doch 16 Bits? 
Wie ist dann die ganau Aufteilung?

M100.0 bis ?

von Detlef K. (adenin)


Lesenswert?

M100.0 bis M100.15

von Paul D. (Gast)


Lesenswert?

Detlef Kunz schrieb:
> Wo ist das Problem?
> Du hast irgend wo deinen Integer (zB. DB1.DBW100)
> Du kannst auf die einzelnen Bits wie in einem Bit-Array zugreifen.
> zB. DB1.DBX100.4

Wie würde ich dann bsp. auf das 12te Bit zugreifen (bei einem Word)?

von Paul D. (Gast)


Lesenswert?

Paul D. schrieb:
> Detlef Kunz schrieb:
>> Wo ist das Problem?
>> Du hast irgend wo deinen Integer (zB. DB1.DBW100)
>> Du kannst auf die einzelnen Bits wie in einem Bit-Array zugreifen.
>> zB. DB1.DBX100.4
>
> Wie würde ich dann bsp. auf das 12te Bit zugreifen (bei einem Word)?

Ok hat sich durch obige Antwort erledigt!

von Deltal (Gast)


Lesenswert?

Erstmal meinte ich die Array Grenzen, wenn du 1..16 Felder anlegst und 
versuchst das 17te zu beschreiben, meckert die SPS (Systemfehler).

Ich meine in SCL kannst du auch direkt eine Variable für einen absoluten 
Zugriff nutzen also z.B.

BYTENUMMER := 5;
BITNUMMER := 4;

IF M[BYTENUMMER].[BITNUMMER] THEN
 ...
END_IF;

Musst du mal ausprobieren, sonst halt in ein Array schreiben, da kannst 
halt in jedem Fall drauf zugreifen.

Wichtig ist das der direkte Zugriff auf das erste Bit des zweiten Bytes 
nicht etwa X.8 sondern X+1.0 ist.


MW100

M100.0 bis M100.7 > erstes Byte
M101.0 bis M101.7 > zweites Byte

von Paul D. (Gast)


Lesenswert?

Deltal schrieb:
> Erstmal meinte ich die Array Grenzen, wenn du 1..16 Felder anlegst
> und
> versuchst das 17te zu beschreiben, meckert die SPS (Systemfehler).
>
> Ich meine in SCL kannst du auch direkt eine Variable für einen absoluten
> Zugriff nutzen also z.B.
>
> BYTENUMMER := 5;
> BITNUMMER := 4;
>
> IF M[BYTENUMMER].[BITNUMMER] THEN
>  ...
> END_IF;
>
> Musst du mal ausprobieren, sonst halt in ein Array schreiben, da kannst
> halt in jedem Fall drauf zugreifen.
>
> Wichtig ist das der direkte Zugriff auf das erste Bit des zweiten Bytes
> nicht etwa X.8 sondern X+1.0 ist.
>
> MW100
>
> M100.0 bis M100.7 > erstes Byte
> M101.0 bis M101.7 > zweites Byte

Dann ist Deltefs Antwort doch falsch mit M100.15?

Kann man eine FC so schreiben?:
FC:
VAR_INPUT
   IN1:WORD;
END_VAR

VAR_OUTPUT
   OUT1: ARRAY[0..5] of BOOL;
END_VAR

CODE:
L WORD.0
T ARRAY[0]
L WORD.1
T ARRAY[1]
usw bis

L WORD.5
T ARRAY[5]

BE
?

von Detlef K. (adenin)


Lesenswert?

Ja, meine Antwort war falsch.
Step7 ist ja nur 8Bit.

von Deltal (Gast)


Lesenswert?

X.15 kann man in der Siemens-Welt NICHT direkt ansprechen..


Puh.. glaube so leicht gehts dann doch nicht. Du kannst leider nur auf 
statische Variablen bitweise zugreifen. (Und dann auch nur absolut.. 
nicht symbolisch!)

Ich bin am grübeln ob man das überhaupt in einer Funktion so 
hereinbekommt, die hat halt nur temporäre Variablen. An dieser Stelle 
würde ich dann Ausmaskieren nutzen.

In einem FB könnte man den Instanzbaustein mit absoluter Adressierung 
nutzen.

Oder halt einen Merkerwort nutzen.. dann geht es auch in einer Funktion.


Noch eine Option wäre ein Adresspointer mit Schleife.. das ganze dann in 
AWL würde aber auch statische Variablen benötigen.

von Paul D. (Gast)


Lesenswert?

Deltal schrieb:
> X.15 kann man in der Siemens-Welt NICHT direkt ansprechen..
>
> Puh.. glaube so leicht gehts dann doch nicht. Du kannst leider nur auf
> statische Variablen bitweise zugreifen. (Und dann auch nur absolut..
> nicht symbolisch!)
>
> Ich bin am grübeln ob man das überhaupt in einer Funktion so
> hereinbekommt, die hat halt nur temporäre Variablen. An dieser Stelle
> würde ich dann Ausmaskieren nutzen.
>
>
> Oder halt einen Merkerwort nutzen.. dann geht es auch in einer Funktion.


Wie könnte man den beispielsweise ein Merkerword nutzen?

von Paul D. (Gast)


Lesenswert?

Und was ist mit Ausmaskieren gemeint?

von Mike (Gast)


Lesenswert?

Paul D. schrieb:
> Spar die deine Spitzfindigkeiten für den Kindergarten am Montag!

Es scheinen bei dir, nicht nur unter diesem Aspekt, ernsthafte Lücken 
bei den Grundlagen zu bestehen.

von Paul D. (Gast)


Lesenswert?

Könnte ich nicht den ARRAY direkt als Bits schreiben?  Ich kann doch 
dann die static-Array Elemente mit den Bits verknüpfen oder nicht?

von Paul D. (Gast)


Lesenswert?

Alternativ könnte ich auch denn Intwert vergleichen und dann die 
Ausgangsbits entsprechend der Eingangszahl beschalten. Was allerdings 
aufwendig ist.

von Deltal (Gast)


Lesenswert?

Merker bzw Merkerwörter sind globale Variablen.

Du würdest also in deine Funktion deine Eingangsvariable auf ein 
Merkerwort schreiben

MW100 := ININTEGER;

Dann kannst du da absolut drauf zugreifen und die Werte z.B. in einem 
BOOL Array ablegen.

OUTARRAY[0] := M100.0;

OUTARRAY[15] := M101.7;



Das ganze ist OK, würde ich jedoch nicht machen, wenn ich das ganze als 
universale Funktion nutzen möchte. (Funktion OK, Programmiertechnisch 
böse)

Google mal nach Ausmaskieren, das ist ja auch bei einem µC unter C so 
gang und gebe. Vorteil wäre halt, das man keinen absoluten Zugriff 
nutzt, damit ist das ganze nicht an statische Variablen gebunden. 
Nachteil: viel mehr Code.


Eine SPS hat durchaus Typenprüfungen und so kann man halt kein Typ 
"WORD" einfach in ein Typ "ARRAY OF BOOL" reinkopieren. Will man das 
doch machen, braucht man den absoluten Zugriff auf die Variablen, 
schreibt halt "stumpf"  16 Bit von Adresse XX nach Adresse XY.

Machbar ist vieles, wichtig ist, dass es nachvollziehbar ist. Und da es 
einem Baustein quasi scheißegal ist, ob sich die globale Adressen 
verschoben haben, kann man sich damit auch derbst Ärger ins Boot holen.

von Paul D. (Gast)


Lesenswert?

Aber wenn ich ININTEGER als INPUT definieren muss ich doch von außerhalb 
was draufsetzen? Braucht man dan die Zuweisung?

von Deltal (Gast)


Lesenswert?

Einen IN muss man nicht zwangsläufig immer beschalten (Stichwort 
Vorbelegung)

Frage ist halt ob du eine Funktion haben möchtest, oder die Wandlung nur 
einmal irgendwo im Programm brauchst (dann würde ich keine Funktion 
nutzen)

von Detlef K. (adenin)


Lesenswert?

Hmm, Du kannst ein UDT drüber legen. Das ist so ähnlich wie eine UNION 
in C
so in etwa der Art:
1
TYPE MyBitOverlay
2
STRUCT
3
 Bit_0:bool;
4
 Bit_1:bool;
5
 Bit_2:bool;
6
 Bit_3:bool;
7
... usw.
8
 Bit_15:bool;
9
END_STRUCT ;
10
END_TYPE
11
12
VAR_INPUT
13
DeinInput : INT;
14
DeineBits AT DeinInput : MyBitOverlay ;
15
END_VAR
16
VAR_INPUT
17
Ausgang1 : BOOL;
18
END_VAR
19
20
BEGIN
21
 Ausgang1 = DeineBits.Bit_12;
22
END_FUNCTION_BLOCK

: Bearbeitet durch User
von Paul D. (Gast)


Lesenswert?

Deltal schrieb:
> Einen IN muss man nicht zwangsläufig immer beschalten (Stichwort
> Vorbelegung)
>
> Frage ist halt ob du eine Funktion haben möchtest, oder die Wandlung nur
> einmal irgendwo im Programm brauchst (dann würde ich keine Funktion
> nutzen)

Ja die Wandlung müsste im Grunde nur einmal stattfinden.

von Deltal (Gast)


Lesenswert?

-> Merker nutzen und gut

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.