# Kleine Rechenaufgabe



## Flo (5 August 2007)

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


----------



## zotos (5 August 2007)

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.


----------



## Dotzi (5 August 2007)

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.


----------



## zotos (5 August 2007)

Dotzi schrieb:


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


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


----------



## Ralle (5 August 2007)

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


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


----------



## zotos (5 August 2007)

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


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


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


----------



## Flo (5 August 2007)

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

Vielen Dank und MfG,
Flo


----------



## zotos (5 August 2007)

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

Ich meine, wenn ich:

```
InhaltBool := Stapelversatz[NUMMER];
```
schreibe, kann ich auch gleich:

```
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:

```
InhaltBool := Stapelversatz(myNummer:=NUMMER, myRange:=HMI_Eingabe);
```
Die Funktion dazu:

```
FUNCTION Stapelversatz : BOOL
VAR_INPUT
    myNummer : INT;
    myRange  : INT;
END_VAR

Stapelversatz := INT_TO_BOOL(((myNummer - 1) / myRange)MOD 2);
```


----------



## zotos (5 August 2007)

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:

```
FUNCTION Stapelversatz : BOOL
VAR_INPUT
    inNummer : INT;
    inRangeFalse :INT;
    inRangeTrue :INT;
END_VAR

Stapelversatz := (inNummer -1) MOD (inRangeFalse + inRangeTrue) >= inRangeFalse;
```
Hier der Aufruf:

```
Inhalt := Stapelversatz(inNummer := Nummer, inRangeFalse := RangeFalse, inRangeTrue := RangeTrue);
```


----------

