FB gesucht:In1=1(real)/In2=2(real),usw...

Zuviel Werbung?
-> Hier kostenlos registrieren
Ich vermute, er meint den zeitlich ersten Eingang, nicht den ersten in der IN-Parameter-Liste. Also den, der zuerst aktiv wird. Danach sollen bis zum inaktiv-werden des auslösenden Eingangs alle anderen Eingänge ignoriert werden.

Man könnte direkt den REAL-Out als Speicher nehmen (weil FB).
- zunächst schauen, ob in Out schon ein Wert <> 0 steht. Wenn ja und der zugehörige In_x ist False, dann 0 in Out schreiben (Tip: CASE REAL_TO_INT(Out) OF ...)
- danach wenn Out=0 dann nacheinander die In_x abfragen und ggf. den zugehörigen Wert in Out schreiben (IF.. ELSIF.. ELSIF..)(wie in #9 gezeigt, ohne "ELSE Out:=0.0")

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn der Kollege solch ein Crack ist, hätte er bestimmt in der Zeit in der er hier schreibt sich die Funktion selbst gebaut.

@hucki: es ist ein Unterschied wenn eine Funktion gesucht wird oder ob man zu bequem für Eigeninitiative ist.
Er weiß doch am besten, wie die Funktion sein soll.


bike

btw ich brauch eine Funktion für ein TDS System von Balluff zur WZV einer 840SL und bin heute zu faul es selber zu machen, schreibst du mir diese, aber so dass ich das Ergebnis als mein Eigenes verkaufen kann? :ROFLMAO:
 
Du willst es einfach nicht verstehen. Also red' Dir ruhig weiter was ein.
:sb5:


Ich hoffe für Dich, das Eure Firma all das Geld, was sie z.B. mit der Verwendung von FC105 SCALE und FC106 UNSCALE (oder was sonst so an Funktionen von den Herstellern angeboten wird) durch Dich verdient, auch brav an Siemens anstatt an Dich auszahlt, damit Du ruhig schlafen kannst.
Ach ne, Du bist ja auch so'n Crack, dass Du das wahrscheinlich in Nullkommanichts lieber selber programmierst.
Ich bin es leider nicht, deswegen kann ich auch andere verstehen, die bereits vorhandene Bibliotheken nutzen wollen. Und auch ich hätte keine Lust, tagelang alle Bibliotheken zu durchforsten, anstatt einfach 'ne Frage in die Runde zu stellen, ob schon jemand sowas über den Weg gelaufen ist.

Wie jetzt schon mehrfach festgestellt, dass war alles was er von uns wollte:
Er wollte nur wissen "Nimm Baustein sowieso (z.B. aus der Oscat-Bibliothek)" oder "Auch wenn Du keine Lust hast, gibt's nicht, also selber machen".
(Oder meinetwegen auch: "Ich hab vom Bruder des Schwagers des Arbeitskollegen gehört, in Timbuktu soll's sowas geben, aber suchen mußt Du selbst.")


Und für Deine Anfrage bin ich nicht zu faul, sondern schlicht und einfach zu doof.
Also bei mir Pech für Dich.
 
Ich weiß nicht, warum Ihr so auf dem TE herumhackt. Der TE hat nie behauptet, daß er den gesuchten Code als seine eigene Erfindung ausgeben will oder gar daß er Geld dafür nimmt/bekommt. Dieser falsche Eindruck wurde von bike erzeugt...

Ich sehe in der Anfrage nichts anrüchiges. Genau wie Hucki finde ich es legitim, einfach mal zu fragen, ob vielleicht jemand einen fertigen Baustein kennt.
Kennt jemand einen solchen Funktionsblock?

Ja, ich könnte das selber programmieren, aber Zeit und Lust sind beschränkt!!!
Gut, den letzten Satz hätte er auch weglassen können, doch vielleicht wollte er damit nur doofe Diskussionen vermeiden, den niedrigen Schwierigkeitsgrad der Aufgabe betreffend. Doch er braucht den FB in ST, und in ST ist er halt noch nicht so fit ...


Zurück zum Thema.

Nach der detaillierteren Aufgabenbeschreibung in #15 meine ich nun verstanden zu haben, wie der FB funktionieren soll. Da die Aufgabenstellung für meine grauen Zellen hinreichend interessant erschien, habe ich mal einen ST-Code in meine Tastatur geklimpert.

Hier der ST-Code des Funktionsblocks, wie ich ihn mir vorstelle (allerdings nicht getestet):
Code:
  CASE REAL_TO_INT(Out) OF
     1 : IF NOT In_1  THEN Out := 0.0 ; END_IF ;
     2 : IF NOT In_2  THEN Out := 0.0 ; END_IF ;
     3 : IF NOT In_3  THEN Out := 0.0 ; END_IF ;
     4 : IF NOT In_4  THEN Out := 0.0 ; END_IF ;
     5 : IF NOT In_5  THEN Out := 0.0 ; END_IF ;
     6 : IF NOT In_6  THEN Out := 0.0 ; END_IF ;
     7 : IF NOT In_7  THEN Out := 0.0 ; END_IF ;
     8 : IF NOT In_8  THEN Out := 0.0 ; END_IF ;
     9 : IF NOT In_9  THEN Out := 0.0 ; END_IF ;
    10 : IF NOT In_10 THEN Out := 0.0 ; END_IF ;
  ELSE : Out := 0.0 ;
  END_CASE ;

  IF Out = 0.0 THEN
    IF    In_1  THEN Out := 1.0 ;
    ELSIF In_2  THEN Out := 2.0 ;
    ELSIF In_3  THEN Out := 3.0 ;
    ELSIF In_4  THEN Out := 4.0 ;
    ELSIF In_5  THEN Out := 5.0 ;
    ELSIF In_6  THEN Out := 6.0 ;
    ELSIF In_7  THEN Out := 7.0 ;
    ELSIF In_8  THEN Out := 8.0 ;
    ELSIF In_9  THEN Out := 9.0 ;
    ELSIF In_10 THEN Out := 10.0 ;
    END_IF ;
  END_IF ;
Die In_1, In_2 ... sind BOOL in VAR_INPUT, Out ist ein REAL in VAR_OUTPUT (oder VAR_IN_OUT). Die Deklarationen bitte selber tippen - das ist mir zu langweilig ;)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke, an alle...

@PN/DP:
Ich möchte eben kein ST, sondern ein etwas für CFC oder FUP.

Ich finde es super, dass viele helfen wollen und mir verschiedene Varianten präsentieren.

Offensichtlich gibt es meinen gewünschten FB nicht fixfertig... und das war meine Frage, die jetzt beantwortet wurde!

Das heisst, sobald ich Zeit dazu habe, werde ich den selber designen.
 
Ich habe gelesen:

2. Geht es um eine externe Anfrage. Wie RN schon schrieb, möchte jeder für seine Arbeiten Geld bekommen. Ich verdiene mein Geld dann, wenn ich die (von extern verursachten) Fehler versuche auszubügeln.
3. Warum sollte ich mir die Mühe machen, einen FB zu designen, auszutesten und dann zu verschicken, wenn es schon etwas gibt? Wieso das Rad neu erfinden?!?

Ich weiß nicht, warum Ihr so auf dem TE herumhackt. Der TE hat nie behauptet, daß er den gesuchten Code als seine eigene Erfindung ausgeben will oder gar daß er Geld dafür nimmt/bekommt. Dieser falsche Eindruck wurde von bike erzeugt...

Ich sehe in der Anfrage nichts anrüchiges. Genau wie Hucki finde ich es legitim, einfach mal zu fragen, ob vielleicht jemand einen fertigen Baustein kennt.

Habe ich jetzt wieder etwas falsch verstanden?

Mir wurde erklärt, dass hier Hilfe zur Selbsthilfe gegeben wird.
Wenn jemand schon schreibt, ich bin zu faul mir selbst einen Kopf zu machen, was soll ich aus solch einer Aussage schließen?


bike
 
@bike:
Du verstehst, mich komplett falsch.
Es geht nicht darum grundsätzlich keinen Bock zu haben und dem Kunden etwas zu verkaufen.

Wenn du zeitlich einfach keine Chance hast ein FB zu machen (der für den Kunden gratis ist), bist du doch sicher auch froh, wenn du auf irgend eine lib zugreifen kannst.
Meine Wortwahl war einfach Scheisse, aber das ist mir leider, im Eifer des Gefechts, zu spät aufgefallen.

Grundidee war, dass ich hier kurz was schreibe, eine Antwort kommt:
Na klar, nimm lib xyz, dort hat es FB xyz.
Dann hätte ich die lib dem Kunden geschickt, hier bitte probiert es aus.

In den meisten Fällen, knallt der Kunde nach einem Misserfolg, einfach dass Backup drauf und alles ist erledigt.
Es kommt aber auch vor, dass er anruft und sagt, Ich habe es fast geschafft, nur ein kleines Problem habe ich noch. Dann helfe ich ihm.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@nochmal bike

Ich habe erst jetzt deinen angehängten Text von Martin Fowler gelesen.


Genau um das geht es! Leider arbeitet der Kunde mit CFC, darum nur bedingt zutreffend. ST ist natürlich leichter zu verstehen, aber beim CFC sieht man was abläuft und der Kunde möchte auch wissen, warum macht was, das was es macht (schon wieder so ein super Satz!)...
 
Nach der detaillierteren Aufgabenbeschreibung in #15 meine ich nun verstanden zu haben, wie der FB funktionieren soll. Da die Aufgabenstellung für meine grauen Zellen hinreichend interessant erschien, habe ich mal einen ST-Code in meine Tastatur geklimpert.
Geht mir auch so. :)

Und da in dieser Aufgabe die grundlegende Funktion der zeitlichen Reihenfolge der Eingänge auch benötigt wurde, hab' ich meinen dortigen Code mal etwas auf die hier gewollte Ausgabe abgewandelt:
Code:
[FONT=Courier New]FUNCTION_BLOCK "Real_Select"

CONST
    N:=  10;                                                                // Anzahl Selektionseingänge
END_CONST

VAR_INPUT
    IN:     ARRAY [1 .. N] OF BOOL;                                         // Ausgabeselektion
    VAL:    ARRAY [0 .. N] OF Real;                                         // Ausgabewerte
END_VAR

VAR_OUTPUT
    OUT:    REAL;                                                           // Ausgabe
END_VAR

VAR
    IN_OLD: ARRAY [1 .. N] OF BOOL;                                         // letzter Zustand der Eingänge
    ORDER:  ARRAY [1 .. N] OF INT;                                          // Speicher für Einschaltreihenfolge
END_VAR

VAR_TEMP
    i:      INT;                                                            // Hilfsvariable Schleife Ein-/Ausgänge
    j:      INT;                                                            // Hilfsvariable Schleife Reihenfolgespeicher
END_VAR



    // Eingänge auf Zustandsänderungen prüfen:
    FOR i:= 1 TO N BY 1 DO                                                  // Alle Eingänge der Reihe nach prüfen
        IF IN[i] AND NOT IN_OLD[i] THEN                                     //      Wenn positive Flanke des Eingangs
            FOR j:=  1 TO N BY 1 DO                                         //      dann Reihenfolgespeicher von unten an durchsuchen
                IF ORDER[j] = 0 THEN                                        //              Wenn Reihenfolgefeld noch leer
                    ORDER[j]:= i;                                           //              dann Nummer des Eingangs eintragen
                    EXIT;                                                   //                   und Schleife abbrechen
                END_IF;
            END_FOR;                                                        //           nächstes Speicherfeld
        ELSIF IN_OLD[i] AND NOT IN[i] THEN                                  //      sonst wenn negative Flanke des Eingangs
            FOR j:= 1 TO N BY 1 DO                                          //      dann Reihenfolgespeicher von unten an durchsuchen
                IF ORDER[j] = i THEN                                        //              Wenn Eintrag des Eingangs gefunden,
                    ORDER[j]:= 0;                                           //              dann Eintrag löschen
                    EXIT;                                                   //                   und Schleife verlassen (und Stelle merken)
                END_IF;
            END_FOR;                                                        //           nächstes Speicherfeld
            // Ggf. alles Folgende 1 Stelle nach unten schieben
            IF j < N THEN                                                   //           Wenn Eintrag nicht im letzten Speicherfeld
                FOR j:= j TO N - 1 BY 1 DO                                  //           dann vom Feld des Eintrags bis zum vorletzten Feld
                        ORDER[j]:= ORDER[j+1];                              //                   Inhalt vom Speicherfeld drüber kopieren
                END_FOR;                                                    //                nächstes Speicherfeld
                ORDER[N]:= 0;                                               //                letztes Speicherfeld Eintrag löschen
            END_IF;
        END_IF;
        IN_OLD[i]:= IN[i];                                                  //      Zustand des Eingangs für nächsten Zyklus speichern
    END_FOR;
    
    // Ausgabe 
    OUT:= VAL[ ORDER[1] ];                                                  // Ausgabe auf zugehörigen Wert des 1. Eingangs in der Speicherliste setzen
    

END_FUNCTION_BLOCK





DATA_BLOCK "VAL_Real_Select"
TITLE =
VERSION : 0.1


  STRUCT     
   IN :  ARRAY  [1 .. 10 ] OF BOOL ;    
   VAL : ARRAY  [0 .. 10 ] OF REAL ;    
   Out : REAL ;    
  END_STRUCT ;    

BEGIN
   IN[1]   := FALSE; 
   IN[2]   := FALSE; 
   IN[3]   := FALSE; 
   IN[4]   := FALSE; 
   IN[5]   := FALSE; 
   IN[6]   := FALSE; 
   IN[7]   := FALSE; 
   IN[8]   := FALSE; 
   IN[9]   := FALSE; 
   IN[10]  := FALSE; 
   VAL[0]  := 0.000000e+000; 
   VAL[1]  := 1.000000e+000; 
   VAL[2]  := 2.000000e+000; 
   VAL[3]  := 3.000000e+000; 
   VAL[4]  := 4.000000e+000; 
   VAL[5]  := 5.000000e+000; 
   VAL[6]  := 6.000000e+000; 
   VAL[7]  := 7.000000e+000; 
   VAL[8]  := 8.000000e+000; 
   VAL[9]  := 9.000000e+000; 
   VAL[10] := 1.000000e+001; 
   Out     := 0.000000e+000; 

END_DATA_BLOCK
[/FONT]
So wird die komplette Reihenfolge der Setzens der Eingänge gespeichert und dann bei der Ausgabe des nächsten Eingangs nach dem Rücksetzen des aktuell ersten Eingangs weiter beachtet.
Mit der Konstanten N ist der FB schnell auf eine andere gewünschte Anzahl von Eingängen anpassbar.

Hab' mal noch ein DB zum Handlen der Daten in den IN-Arrays hinten mit hinzugefügt:



PS: Ich kann es leider nur in SCL, dort ist es auch getestet. Dürfte sich aber nicht wesentlich von ST unterscheiden.
Egro hat zwar mittlerweile gesagt, das er kein ST verwenden möchte, aber der Baustein wäre ja in sich abgeschlossen und damit in FUP/CFC (wie 'ne sonstige lib) verwendbar, oder?
 
In CFC würde das aber auch keiner aus den verfügbaren Einzelementen aufbauen. Das würde alleine schon die 6 Blätter eines Teilplans einnehmen, und dann ist der ganze Vorteil mit der Übersichtlichkeit von CFC dahin.
In CFC sollte nur die Gesamtlogik zu sehen sein, sodass man eigentlich nicht unbedingt in die dort aufgerufenen Bausteine hineinschauen muss.
Vom Prinzip her gibt es in der CFC-Bibliothek schon einen ähnlichen Baustein, nämlich MUX8_I bzw. MUX8_R für Real-Zahlen.

Damit man keinen Wildwuchs an Bausteinen hat, würde ich es folgendermaßen machen:
- Einen Baustein MUX10_R erstellen, der von den Parameternamen und der Funktion her wie der MUX8_R aussieht, nur eben mit 10 Eingängen.
- Einen Vorschaltbaustein mit 10 BOOL Eingängen, und einem Ausgang K. K gibt die Nummer des zuerst gesetzten Eingangs aus. Am besten gucken ob es einen ähnlichen Baustein in der CFC Bibliothek gibt an dem man sich von der Bezeichnung orientieren kann, wahrscheinlich mit weniger Eingängen.

Diese beiden Bausteine kann man schön in CFC hintereinanderschalten.

Edit: Wir sind ja garnicht bei Step7...aber ich würde das bei anderen Programmierumgebungen ähnlich handhaben. Nachsehen was es in der mitgelieferten Bibliothek gibt, und sich auch an diesem Stil orientieren.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn man eh' noch einen (selbstgeschriebenen) Vorschaltbaustein nehmen muß, dann braucht man keinen MUX-Baustein mehr, man braucht doch nur K zu REAL konvertieren. Oder der "Vorschalt"-Baustein gibt K gleich als REAL aus - so wie mein Code in #25.


Der TE müßte sich nun nur noch die klitzekleine Mühe machen, FUNCTION_BLOCK ... und die INPUT/OUTPUT-Deklarationen dazu zu schreiben - schon hat er einen FB, den er in ein FUP- oder CFC-Programm einfügen kann. Das geht schneller, als ich hier brauche um diesen Hinweis zu geben ... da kann ich das auch gleich noch nachliefern:
Code:
FUNCTION_BLOCK SEL10_R
VAR_INPUT
  In_1 : BOOL ;
  In_2 : BOOL ;
  In_3 : BOOL ;
  In_4 : BOOL ;
  In_5 : BOOL ;
  In_6 : BOOL ;
  In_7 : BOOL ;
  In_8 : BOOL ;
  In_9 : BOOL ;
  In_10 : BOOL ;
END_VAR

VAR_OUTPUT
  Out : REAL ;
END_VAR

  CASE REAL_TO_INT(Out) OF
     1 : IF NOT In_1 THEN Out := 0.0 ; END_IF ;
     2 : IF NOT In_2 THEN Out := 0.0 ; END_IF ;
     3 : IF NOT In_3 THEN Out := 0.0 ; END_IF ;
     4 : IF NOT In_4 THEN Out := 0.0 ; END_IF ;
     5 : IF NOT In_5 THEN Out := 0.0 ; END_IF ;
     6 : IF NOT In_6 THEN Out := 0.0 ; END_IF ;
     7 : IF NOT In_7 THEN Out := 0.0 ; END_IF ;
     8 : IF NOT In_8 THEN Out := 0.0 ; END_IF ;
     9 : IF NOT In_9 THEN Out := 0.0 ; END_IF ;
    10 : IF NOT In_10 THEN Out := 0.0 ; END_IF ;
  ELSE : Out := 0.0 ;
  END_CASE ;

  IF Out = 0.0 THEN
    IF    In_1 THEN Out := 1.0 ;
    ELSIF In_2 THEN Out := 2.0 ;
    ELSIF In_3 THEN Out := 3.0 ;
    ELSIF In_4 THEN Out := 4.0 ;
    ELSIF In_5 THEN Out := 5.0 ;
    ELSIF In_6 THEN Out := 6.0 ;
    ELSIF In_7 THEN Out := 7.0 ;
    ELSIF In_8 THEN Out := 8.0 ;
    ELSIF In_9 THEN Out := 9.0 ;
    ELSIF In_10 THEN Out := 10.0 ;
    END_IF ;
  END_IF ;

END_FUNCTION_BLOCK
(das ist jetzt getestetes Siemens-SCL, sollte aber auch als Codesys-ST richtig sein)

Harald
 
Zurück
Oben