INT konvertieren in Booleans

Zuviel Werbung?
-> Hier kostenlos registrieren
@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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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é
 
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
 
OK ... dachte schon, ich sei der einzige, der nicht gestiegen ist ^^
Aber vieleicht haben wir auch was übersehen ... lassen wir uns doch mal überraschen ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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é
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ?
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuletzt bearbeitet:
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

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.
 
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.

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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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
 
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.

Code:
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.
 
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
Code:
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
 

Anhänge

  • 01.jpg
    01.jpg
    23,7 KB · Aufrufe: 24
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.
 
Zurück
Oben