TIA Hardwareaddressen in ein Array abspeichern

bkizilkaya

Level-1
Beiträge
93
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag an alle

Für ein Projekt von mir habe ich eine Idee, aber ich weiss nicht ob es geht und wie der Lösungsansatz wäre.

Ich habe 8 schalter (I0.0 - I0.7) das ist ja ein BYTE und ich möchte die Eingänge in einem Array speichern.

Z.B.:
01234567
01001111

Obere Zeile meine Adressen (I0.0 - I0.7)

Untere Zeile Zustände (0 oder )

Und ich möchte wissen ob das überhaupt geht in ein Array zu speichern und wie??

Ich werde es in SCL programmieren.


Freundliche Grüssse
bkizilkaya
 
Ja geht, Du deklariererst ein Array of BOOL mit 8 Einträgen. Dann weißt du den einzelnen Feldeinträgen die jeweilige Adresse zu.
Alternativ anstatt 8 Zuweisungen kannst du es auch mit einer Zuweisung in einer Schleife für die Bits realisieren.

Gruß Didaddy
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Antwort

Wie würdest du es machen mit einer Schleife oder alle zuweisen. Später möchte ich auf 16 erweitern.

was würdest du benutzen eine For schleife??

Gruss bkizilkaya
 
Ich sag mal so bei 8 oder 16 Einträgen ist das relativ schnuppe. Die erste Variante würd ich als die einfachere bezeichnen, die zweite sehe ich als die elegantere an.

For Schleife würde passen (Bei 16 wärens dann halt schon 2 For Schleifen eine für die Bits die andere für die Bytes).

Gruß Didaddy
 
Zuletzt bearbeitet:
Bei 8 oder 16 Einträgen würde ich das noch über Sichten machen. Z.B.:
Code:
[FONT=Courier New]VAR_TEMP
    BYTE_Nr: INT;
    EINGANGS_BYTE: BYTE;
    EINGANGS_BIT AT EINGANGS_BYTE: ARRAY [0 .. 7] OF BOOL;
END_VAR

    EINGANGS_BYTE:= EB[Byte_Nr];
    
    IF EINGANGS_BIT[0] THEN
        ...;
    END_IF;
[/FONT][FONT=Courier New]    [/FONT][FONT=Courier New]...
[/FONT]
 
Danke für eure Antwort

Ich möchte jetzt zum beispiel die Zustände mit einem Zähler kontrollieren


Der zähler funktioniert so

Wenn vier zustände hintereinander eine 1 haben dann soll ein Ausgang anzeigen. (z.B.)

Weisst du wie man so etwas realisiert?? Mit einer For Schleife könnte ich es mir vorstellen, aber das Problem ist das der Zähler ein INT ist und das Array bool.

Geht das??

Gruss
 
Zuletzt bearbeitet:
Hallo bkizilkaya,

das ist doch toll, der Ansatz passt. Der Zähler ist in diesem Fall ja nix anderes als eine INT Variable die in der FOR Schleife 0..7 die Bitposition von deinem ARRAY wiederspiegelt. Also die INT Variable wird der Index für Dein ARRAY.
Den Ausgang und Zähler setzt du bevor du in die Schleife gehst, definiert zurück. In der Schleife würde ich dann eine weitere INT Variable vorsehen, die in jedem Schleifendurchlauf um eins aufaddiert wird (Dein eigentlicher Zähler) aber nur
wenn der Zustand von deinem abgefragtem Bit TRUE ist, bei FALSE wird der Zähler zurück gesetzt. Wenn der Zählwert die 4 erreicht setzt Du den Ausgang.

Hoffe Dir hilft das weiter. Ansonsten viellecht paar codeschnipsel posten, wo de nicht weiter kommst.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Der zähler funktioniert so

Wenn vier zustände hintereinander eine 1 haben dann soll ein Ausgang anzeigen. (z.B.)
Ist zwar nicht getestet, aber so ungefähr würde ich es machen:
Code:
[FONT=Courier New]VAR
    BYTE_Nr: INT;
    EINGANGS_BYTE: BYTE;
    EINGANGS_BIT AT EINGANGS_BYTE: ARRAY [0 .. 7] OF BOOL;
    TEST_BYTE: BYTE;
    BIT_TEST: BOOL;
    INDEX: INT;
END_VAR


    EINGANGS_BYTE:= EB[BYTE_Nr];
    
    IF EINGANGS_BIT[0] THEN
        ...;
    END_IF;
...


    TEST_BYTE:= EINGANGS_BYTE;
    BIT_TEST:= false;
    
    FOR INDEX:= 1 TO 5 BY 1 DO
        BIT_TEST:= SEL ( G:= BYTE_TO_INT (TEST_BYTE) >= 240, IN0:= BIT_TEST, IN1:= true);
        TEST_BYTE:= SHL (IN:= TEST_BYTE, N:=1);
    END_FOR;
    
    IF BIT_TEST THEN
        ...;
    END_IF;
...
[/FONT]
 
Zuletzt bearbeitet:
Vielen Dank für dein Beispiel und deine Antwort

Kannst mir den Code erklären weil ich Ihn nicht so verstehe??

Ich verstehe den SEL nicht so ganz. Was ist das?

Den SHL verstehe ich du schiebst nach links wenn immer ein 1 kommt oder ???


Dann habe ich noch eine frage kann man das auch das ganze mit einem Matrix machen d.h. mit einem 2 dimensionalem Array??

Gruss
 
Zuletzt bearbeitet:
SEL wählt einen von zwei Eingangswerten aus, wenn du auf Bit Ebene runter gehst wirst du es vermutlich verstehen. Wenn G=0 ist wird IN0 übergeben , wenn G=1, wird IN1 übergeben. Die Abfrage auf die 240 rührt von den 4 höchstwertigsten Bits in einem Byte. Wenn die Schleife 5 mal durchlaufen ist müsste die Abfrage spätesten am Schluß zu dem Ergebnis kommen das es 4 aufeinanderfolgende Bits gibt ansonsten gibts halt keine 4 aufeinander folgende Bits.

In dem Dokument ist unter anderem SEL und SHL erklärt:
http://cache.automation.siemens.com/dnl/DQ0MDAxAAAA_5581793_HB/SCL_d.pdf
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
[FONT=Courier New]
    BIT_TEST:= SEL ( G:= BYTE_TO_INT (TEST_BYTE) >= 240, IN0:= BIT_TEST, IN1:= true);
[/FONT]
ist von der Sache her das Gleiche wie
Code:
[FONT=Courier New]
    IF BYTE_TO_INT (TEST_BYTE) >= 240 THEN
        BIT_TEST:= true;
    END_IF;
[/FONT]
Ich mag nur diese IF-THEN-Orgien nicht so.
Außerdem will ich mich intensiver mit SCL beschäftigen und dazu gehört auch, mögliche Anweisungen auszutesten.
:)

Erst werden die 4 höchstwertigen Bits geprüft, so wie Didaddy es richtig erklärt hat. Dann wird immer geschoben und zwar um eine Stelle (N:= 1) und nicht (nur), wenn 'ne 1 kommt. Das letzte Schieben ist eigentlich überflüssig, stört aber auch nicht und damit ist es mir lieber, als 'ne zusätzliche Code-Zeile.
 
Zuletzt bearbeitet:
Ok danke für eure erklärung

Ich möchte das ganze mit einem 4*4 feld probieren das heisst mit einem zweidimensionalem array. Ich würdr mit zwei eingangs byte arbeiten. Die diagonale werde ich mit schnittpunkte arbeiten

Geht das ?

Gruss
 
Da musste denke ich schon mehr input liefern sonst weiß hier vermutlich niemand was du gerne machen möchtest. Aber wie gesagt bissel basics haste ja jetzt schon bekommen, wie wärs wenn de einfach mal loslegst und wir dann deinen Code optimieren. Zweidimensionale Arrays, da könnte eine geschachtelte FOR Schleife weiterhelfen.
 
Ich habe jetzt sehr viele Sachen ausprobiert, aber ich weiss nicht wie man 16 Eingänge
In ein zweidimensionales Array definiert und wie man die Diagonale auswertet.
Könnt ihr mir eine Denkhilfe geben.

Gruss
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Versteh ehrlich gesagt noch nicht wirklich was du machen möchtest, vor allem was du mit Diagonale auswerten meinst.
Wenn du nicht weißt wie man ein 2 Dimensionales Array deklariert das geht so:

Code:
VAR
  ab2D : ARRAY[1..4, 1..4] OF BOOL;
END_VAR

// Array Einträge kannst du so beschreiben, über den Index bestimmst du welche Speicherstelle du beschreiben willst 
ab2D[1,1]:= TRUE;
 
Ok danke
Es tut mir leid das ich nicht von anfang gesagt habe was ich mache.
Ich möchte ein 4 gewinnt programmieren.
Mit einem 4*4.feld

gruss
 
4Gewinnt, kam mir bekannt vor, da hattest du kürzlich schon einen Thread offen. Ronin hat da ja schon einige gedanken Anstöße geliefert. Das ganze ist möglich auch eine sehr interessante Aufgabe, aber gewiss nicht so das man das geschwind runter programmiert. Haste schon ne genauere Vorstellungen wie die Eingabe/ Visualisierung erfolgt? Ein 4*4 Feld wäre dann ja eigentlich für 4Gewinnt viel zu klein. Was hat denn das normalerweise 7*6 oder so, nicht ganz sicher. Wenn de das wirklich machen willst, würd ich es auf jeden Fall gleich in der Größe vorsehen, in der man es auch sinnvoll spielen kann. Ansonsten mußte ja hinterher die Visualisierung... wieder anpassen.

Anmerkung:
Denke ein ARRAY of BOOL ist da erst mal nicht so geeignet, ein 2Dimensionales ARRAY OF INT würde besser passen. Du solltest ja später auch abfragen können ob kein Stein, ein roter oder ein gelber Stein drin ist.
0 = Kein Stein
1 = Roter Stein drin
2 = Gelber Stein drin
 
Zuletzt bearbeitet:
Zurück
Oben