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
Paul D. schrieb: > Bollwerte Was ein Bollwerk ist, ist klar. http://de.wikipedia.org/wiki/Bollwerk Aber "Bollwerte"?
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? :)
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.
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?
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
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
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 ?
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)?
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!
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
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 ?
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.
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?
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.
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?
Alternativ könnte ich auch denn Intwert vergleichen und dann die Ausgangsbits entsprechend der Eingangszahl beschalten. Was allerdings aufwendig ist.
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.
Aber wenn ich ININTEGER als INPUT definieren muss ich doch von außerhalb was draufsetzen? Braucht man dan die Zuweisung?
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)
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.