Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: Kleine Rechenaufgabe

  1. #1
    Registriert seit
    06.11.2005
    Ort
    daheim natürlich
    Beiträge
    119
    Danke
    11
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Servus zusammen,

    vielleicht hat von euch jemand einen Lösungsvorschlag:

    Bediener hat am HMI eine Eingabemöglichkeit wo er einen INT Wert von 5- 15 eingeben kann.
    In der Software habe ich ein Array (Stapelversatz: array [0..200] of bool) .

    Nun mein Problem als Beispiel:

    Bediener gibt am HMI 7 ein.
    Das array soll nun aufgrund dieser HMI eingabe wie folg aussehen:

    Stapelversatz[1]:=FALSE;
    Stapelversatz[2]:=FALSE;
    Stapelversatz[3]:=FALSE;
    Stapelversatz[4]:=FALSE;
    Stapelversatz[5]:=FALSE;
    Stapelversatz[6]:=FALSE;
    Stapelversatz[7]:=FALSE;
    Stapelversatz[8]:=TRUE;
    Stapelversatz[9]:=TRUE;
    Stapelversatz[10]:=TRUE;
    Stapelversatz[11]:=TRUE;
    Stapelversatz[12]:=TRUE;
    Stapelversatz[13]:=TRUE;
    Stapelversatz[14]:=TRUE;
    Stapelversatz[15]:=FALSE;
    Stapelversatz[16]:=FALSE;
    Stapelversatz[17]:=FALSE;
    Stapelversatz[18]:=FALSE;
    Stapelversatz[19]:=FALSE;
    Stapelversatz[20]:=FALSE;
    Stapelversatz[21]:=FALSE;
    Stapelversatz[22]:=TRUE;
    Stapelversatz[23]:=TRUE;
    Stapelversatz[24]:=TRUE;
    Stapelversatz[25]:=TRUE;
    Stapelversatz[26]:=TRUE;
    Stapelversatz[27]:=TRUE;
    Stapelversatz[28]:=TRUE;
    Stapelversatz[29]:=FALSE;
    usw...

    Natürlich könnte ich jetzt hergehen und hier:
    If HMI_Eingabe = 7 then
    ...blabla
    elsif HMI_Eingabe = 8 then
    ...blabla
    usw.
    oder
    Case HMI_Eingabe of
    5:
    6:
    7:
    usw.
    aber das will ich eigentlich nur als absolute Notlösung einsetzen.
    Hat von euch jemand einen Mathematischen Ansatz für diese Aufgabe (Software ist in ST auf Codesys geschrieben) den er mir verraten möchte .



    Vielen Dank und MfG,
    Flo
    Zitieren Zitieren Kleine Rechenaufgabe  

  2. #2
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Ich raff es mal wieder nicht ;o(

    Also wie hängen jetzt der Integer Wert 5-15 mit dem 200 Bit großen Array zusammen?

    Also wenn der Bediener nun z.B. eine 7 eingibt was macht dann das "blabla" (mit dem Array)?

    Bei 5..15 bietet sich doch ein "Case of" super an.
    If you open your Mind too much, your Brain will fall out.

  3. #3
    Registriert seit
    20.11.2006
    Ort
    Hamburg
    Beiträge
    225
    Danke
    35
    Erhielt 35 Danke für 32 Beiträge

    Standard

    Wenn der Bediener eine "7" eingibt, wird in dem Feld sieben mal ein false, dann sieben mal ein true usw eingetragen.
    Und Flo sucht wohl eine Schleife, die ihm dieses Eintragen erledigt in Abhängingkeit der übergebenen Zahl.

  4. #4
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von Dotzi Beitrag anzeigen
    Wenn der Bediener eine "7" eingibt, wird in dem Feld sieben mal ein false, dann sieben mal ein true usw
    ...
    Ah jetzt sehe ich das auch ;o)

    Ok das ist einfach:

    Code:
    VAR
        HMI_Eingabe : INT;
        myArray200  : ARRAY[1..200] OF BOOL;
        forCount    : INT;
        myINT       : INT;
    END_VAR
    
    IF (HMI_Eingabe > 0) THEN
        FOR forCount := 0 TO 199 DO
            myINT := forCount / HMI_Eingabe;
            myArray200[forCount+1] := INT_TO_BOOL(myINT MOD 2);
        END_FOR
    END_IF
    Da kann man sicher noch was verbessern aber das Grundgerüst erfüllt zumindest mal die Funktion.
    If you open your Mind too much, your Brain will fall out.

  5. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    @zotos

    Ja, der Ansatz ist nicht übel.

    Ich habs etwas umständlicher gemacht , dafür kann man es einfacher anpassen, falls das nicht gewollt ist mit den X Mal True und dann X Mal False
    Ist eigentlich fast die klassische "Fülle eine Matrix"-Aufgabe.

    Code:
    VAR
        I: INT;
        J: INT;
        IntInput: INT := 7;
        Stapelversatz: ARRAY [1..200] OF BOOL;
    END_VAR
    
    I := 1;
    IF IntInput >0 THEN
      WHILE I <= 200 DO
        FOR J := 0 TO IntInput-1 DO
          IF I+J > 200 THEN
            EXIT;
          ELSE
            Stapelversatz[I+J] := FALSE;
          END_IF
        END_FOR
        FOR J := IntInput TO IntInput*2-1 DO
          IF I+J > 200 THEN
            EXIT;
          ELSE
            Stapelversatz[I+J] := TRUE;
          END_IF
        END_FOR
        I := I + J;
      END_WHILE
    END_IF
    Geändert von Ralle (05.08.2007 um 13:07 Uhr) Grund: FALSE und TRUE anders herum setzen ^^
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. #6
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Ich habe das ganze mal etwas gekürzt und die Variablennamen angepasst.

    Code:
    VAR
        HMI_Eingabe   : INT;
        Stapelversatz : ARRAY[1..200] OF BOOL;
        forCount      : INT;
    END_VAR
    
    (* Werteberich überprüfen *)
    IF ((HMI_Eingabe >= 5) AND (HMI_Eingabe <= 15)) THEN
        FOR forCount := 0 TO 199 DO
            Stapelversatz[forCount+1] := INT_TO_BOOL((forCount / HMI_Eingabe)MOD 2);
        END_FOR
    ELSE
        (* Fehler HMI_Eingabe ausserhalb der Toleranz *)
        ;
    END_IF
    @Ralle: auch eine schöne und gute Lösung. Wo bei mein Lösungsweg ja auch mit einer weiteren IF/ELSE andere Werte als TRUE/FALSE Eintragen kann. (Edit: jetzt raff ich das erst Du meinst wenn die Anzahl der True und False ungleich sein soll. Das kann meine Lösung nicht.)

    Code:
            IF (INT_TO_BOOL((forCount / HMI_Eingabe)MOD 2)) THEN
                Stapelversatz[forCount+1] := TRUE; (* oder Entsprechender Wert *)
            ELSE
                Stapelversatz[forCount+1] := FALSE; (* oder Entsprechender Wert *)
            END_IF
    Geändert von zotos (05.08.2007 um 13:04 Uhr)
    If you open your Mind too much, your Brain will fall out.

  7. #7
    Flo ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    06.11.2005
    Ort
    daheim natürlich
    Beiträge
    119
    Danke
    11
    Erhielt 2 Danke für 2 Beiträge

    Standard

    @ Ralle und Zotos
    Super, danke euch beide.
    Genau was ich brauche.

    Vielen Dank und MfG,
    Flo

  8. #8
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Was ich mich nun frage ist ob man das Array überhaupt noch braucht.

    Ich meine, wenn ich:
    Code:
    InhaltBool := Stapelversatz[NUMMER];
    schreibe, kann ich auch gleich:
    Code:
    InhaltBool := INT_TO_BOOL(((NUMMER - 1) / HMI_Eingabe)MOD 2);
    schreiben.

    bzw. den Code in eine Funktion mit einem Rückgabewert vom Typ Bool und zwei Input Variablen NUMMER und HMI_Eingabe packen.
    Der Aufruf:
    Code:
    InhaltBool := Stapelversatz(myNummer:=NUMMER, myRange:=HMI_Eingabe);
    Die Funktion dazu:
    Code:
    FUNCTION Stapelversatz : BOOL
    VAR_INPUT
        myNummer : INT;
        myRange  : INT;
    END_VAR
    
    Stapelversatz := INT_TO_BOOL(((myNummer - 1) / myRange)MOD 2);
    If you open your Mind too much, your Brain will fall out.

  9. #9
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich habe da noch einen Nachtrag. Wenn die Anzahl an False und True Werten unterschiedlich sein soll kann man das auch ganz gut mit dem Modulo Operator machen.

    Hier die Funktion:
    Code:
    FUNCTION Stapelversatz : BOOL
    VAR_INPUT
        inNummer : INT;
        inRangeFalse :INT;
        inRangeTrue :INT;
    END_VAR
    
    Stapelversatz := (inNummer -1) MOD (inRangeFalse + inRangeTrue) >= inRangeFalse;
    Hier der Aufruf:
    Code:
    Inhalt := Stapelversatz(inNummer := Nummer, inRangeFalse := RangeFalse, inRangeTrue := RangeTrue);
    If you open your Mind too much, your Brain will fall out.

Ähnliche Themen

  1. Simatic Rechenaufgabe
    Von datasys im Forum Simatic
    Antworten: 25
    Letzter Beitrag: 26.10.2010, 15:38
  2. Rechenaufgabe
    Von Full Flavor im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 28.11.2008, 20:25
  3. Mal ne kleine Zwischenfrage
    Von arcis im Forum Stammtisch
    Antworten: 51
    Letzter Beitrag: 27.06.2008, 19:04
  4. kleine Laptop für DOS und S5
    Von huggy im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 29.05.2008, 18:23
  5. Kleine Visualisierung für PC
    Von Friedrich-Alexander im Forum HMI
    Antworten: 4
    Letzter Beitrag: 26.02.2008, 14:53

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •