# INT konvertieren in Booleans



## Reto (11 August 2007)

Hallo zusammen

Bei einem FC (geschrieben in AWL) muss ich einen übergebenen Integer umwandeln und in 5 Binären "Leitungen" wieder ausgeben.

Eine möglichkeit wäre ja, mit ==I da jede einzelne Zahl zu überprüfen. Ich denke aber, dass es da eine etwas schönere Möglichkeit geben müsste.

Der Integer kann die Werte von 0 - 31 annehmen.

Jemand ne Idee?

Danke schon im Voraus
Gruss Reto


----------



## zotos (11 August 2007)

Wo ist das Problem?

00    00000
01    00001
02    00010
03    00011
04    00100
05    00101
06    00110
07    00111
08    01000
09    01001
10    01010
11    01011
12    01100
13    01101
14    01110
15    01111
16    10000
17    10001
18    10010
19    10011
20    10100
21    10101
22    10110
23    10111
24    11000
25    11001
26    11010
27    11011
28    11100
29    11101
30    11110
31    11111

Musst ja nur für jede Zahl aus dem Byte das entsprechende Bit nach außen führen.


----------



## Reto (11 August 2007)

Ja schon ... nur muss ich das nun alles abfragen und dann mit Set/Reset zuweisen ?!?

Gruss Reto


----------



## zotos (11 August 2007)

Das ist doch eine Schulaufgabe ;o)

Also Du hast ein Byte und die ersten 5 Bit des Bytes sind die die Du auch nach Außen führen musst. Da gibt es verschiedene Möglichkeiten.

Zeig mal Deinen Ansatz und dann helfe ich auch gerne weiter.


----------



## zotos (11 August 2007)

Nicht die eleganteste Lösung aber um mal eine zu zeigen ;o)

(Es gibt einfachere Wege an die Bits zu kommen)

inZahl ist als Input und Bit0..4 sind die Output:


```
L     #inZahl
      L     1
      UW    
      L     0
      >I    
      =     #Bit0

      L     #inZahl
      L     2
      UW    
      L     0
      >I    
      =     #Bit1

      L     #inZahl
      L     4
      UW    
      L     0
      >I    
      =     #Bit2

      L     #inZahl
      L     8
      UW    
      L     0
      >I    
      =     #Bit3

      L     #inZahl
      L     16
      UW    
      L     0
      >I    
      =     #Bit4
```


----------



## Reto (11 August 2007)

Hm ... Danke für diese Lösung

Ich hab daran rumgesucht, ob ich dieses Byte (was ich aus dem Int habe) irgend wie in ein Boolean-Array kriege ... aber das geht (zumindest so wie ich's versucht haben) irgend wie nicht.  oder doch ?

Gruss Reto


----------



## zotos (11 August 2007)

Reto schrieb:


> Hm ... Danke für diese Lösung
> ...



Halt das ist nur eine Lösung von vielen.

Ich wollte Dir nur aufzeigen wie man das machen kann es gibt auch noch andere Lösungen. Bitte mach Dir noch mal Gedanken wie es noch anders gehen würde.


----------



## Reto (11 August 2007)

Btw. Schulaufgabe isses ned ganz ...
Ich arbeite viel mit der Java / C++-Programmierung und greife so teils auf SPSen zu.

Was ich zurzeit mache ist ne "selbststudium", wenn man dem so sagen kann.
Angesteuert wird damit nen FU ... Positionsnummer angeben und der fährt dann dort hin. Das aber nur als Hintergrundinfo.

Ne andere Lösung wär die Pfahlbauermethode *g*
prüfen, ob 1,3,5,7,9 ... dann Bit 1
prüfen ob 2,3,6,7 ... dann Bit 2, etz.

Etwas was mir auch noch innen Sinn gekommen war ist, dass ich's ganze innen MW (z.B. mw100) hätte schreiben kommen und anschliessend mit m100.3 (z.B.) das bit auslesen.

Nachteil davon ist, dass ich extra nen MW dem FC übergeben muss. Wenn's mir recht ist, geht das ja so nicht direkt im FC drinnen ... oder?

Gruss Reto


----------



## MSB (11 August 2007)

Hier auch noch eine Lösung:


```
L     P##WERT_IN
      LAR1  

      U      [AR1,P#0.0]
      =     #Bit_0

      U      [AR1,P#0.1]
      =     #Bit_1

      U      [AR1,P#0.2]
      =     #Bit_2

      U      [AR1,P#0.3]
      =     #Bit_3

      U      [AR1,P#0.4]
      =     #Bit_4
```

Wert_IN ist deine interne Integer-Variable,
die Adresse lädst du in das Adressregister,
und greifst mit dem Pointer dann auf die Bits des Wertes zu.

Mfg
Manuel


----------



## Reto (11 August 2007)

Das is nen Interessanter ansatz 
Gefällt mir ...

ist LAR zu verlgeichen mit dem Akku eines uCs (oder ist er das sogar) ?


----------



## Reto (11 August 2007)

Man sollte erst denken, dann F1 drücken und erst dann posten 
AR = Adressregister, welches mit LAR1 den Akku1 lädt ^^

Danke trotzdem *pfeif*


----------



## zotos (11 August 2007)

Reto schrieb:


> ...
> Etwas was mir auch noch innen Sinn gekommen war ist, dass ich's ganze innen MW (z.B. mw100) hätte schreiben kommen und anschliessend mit m100.3 (z.B.) das bit auslesen.



Die Aufgabe ist an sich ja wirklich simpel. Aber wenn man es komplett kapseln will und keine globalen Variablen (wie Merker in dem FC) verwenden will ist sie schon etwas komplexer.

Ich bin wohl zu misstrauisch und will niemandem für die Schule fertige Lösungen geben. Darum war meine Lösung bewusst etwas Aufwendig aber sauber gehalten.

Die Lösung vom Kollegen MSB ist schön hat aber noch einen kleinen Schönheitsfehler. Der Kollege HDD hat gerade im Chat bemerkt das man besser das AR1 "retten" sollte. Also zuerst das AR1 in eine Temp-Variable sichern und am ende des Bausteins zurück schreiben.


----------



## Reto (11 August 2007)

Wozu retten?

Wird das für System-Dinge gebraucht? Oder was wird damit normalerweise verarbeitet?


----------



## MSB (11 August 2007)

Beim AR1 ist es IMHO nicht nötig was zu retten, aber hier ein Thread der deine Frage prinzipiell beantworten sollte:
http://www.sps-forum.de/showthread.php?t=1464

Mfg
Manuel


----------



## HDD (12 August 2007)

Guten Morgen,
also das stimmt nicht ganz es gibt schon Situationen bei denen man es Retten muss.
Berger schreibt hierzu:
AWL verwendet das AR1 um auf Bausteinparameter zuzugreifen, die als DB-Zeiger übergeben werden. Bei Funktionen sind dies alle Bausteinparameter mit zusammengesetztem Datentyp und bei Funktionsbausteinen Durchgangsparameter mit zusammengesetztem Datentyp.

Wenn Sie also auf einen derartigen Bausteinparameter zugreifen, z.B. um eine Bitkomponente einer Struktur abzufragen oder einen INT-Wert zu einer Feldkomponente zu schreiben, wird der Inhalt des AR1 verändert, und nebenbei bemerkt auch der Inhalt des DB-Registers.
Dies trifft auch zu, wenn Sie Bausteinparameter mit diesem Datentyp an aufgerufene Bausteine „weiterreichen“.

Verwenden Sie das AR1, so darf zwischen dem Laden des AR1 und der indirekten Adressierung kein oben beschriebener Zugriff auf einen Bausteinparameter erfolgen. Andernfalls müssen Sie den Inhalt des AR1 retten.

HDD


----------



## sps-concept (12 August 2007)

*Bits*

Moin!

Also wenns in einem komplett eigenständigen FC gemacht werden soll dann versteh ich den ganzen Aufwand mit Adressregister usw gar nicht. Da würde ich das über Lokaldaten machen. Wenn man der Meinung ist in den Lokaldaten nachträglich rumzuschieben muss man eben die Zuweisungen nachziehen - Aber wer schiebt noch in so nem simplen Baustein rum?

L #IN
T LW0

U L1.0
= #BIT0

U L1.1
= #BIT1

U L1.2
= #BIT2

U L1.3
= #BIT3

U L1.4
= #BIT4

André


----------



## zotos (12 August 2007)

sps-concept schrieb:


> ...
> Also wenns in einem komplett eigenständigen FC gemacht werden soll dann versteh ich den ganzen Aufwand mit Adressregister usw gar nicht. Da würde ich das über Lokaldaten machen.
> ...



Manche Programmierer halten die Variante mit den Lokaldaten allerdings für sehr unsauber (zu recht).

Die Lösung mit dem AR1 plus Sichern und Rückschreiben ist IMHO die beste Variante.


----------



## sps-concept (12 August 2007)

*Bits*

ich halte das nicht für unsauber solange es in einem abgeschlossenen Baustein passiert. Das mit dem Adressregister halte ich in dem konkreten Fall für "mit Kanonen auf Spatzen geschossen". Aber jeder hat seine eigenen Ansichten. Manche halten ja auch KOP für sittenwidrig....

André


----------



## Stollentroll (12 August 2007)

*Sittenwidrig?*

Weder das verwenden von Lokalen Daten noch der Einsatz von KOP ist sittenwidrig. In KOP lässt sich alles Lösen un zwar so das es jeder versteht.
Wer einen Schaltplan lesen kann versteht auch KOP. Dabei kann man doch so schön bei KOP den Überblick behalten. Ich fahre oft auch die Linien mit dem Finger nach damit ich nicht in der Zeile verrutsche.
Die Herren Programmierer sind einfach zu elitär. AWL und Pointer das hat nichts mit spsprogrammieren zu tun. Nur leute die studiert haben nutzen so einen Mist. 

KOP klappt immer und auf allen Steuerungen. 

Die Beste Lösung von allen! :


----------



## repök (12 August 2007)

Stollentroll schrieb:


> Weder das verwenden von Lokalen Daten noch der Einsatz von KOP ist sittenwidrig. In KOP lässt sich alles Lösen un zwar so das es jeder versteht.
> Wer einen Schaltplan lesen kann versteht auch KOP. Dabei kann man doch so schön bei KOP den Überblick behalten. Ich fahre oft auch die Linien mit dem Finger nach damit ich nicht in der Zeile verrutsche.
> Die Herren Programmierer sind einfach zu elitär. AWL und Pointer das hat nichts mit spsprogrammieren zu tun. Nur leute die studiert haben nutzen so einen Mist.
> 
> ...


 
Recht hast du!
Das garstige AWL oder noch garstigere SCL ist was für Querdenker die nichts andre s im kopf haben.


----------



## MSB (12 August 2007)

@Stollentroll
 Werter Stollentroll, du schreibst 2 Beiträge in diesem Forum, in beiden Beiträgen bezichtest
du andere zu dämlich für irgend was zu sein, alles furchtbar kompliziert zu machen.
Denk mal darüber nach.

Bei deiner Aussage zu AWL und Pointern komme ich zum Ergebnis,
du kennst dich einfach nicht damit aus, und deswegen ist das alles so ein
schickimicki Kram für dich.

Sicher haben auch grafische Programmiersprachen ala KOP/FUP gelegentlich Vorzüge,
aber sicherlich nicht immer und nicht grundsätzlich, und schon gar nicht bei Siemens,
bei Allen Bradley oder Codesys evtl.

P.S. @repök du hast bei andre s einen Tippfehler 

Mfg
Manuel


----------



## MW (12 August 2007)

Stollentroll schrieb:


> Weder das verwenden von Lokalen Daten noch der Einsatz von KOP ist sittenwidrig. In KOP lässt sich alles Lösen un zwar so das es jeder versteht.
> Die Herren Programmierer sind einfach zu elitär. AWL und Pointer das hat nichts mit spsprogrammieren zu tun. Nur leute die studiert haben nutzen so einen Mist.
> 
> KOP klappt immer und auf allen Steuerungen.
> ...


 
 Is ja nen ding, also nutzen nur Leute die studiert haben AWL und Pointer ??
Ich hab nicht studiert und muss auch AWL nutzen 

Es ist eben nicht überall möglich alles mit KOP zu lösen !!!!!!!

Das mit den Pointern is auch gut, hast du es schonmal mit vielen daten zu tun zb. Daten kopieren,
oder musstest du schon mal daten über ein Netzwerk senden und empfangen, spätestens da wird dir auffallen, dass nich alles ohne AWL und Pointer geht !!!!!!!!!!!

Sei froh das der UG nicht da ist, der hätte jetz auch nen guten spruch auf Lager


----------



## sps-concept (12 August 2007)

*Bits*

also im Gegensatz zum Code von MSB funktioniert meiner ja..  Aber wenn da die Abfrage aufs Lowbyte geändert wird dann geht der auch. 

@MSB: brauchst aber deswegen nicht deinen Namen in LSB ändern ;-)

@spezielle Leute: bei jeder Gelegenheit irgendwie den Namen André immer wieder einbauen um mich irgendwie lächerlich zu machen - das könnt ihr gerne sein lassen!



repök schrieb:


> Recht hast du!
> Das garstige AWL oder noch garstigere SCL ist was für Querdenker die nichts andre s im kopf haben.


 
Die Meinung von Stollentroll kann ich nur bedingt teilen. Ohne AWL und Pointer ist nur Schmalspur möglich.

André


----------



## MSB (12 August 2007)

@André
Du musst aber zugeben,
dass sich *M*ost*S*ignificant*B*yte einfach besser anhört. 

P.S. Da komm ich dank Siemens wirklich gelegentlich durcheinander,
keine Ahnung welcher Trottel sich das einfallen hat lassen, das
MSB und LSB vertauscht sind.
Eigentlich führt das nur zu Schwierigkeiten, vor allem im Datenauschtausch mit anderen Steuerungen.

Aber jetzt tu mal hier nicht mit so Insideranspielungen anfangen, alter,
hier hat schließlich keiner Studiert. 

Mfg
Manuel


----------



## Stollentroll (12 August 2007)

@MSB: Also wie sps-concept richtig erkannt hat ist die Pointer Variante völlig überzogen ("mit Kanonen auf Spatzen geschossen"). Warum soll man da jemand mit Pointern Quälen? Bei solch leichten Aufgaben machen das nur Leute die Angeben wollen. 

@MW: Klar kann man nicht alles in KOP machen man kann auch einiges mit Pointern lösen. Aber man muss nicht an jeder Ecke beweisen das man es kann. Und der ist UG?

@sps-concept: Fachlich gebe ich Dir absolut recht. Aber das mit Deinem Namen leuchtet mir gerade nicht ein. Wo stellt Dich hier jemand als lächerlich dar?


----------



## MSB (12 August 2007)

Das mit UG und Andrè's Namen kannst du als ziemlich neuer Benutzer nicht wissen,
es steht dir aber frei mal nach Beiträgen von "Unregistrierter Gast" zu suchen.

Vorteil an der Pointer Variante:
Ich muss mir auch bei einem größeren Baustein keine Gedanken um die Adressierung von
irgendwelchen Lokalvariablen machen.
Auch wenn man eine Lokalvariable irgendwo einfügt funktioniert die Pointervariante immer noch,
während du die Lokaladressen u.U. anpassen musst.

Was heißt überzogen, ich behaupte mal das viele sowohl bei Pointern nicht durchblicken,
sowie ebenso viele die nicht wissen, was es mit den L's auf sich hat.

Mfg
Manuel


----------



## OHGN (13 August 2007)

Die Meinungen zum direkten Zugriff auf Temp-Var`s gehen halt etwas auseinander.

http://www.sps-forum.de/showpost.php?p=81525&postcount=11

Ich persönlich halte es eher auch mit der Lösung von sps-concept, weil mir dieses ganze Pointer-gedrisse ganz einfach zu umständlich ist.
Ich denke jeder sollte das handhaben wie er will.


----------



## Ralle (13 August 2007)

Will auch noch Senf dazugeben.

Sicher ist das hier einfach und die Variante mit dem AR1 die, die überzogen scheint. (Der Code ist auch nicht länger, man muß es nur mal verstehen). Ich hab erst vor ein paar Tagen die ganzen Lokaldatenzugriffe aus meinen Standardbausteinen rausgeschmissen, weil ich einfach die Nase voll hatte, immer bei Änderungen an den Lokaldaten, zu kontollieren, ob sich die Bereiche nicht verschoben haben und anschließend die Zugriffe auf die Lokaldaten alá U L10.3 zu korrigieren. Mir einem halbwegs verständlichen Kommentar dahinter versteht das _fast_ jeder Programmierer. Es ist auch nie zu früh, sich einen sauberen Programmierstil anzugewöhnen, bzw. ihn einzuführen und der Zugriff über das AR ist hier in jedem Falle sauberer, wenn auch nicht zwingend notwendig.


----------



## TommyG (13 August 2007)

Ich liebe

diese Diskussionen über sauber und sauber...

meist erkennt man an den Proggies der 'anderen' in wie weit man 'um die Ecke' denken kann. Ich versuche mir soviel Gutes wie möglich abzugucken.

Da die Fraks, mit denen ich zu tun habe, es LIEEEEBEN mit DB's rumzuferkeln, hier mein Lösungsansatz:

Lade das Merkerword
Transferiere es in nen DB
VerUNDe die Bits des Wortes mit den Ausgängen

fertisch

Mit dem 'Style' handlen wir unsere Übergaben zwischen den Steuerungen, der Visu, den 'anderen'. funzt eigentlich ganz gut, und Du kannst 'mit der Brille' den Bits auf den Hintern gucken.. 

Aso: LSB/ MSB:
Jop, da bekomm ich auch regelmäßig die Krätze. Immerhin müssen wir das Prob an einem Wert ausprobieren, der Rest ist dann identisch...

also TAD/ TAW...

Greetz, Tom


----------



## zotos (13 August 2007)

@Ralle: 100% Ack (einem Geizhals wir Dir gebe keine Danke mehr)



Ralle schrieb:


> ...
> Es ist auch nie zu früh, sich einen sauberen Programmierstil anzugewöhnen, bzw. ihn einzuführen
> ...



Klasse Spruch!


----------



## Ralle (13 August 2007)

zotos schrieb:


> @Ralle: 100% Ack (einem Geizhals wir Dir gebe keine Danke mehr)



Macht nix, ich schreib hier nicht wegen der Dankesbezeigungen bzw. Danksagungs-Zählvariablen des Forums . Mir reichen dann immerhin gerade so die monetären Danksagungen von hoffentlich zufriedenen Kunden (noch mehr ).



zotos schrieb:


> @Ralle:
> Klasse Spruch!



Muß ich den nun in meine Signatur aufnehmen :s8:?

PS: Hast du neuerdings Schiß vor mir, daß du immer abhaust, wenn ich ins Forum komme und dich nicht ins Chat traust?


----------



## zotos (14 August 2007)

Ralle schrieb:


> ...
> PS: Hast du neuerdings Schiß vor mir, daß du immer abhaust, wenn ich ins Forum komme und dich nicht ins Chat traust?




Wer hat den das ganze Wochenende im Tarnmodus verbracht?

Also ich war gestern Abend im Chat un habe über Dich gelästert ;o)


----------



## Ralle (14 August 2007)

zotos schrieb:


> Wer hat den das ganze Wochenende im Tarnmodus verbracht?
> 
> Also ich war gestern Abend im Chat un habe über Dich gelästert ;o)



/OffTopic
Hatte ich dir doch gesagt, ich war beim Mera Luna Festival in Hildesheim !

Ja, ja, wer lesen kann ... 

OffTopic/


----------



## Reto (6 Oktober 2007)

Danke euch allen mal für die Informativen Posts 

Mit Pointern hab ich eigentlich keine Probleme (ist ja fast wie in C) ... dachte ich zumindest 

Ich hab dann auch die Variante LAR1 eingesetzt und alles hat bestens funktioniert. Heute aber ... spiel ich meinen Baustein auf ne andere CPU ... und ALLE Bits (dahinter) sind 0 ... gleicher Baustein auf die erste CPU, alles geht.

Ich versteh gerade die Welt nicht mehr ... Beides ne 315-2DP, nur dass die, worauf's geht etwa 5 Jahre älter ist.

Ich hab's bei der neuen CPU nun mit dem UW gelöst ... aber irgend wie kann ich mir das so recht nicht erklären.

Jemand ne Idee?

Gruss Reto


----------



## Oberchefe (7 Oktober 2007)

was bitte soll in KOP nicht möglich sein?

Da braucht man übrigens keinen extra FC um auf ein Bit einer Variable zuzugreifen (zumindest bei Allen Bradley/Rockwell), da kann man einfach das entsprechende Bit adressieren.


----------



## Reto (7 Oktober 2007)

Oberchefe schrieb:


> was bitte soll in KOP nicht möglich sein?
> 
> Da braucht man übrigens keinen extra FC um auf ein Bit einer Variable zuzugreifen (zumindest bei Allen Bradley/Rockwell), da kann man einfach das entsprechende Bit adressieren.



Direkt Addressieren geht nur, wenn du auch direkten Zugriff auf die Variable hast (z.B. nen MW) ... innem FC drinnen hab ich das aber nicht.
Der FC ist auch nicht nur dafür zuständig ... der macht die Kommunikation mittels SFC14 und 15.

Wer sagt was von KOP?
KOP ist gut und recht, hat abe, wie FUP seine Nachteile. Nur ein kleines Beispiel ... ich mach nen relativ umfangreiches Programm und ruf im OB1 20 FCs auf ... mach ich das mit FUP muss ich je FC ein eigenes Netzwerk dafür einrichten und die ersten 5 A4-Seiten sind gefüllt. Mit KOP sieht's ähnlich aus. Bei AWL dagegen sind das 20 simple zeilen à la "CALL FC120".
Dafür ist KOP wiederum übersichtlicher wenn es um grosse Verschachtelungstiefen geht ... so hat jede Beschreibungssprache ihre Vorzüge ...


ABER: Darum geht's garned!


----------



## Oberchefe (7 Oktober 2007)

> ich mach nen relativ umfangreiches Programm und ruf im OB1 20 FCs auf ... mach ich das mit FUP muss ich je FC ein eigenes Netzwerk dafür einrichten und die ersten 5 A4-Seiten sind gefüllt. Mit KOP sieht's ähnlich aus.


 
Hast Du jemals KOP gesehen oder kennst Du es nur vom "Hörensagen"?
Oder kennst Du KOP nur von Moeller Easy oder dergleichen?


----------



## zotos (7 Oktober 2007)

Ich weis es geht hier um Siemens. Aber dank dem Kollegen Oberchefe trau ich mich nun auch mal ein KOP bild rein zustellen. Bei CoDeSys geht der Bitzugriff auf eine Integer variable übrigens in dem man einfach die Bit nummer mit einem Punkt anhängt.

Und so sieht das in KOP aus mit 5 Netzwerken (die fünf niederwetigsten Bit einer Integer Variable auf fünf Bool Variablen geschoben):


----------



## Reto (7 Oktober 2007)

Haha ... Witz komm raus, du bist umzingelt ...

Ich kenne KOP nicht nur vom Hören sagen ... aber du siehst vieleicht selbst an deinem Bild, dass das nicht sehr übersichtlich ist, wenn du mehr als 3 Bausteine aufrufst.
Aber nochmal ... jede Sprache hat so ihre vorzüge ... so seh ich zumindest. Wenn du das nicht so sehen magst, lass es. Aber danke trotzdem, dass du dich konstruktiv einem Problem annimmst.

@Zotos ... geht bei Siemens auch, aber nicht gekapselt ... das geht nur, wenn das effektiv nen MW ist ... nicht aber in nem FC, wo man "nur" In-Variabeln, etz hat.


----------



## R.Blum (18 Oktober 2007)

Schon mal über den Befehl SPL nachgedacht ?


----------



## MSB (18 Oktober 2007)

@R.Blum
Nicht das ich den Befehl SPL nicht kennen würde,
ich verwende den gelegentlich, oder ziemlich häufig bei Schrittketten.

Inwiefern mir SPL jetzt bei diesem "speziellen" Problem helfen sollte, ist mir irgendwie nicht klar.

Mfg
Manuel


----------



## R.Blum (18 Oktober 2007)

Mit dem Befehel SPL ist es doch einfach möglich, anhand des INT Wertes eine Sprungmarke anzuspringen, die dann auf eine Konstante zeigt und mit einem weiteren Sprung das gewünschte Bitmuster ausgibt.


----------



## sps-concept (18 Oktober 2007)

*Spl*

das stimmt wohl. Ist aber in diesem konkreten Fall sinnlos weil die Konstante dem Wert enspricht mit dem über SPL gesprungen wird. Und um diesen Wert dann auf einzelne Bits auszugeben muss man ihn trotzdem "zerpflücken".

André


----------



## MSB (18 Oktober 2007)

Coole Sache,
du meinst das so wie ich mir das vorgestellt habe.

Aus ca. 6 Netzwerken, machst du also ca. 35 Netzwerke.

Das nennt man dann speichereffiziente Programmierung ?  :???:

Mfg
Manuel


----------



## Reto (19 Oktober 2007)

OK ... dachte schon, ich sei der einzige, der nicht gestiegen ist ^^
Aber vieleicht haben wir auch was übersehen ... lassen wir uns doch mal überraschen


----------



## R.Blum (19 Oktober 2007)

*SPL 35 Netzwerke, Wieso? Ein einziges reicht*

// Integerwert laden der zu einem x-beliebigen Bitmuster zerlegt werden soll
L MW 10
// Über die Sprungleiste wird zu dem auszugebenden Bitmuster verzweigt
SPL Ende
SPA x000
SPA x001
SPA x002
SPA x003
// und hier alle anderen 4..29
SPA x030
SPA x031
Ende: SPA x000
// Bitmuster laden welches abhängig vom Intergerwert ausgegeben werden soll
x000: L 2#0
SPA Out
x001: L 2#1
SPA Out
x002: L 2#10
SPA Out
x003: L 2#11
SPA Out

// Hier gehören alle anderen (4 ..29) Bitmuster hin

x030: L 2#11110
SPA Out
x031: L 2#11111
SPA Out
// Ausgabe des Bitmusters
Out: T AB 10

Oder noch einfacher:

L MB10
T AB10

Dann kann man das Bitmuster natürlich nicht anpassen

Wenn die restlichen Bits bereits verwendet wurden gehts beispielsweise so:

L AB10
L 2#11100000
UW
T #Speicher

L MB10
L 2#11111
UW
l #Speicher
OW
T AB10

Das masieren Des MB 10 kann man sich sparen, wenn sichergestellt ist, dass die restlichen Bits 0 sind.

durch schieben und entsprechdendes maskieren läßt sich so jede gewünscht Bitkonstellation verarbeiten.


MfG
Rolf


----------



## sps-concept (19 Oktober 2007)

*Beispiel*

Hallo Rolf,

bitte mal das Ausgangsposting lesen. Es soll ein Baustein sein wo als Eingang 1 INT ist und als Ausgang 5 BOOL dranstehen.

André


----------



## R.Blum (19 Oktober 2007)

Also bei allem Respekt,

es geht hier um Lösungsansätze. Es wurden bereits Anregungen gegeben, ein wenig eigener Gehinschmalz schadet auch nicht.

Ob das Ergebnis nun direkt in einem AB steht oder wie im 9. Post von MSB
kombiniert wird, bleibt doch jedem selbst überlassen.

Die elegante Möglichkeit die Internetgemeinschaft zu befragen und an Lösungen für diverse Probleme zu kommen gab es zu meiner Zeit noch nicht. Da durfte man sich die Würmer selbst aus der Nase ziehen.

Wenn man dann sein Wissen an Kollegen weitergibt und zu hören bekommt
Zitat" Wie kommt man nur auf so was", merkt man, dass sich das Gegenüber kaum bis garkeine Gedanken gemacht hat.

MfG
Rolf


----------



## Reto (19 Oktober 2007)

Wenn ich dein Ansatz richtig verstanden hab, setzt du immer alle Ausgänge auf einmal (z.B. 2#10010).
Wenn ich mich nicht irre, geht dies aber nur, wenn man z.B. ein Merkerwort beschreibt ... da würde aber auch ein direkter Bit-Zugriff funktionieren ...
Gekappselt in einem FC kann ich ja keine Bits direkt aus einem Byte erreichen.

ODer nicht ?


----------



## R.Blum (19 Oktober 2007)

Sicher, ich beschreibe ein Merkerbyte, oder auch -Wort oder Doppelwort, das ist schon richtig, kann aber genauso gut im Ausgangs oder Datenbereich liegen.

Für die ursprüngliche Aufgabenstellung ist es schon richtig, dass man die Bits wieder zerpflücken muss. Hierzu habe ich ja auf das Posting #9 von MSB verwiesen.

Man kann aber über Pointeradressierung, hier gibt es verschiedene Arten, Bits einzeln ansprechen. Hierzu mal die Onlinehilfe zu Rate ziehen.

In diesem speziellen Fall 5 x Out auf BOOL aber nicht praktikabel.

Pointerartihmetik ist übrigens in der Onlinehilfe schön beschrieben.
Da gibt es die Varianten mit fertigem Any-Pointer als Quelle oder Ziel
und die entgegengesetzte Seite wird zusamenngebaut.
Für mich recht anschaulich, so hab ichs jedenfalls gelernt. Muss jeder für sich entscheiden ob mans mag oder nicht.
Bei Programmierfehlern kann es jedoch kräftig hageln, weil man das kaum wiederfinden kann, Querverweise gibt es ja keine, da alles berechnet wird.

Mfg
Rolf


----------



## Perfektionist (24 Oktober 2007)

mein Programmvorschlag:

L #IN
SLW 12 // Bit 4 in A1 schieben
U >0
= bit4
SLW 1
U >0
= bit3
SLW 1
U >0
= ....


----------



## PsYchO_LoGiC (5 Dezember 2007)

mahlzeit!

kann mir jemand einen ansatz in scl zu dem thema geben?

habe eine 3-stellige bcd-zahl (als word), die ich in s5time ausgeben möchte ohne den fc40 hernehmen zu müssen. sozusagen bit-schieberei

ich sag schon mal danke 

mfg


----------



## zotos (5 Dezember 2007)

PsYchO_LoGiC schrieb:


> mahlzeit!
> 
> kann mir jemand einen ansatz in scl zu dem thema geben?
> 
> ...



Für was willst Du denn das machen? Also BCD und s5time (=Steinzeit) tifft die Gegenwart? 

Wenn Du den Zeitwert doch schon in BCD hast (*kotz*) dann musst Du doch nur noch das die passenden Zeitbasis Bits in dem WORD Manipulieren also Bit 12 und 13.


----------



## PsYchO_LoGiC (5 Dezember 2007)

das problem ist bloß, dass ich in dem baustein die zeitwerte mehrmals ausgeben muss und ich den baustein ziemlich oft im programm verwenden muss. ich möchte durch das s5time-format speicherplatz sparen,  da die vorhandene cpu nicht die leistungsstärkste und der speicherbereich schon relativ ausgelastet is.



zotos schrieb:


> Wenn Du den Zeitwert doch schon in BCD hast (*kotz*) dann musst Du doch nur noch das die passenden Zeitbasis Bits in dem WORD Manipulieren also Bit 12 und 13.



das mit der zeitbasis ist mir schon klar 
ich arbeite hier mit ein- und ausgangsvariablen. und die anweisung INT_TO_S5TIME gibts leider nicht. ansonsten bringt das programm mir immer die meldung "ungültiger datentyp". deswegen wollte ich die zahl in BCD codieren und die bits einzeln in die s5time variable schieben. hab inzwischen schon so etwas ähnliches gefunden, was mit arrays gelöst wurde. werde das mal ausprobieren

mfg


----------



## zotos (5 Dezember 2007)

Um was geht es denn genau?
Ich bin mir sicher das man da eine Zeitgmäße Lösung findet.

Also Du brauchst Zeitglieder in einem FC oder einem FB?
Welcher Typ: Ein- oder Ausschaltverzögert? 

Wie genau soll die Auflösung sein 1ms 10ms 100ms 1s oder Umgekeht wie groß soll der Range sein? ca.:  0..65s oder 0..650s 0.. 6500s oder mehr?


----------



## PsYchO_LoGiC (5 Dezember 2007)

ja, da bin ich mir auch sicher 
bin gerade dabei mich in komplexere programmierung und in scl einzuarbeiten. ich kenn bis jetzt nur relativ einfache schrittketten und simple lade- und transferoperationen. deswegen geh ich auch öfters kompliziertere wege, um bestimmte techniken kennenzulernen. (mein chef is zu knickerig um mir ne richtige schulung zu bezahlen...)

es geht hier eigentlich um eine zeitmessung der bearbeitungszeiten von einzelnen stationen eines rundtisches. das ganze soll wenn möglich in einem fc geschehen mit start- und stop-signal und einem ausgegebenen zeitwert. diese wird dann am ende des bearbeitungszyklus am op angezeigt (TP170A).
hier reicht eine genauigkeit von 0,1s (0,01 wär natürlich auch spitze) und länger als 5s sollte es insgesamt nicht dauern.

das mit dem zeit messen an sich hab ich soweit schon verstanden (mit OB1_PREV_CYCLE, danke für das beispiel zotos ). der wunsch ist aber, dass die neue zeit erst dann angezeigt werden soll, wenn der messvorgang abgeschlossen ist. davor soll man noch die alte gemessene zeit sehen können. deswegen wollte ich den zählwert erst zwischenspeichern (IN_OUT-variable) und erst beim stop-signal in den eigentlichen Ausgang schreiben. und diesen wollte ich eben im s5time format ausgeben.

ich könnte es natürlich viel einfacher machen, wenn ich die zahl direkt ausgeb, aber ich wollte gern die "bit-schieberei" kennenlernen. 
bin aber natürlich für jeden anderen vorschlag offen 

mfg


----------



## zotos (5 Dezember 2007)

Also wenn man einen INT Wert nimmt kann man ja bis 32767ms Zählen was ja 32s entspricht die Genauigkeit liegt aber nicht im ms bereich sondern hat eine Abweichung der in der Größenordnung von einem OB1-Zyklus liegt. 

Ich habe mit Absicht zu INT gegriffen, da ich mich weigere nur weil Siemens kein UINT zur Verfügung stellt mit WORD zu rechnen.

Die Anzeige auf dem TP könnte nun in ms erfolgen oder eben passend mit einem Komma/Punkt maskiert das man die Angabe in s mit Komma erhält.


```
FUNCTION FC124 : INT (* Rückgabewert ist die Zeit ist in ms *)

VAR_INPUT
  START     :BOOL;  (* Signal START = True Zeit wird genullt und die Messung startet *)
  STOPP     :BOOL;  (* Signal STOPP = True Zeit wird als Rückgabewert gesetzt und die Messung gestoppt *)
  OB1Cycle  :INT;   (* Variable OB1_prev_cycle aus dem OB1 *)
END_VAR

VAR_IN_OUT          (* Bei einem FC VAR_IN_OUT und in einem FB einfach nur VAR *)
  ET        :INT;   (* Verstrichene Zeit *)
  RUN       :BOOL;  (* Die Messung läuft *)
END_VAR


IF START AND NOT RUN THEN
  RUN := TRUE; (* Die Messung wird gestartet *)
  ET  := 0;    (* Die Zeit wird genullt *) 
END_IF;

IF RUN THEN
  ET := ET + OB1Cycle; (* Die Zeit wird aufaddiert *)
  FC124 := 0;          (* Rückgabe gleich Null *)
ELSE
  FC124 := ET;         (* Rückgabe der gemessenen Zeit in ms *)
END_IF;

IF STOPP THEN 
  RUN := FALSE; (* Messung wird gestoppt *)
END_IF;

END_FUNCTION
```

Den Überlauf könnte man auch recht einfach noch realisieren die Frage wäre dann aber wie man reagiert.


----------



## PsYchO_LoGiC (5 Dezember 2007)

vielen dank 

werds morgen gleich mal ausprobieren

schönen abend noch!
mfg


----------



## PsYchO_LoGiC (17 Dezember 2007)

sooo... bin jetzt endlich mal dazugekommen, das ganze mal auszuprobieren. jetzt stehe ich bloß vor einem seltsamen problem. hier erstmal der code des bausteins, falls das helfen könnte

```
FUNCTION FC155 : VOID
TITLE = 'Zeitmessung'

VAR_INPUT
    Start       :BOOL;
    Stopp       :BOOL;
    Reset       :BOOL;
    OB1_Cycle   :INT;
END_VAR

VAR_OUTPUT
    ZW          :INT;
END_VAR

VAR_IN_OUT
    ET          :INT;
    RUN         :BOOL;
END_VAR


IF Start AND NOT RUN AND NOT Stopp THEN
    RUN := TRUE;
    ET := 0;
END_IF;

IF RUN AND NOT Stopp THEN
    ET := ET + OB1_Cycle;
END_IF;

IF Stopp THEN
    ZW := (ET + 5) / 10;
    RUN := FALSE;
END_IF;

IF Reset THEN
    ZW := 0;
    ET := 0;
    RUN := FALSE;
END_IF;

END_FUNCTION
```
der baustein wird 13 mal in einem fc abgearbeitet, der ansonsten nichts weiteres enthält. die belegung könnt ihr am bild im anhang sehen. sie sieht im prinzip immer gleich aus. beim testen habe ich bloß die zeitmessung am ersten aufruf verwendet.


jetzt zum problem

ich will die zeitwerte in einen datenbaustein speichern. der baustein macht die messung und die berechnung am ende richtig und gibt den wert auch richtig aus, jedoch nur, solange das stopp-signal anliegt. sobald es wegfällt, bekommt das datenbausteinwort den wert 120. wenn ich dann wieder das stopp-signal anlege, bekommt das wort wieder den richtigen wert, bis es wieder weg ist. der datenbaustein wird sonst nirgends beschrieben und sämtliche belegungen sind eindeutig und nicht mehrfach verwendet.

wenn ich nun den ausgang mit einem merkerwort belege und dieses dann in das datenbausteinwort transferiere, behalten beide ihren richtigen wert.

noch etwas lustiges ist, dass alle nachfolgenden aufrufe am ausgang 120 ausgeben. sobald bei einem aufruf ein stopp-signal anliegt, haben alle folgenden ausgänge den wert null.

vielleicht ist es nur ein kleiner billiger fehler, aber ich komm einfach ned drauf :???:

ich hoffe, ihr könnt mir hier ein wenig weiterhelfen... 
ich freu mich über eine antwort

mfg matthias


----------



## zotos (17 Dezember 2007)

Den Effekt kann ich gerade nicht nachvollziehen. Ich vermute mal das es außerhalb des hier gezeigten Code liegt.
Zumal Du ja erwähnst das ein FC-Aufruf Auswirkungen auf alle Aufrufe danach hat.


----------



## kiestumpe (17 Dezember 2007)

Wenn Stopp auf FALSE geht ist dein ZW undefiniert, das wird's Problem sein.


----------



## PsYchO_LoGiC (17 Dezember 2007)

die idee hatte ich auch schon. aber das müsste doch eigentlich egal sein, wenn ich den wert fest in einen datenbaustein speichere, oder? und wie schon gesagt, wenn ichs in ein merkerwort speichere, dann gehts :/


----------



## Ralle (17 Dezember 2007)

Ich meine, es gibt einen Zustand im FC, da wird der Ausgang faktisch gar nicht beschrieben, wenn weder Run, Start, Stop, Reset anliegt. Der Ausgang ist dann sozusagen unbestimmt. Könnte vielleicht daran liegen. Du mußt auf jeden Fall dafür sorgen, daß ein OUT immer im FC beschrieben wird. Umgehen kannst du das "immer beschreiben" auch, indem du statt OUT einen INOUT nutzt.


----------



## zotos (17 Dezember 2007)

kiestumpe schrieb:


> Wenn Stopp auf FALSE geht ist dein ZW undefiniert, das wird's Problem sein.



Das klingt logisch. Also einfach den ZW von VAR_OUTPUT nach VAR_IN_OUT verschieben und schon ist es definiert.


----------



## kiestumpe (17 Dezember 2007)

jnein, mach vielleicht gleich nen FB daraus.
Die anderen Boolschen IN-OUT Werte gehören imho auch auf den Ausgang.


----------



## PsYchO_LoGiC (17 Dezember 2007)

wunderbar, hat funktioniert 

danke nochmal!

mfg


----------



## PsYchO_LoGiC (17 Dezember 2007)

kiestumpe schrieb:


> jnein, mach vielleicht gleich nen FB daraus.
> Die anderen Boolschen IN-OUT Werte gehören imho auch auf den Ausgang.



wollte ich ursprünglich auch machen, aber ich wollte so flexibel wie möglich mit dem baustein sein und da is ein db im anhang ein wenig hinderlich


----------



## oOSnugglezOo (6 Oktober 2008)

*hmmm*

Hey Leute bin auch ein Frischling in sachen SPS, habe mir diese ursprüngliche Aufgabe vorgenommen.

Bei mir erscheint beim starten der SPS n Sammelfehler -.-

liegt das am Programm?


      L     "ZählerDB".INTEing
      LAR1  

      L     DBW [AR1,P#0.0]
      =     A      4.0

      L     DBW [AR1,P#0.1]
      =     A      4.1

      L     DBW [AR1,P#0.2]
      =     A      4.2

      L     DBW [AR1,P#0.3]
      =     A      4.3

SPA:  NOP   0



möchte gern anhand meines beispieles auf den fehler kommen, deswegen schicke ich mal meinen Teil. Bringt ja nichts wenn ich jetzt einfach einen abtippe.

Gruß

oOSnugglezOo


----------



## OHGN (6 Oktober 2008)

```
[COLOR=red]L "ZählerDB".INTEing[/COLOR] //geht so nicht, man kann nur den Pointer
LAR1                 //auf die Variable in's Adressregister laden
 
[COLOR=red]L DBW[/COLOR] [AR1,P#0.0]    //geht nicht, es muss bitweise verknüpft werden  
= A 4.0
 
[COLOR=red]L DBW[/COLOR] [AR1,P#0.1]    
= A 4.1
 
[COLOR=red]L DBW[/COLOR] [AR1,P#0.2]
= A 4.2
 
[COLOR=red]L DBW[/COLOR] [AR1,P#0.3]
= A 4.3
 
SPA: NOP 0
```
 

So sollte es funktionieren:

```
L "ZählerDB".INTEing    //Datenbausteinvariable auf eine Temp umkopieren
T #tempInt              //da da sonst kein Pointerzugriff möglich ist
 
L P##tempInt            //Pointer auf die Tempvariable
LAR1                    //in das AR1 laden
 
 
U [AR1,P#0.0]           //Bitweiser Zugriff auf das AR1
= A 4.0
 
U [AR1,P#0.1]
= A 4.1
 
U [AR1,P#0.2]
= A 4.2
 
U [AR1,P#0.3]
= A 4.3
 
SPA: NOP 0
```


----------



## oOSnugglezOo (7 Oktober 2008)

*danke!*

Okay, ich schau mir das mal an!

danke schonmal für deine Hilfe!


----------

