Integer to Binär-Converter in Step 7

Gast #3674553
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
Gast #3674570
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?
Gast #3674578
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 ?
Gast #3674584
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!
Gast #3674589
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
Gast #3674602
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
?
Gast #3674611
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.
Gast #3674615
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?
Gast #3674656
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.
Gast #3674687
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)
#3674693
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
Gast #3674698
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren