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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Digitale Ausgänge in Schleife schalten (ST)

  1. #1
    Registriert seit
    18.07.2010
    Beiträge
    20
    Danke
    22
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zusammen,

    bei folgendem Problem komme ich einfach nicht weiter, vielleicht hat hier noch jemand einen Tip für mich:

    An einem CX9010 hängen via digitalen Ausgängen eine grössere (>60 Stk.) Stückzahl Relais. Nun suche ich nach einer Möglichkeit, diese Relais mit nur einem FB zu schalten, dem ich gerne den Namen des mit AT %Q zugewiesenen Ausgangs mitgeben möchte. Deshalb habe ich mir einen Record erstellt, der pro Relais die Ausgänge beschreibt. Diese Rec's stehen in einem Array[1..60]. Jetzt wollte ich den FB aufrufen und ihm durch Übergabe der entsprechenden Arrayadresse die passenden Werte zur Verfügung stellen. Das klappt auch soweit. Nur eben nicht mit dem Namen. Der Lösungsversuch mit POINTER TO BOOL endet immer in einem Laufzeitfehler, vermutlich wg. dem boolschen Wert und der Typumwandlung von BITADR. Mit PBOOL_TO_POINTER bin ich auch nicht weitergekommen.

    Wie macht man sowas? Vielleicht sehe ich den Wald ja vor lauter Bäumen nicht mehr.

    Bin für jeden Tip dankbar.

    Gruss

    Majaetix
    Zitieren Zitieren Digitale Ausgänge in Schleife schalten (ST)  

  2. #2
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    Leg doch die Ausgänge auch als Array an.
    Code:
    OutPuts AT %Q*:ARRAY[1..60] OF BOOL;
    Dann belegt zwar jeder Ausgang ein Byte im Ausgangsabbild, aber Speicher hat der CX9010 doch genug.

  3. #3
    majaestix ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.07.2010
    Beiträge
    20
    Danke
    22
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo StructuredTrash,

    vielen Dank für die Antwort.

    Leg doch die Ausgänge auch als Array an.
    Dagegen spricht Verschiedenes, zu einem, es sind insgesamt über 700 Ausgänge, natürlich nicht alle digital, bereits angelegt, zum anderen, ich verliere dann die beschreibende Bezeichnung der Ausgänge (wurde bereits in einem anderen Thread hier diskutiert).

    Meine Hoffnung war eigentlich, dass ich nicht der erste bin, der ein solches Problem hat und ich nur zu blöd bin, es über Pointer etc. zu lösen.
    Ich dachte, dass vielleicht irgendjemand anderes bereits eine elegante Lösung dafür entwickelt hat und diese mit mir teilen würde.

    Gruss

    Majaestix

  4. #4
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    Eine Möglichkeit wären Alias-Variablen
    Code:
    Outputs AT %QB0:ARRAY[1..60] of BOOL;
    Output1 at %QX0.0:BOOL;
    Output2 at %QX1.0:BOOL;
    usw...
    Sonst vielleicht ein Array[1..60] mit Byteadressen und Bitpositionen der Ausgänge.
    Code:
    TYPE strBitAdrs:
    STRUCT
       ByteAdr:POINTER TO BYTE;
       BitAdr:BYTE;
    END_STRUCT
    END_TYPE

  5. #5
    majaestix ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.07.2010
    Beiträge
    20
    Danke
    22
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo StructuredTrash,

    Danke für Dein Interesse.

    Sonst vielleicht ein Array[1..60] mit Byteadressen und Bitpositionen der Ausgänge.
    Genau hier, glaube ich, liegt mein Problem. Wenn ich einen Pointer auf eine BOOL zeigen lasse, welches Bit(s) muss ich bei der Dereferenzierung dann auswerten? Wie gesagt, pauschal mit PBOOL_TO_BOOL habe ich das nicht hinbekommen.

    Gruss

    Majaestix

  6. #6
    majaestix ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.07.2010
    Beiträge
    20
    Danke
    22
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo StructuredTrash,

    entschuldige bitte, ich habe gerade erst erkannt, dass Dein Pointer auf BYTE zeigt und nicht auf BOOL.
    Wie könnte ich denn hier BOOL abbilden?

    Gruss

    Majaestix

  7. #7
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    Nehmen wir als Beispiel einen Ausgang AT %QX3.5
    In das Adressarray muss dafür beim Programmstart eingetragen werden
    Code:
    OutAdr[1].ByteAdr:=ADR(%QB3);
    OutAdr[1].BitAdr:=5;
    In dem FB, dem die Adressen übergeben werden, kann man natürlich nicht direkt auf BOOLs zugreifen, sondern muss das Byte "OutAdr[x].ByteAdr^" mit "SHL(1,OutAdr[x].BitAdr)" maskieren, um das gewünschte Bit zu manipulieren oder abzufragen.

  8. #8
    majaestix ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.07.2010
    Beiträge
    20
    Danke
    22
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo StructuredTrash,

    nochmals: Maximalen Dank!

    das gewünschte Bit zu manipulieren
    Wie wäre denn ein BOOL zu maskieren, etwa mit 5, sowie Du es im Beispiel zeigst? Und falls ja, wieso mit 5 Bits und nicht als Byte?
    Oder habe ich da was nicht verstanden?

    Gruss

    Majaestix

  9. #9
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    "AT %QX3.5" bedeutet, dass das Ausgangsbit sich an Position 5 innerhalb des Ausgangsbytes 3 befindet (Zählung mit 0 beginnend). Eine Bitadressierung in der Art "Integervariable.Bitposition" ist aber nur möglich, wenn "Bitposition" eine Konstante ist. Mit Variablen, wie bei der Übergabe in Deinen FB, geht das nicht. Da muss man dann das ganze Byte mit logischen Verknüpfungen wie AND, OR bearbeiten. Um dabei nur das gewünschte Bit zu manipulieren, ist eine Maskierung notwendig, und zwar mit einem Bytewert, bei dem nur an der gewünschten Bitposition eine 1 bzw. eine 0 steht. Im Besipiel wäre diese Maske 1 SHL 5, also 2#00100000. Um z. B. das Bit zu setzen, müsstest Du "Variable:=Variable OR (1 SHL 5)" ausführen, zum Rücksetzen "Variable":=Variable AND NOT (1 SHL 5)".

  10. #10
    majaestix ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.07.2010
    Beiträge
    20
    Danke
    22
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo StructuredTrash,

    Danke!

    Jetzt fehlt mir nur noch die Bitmaskierung eines boolschen Ausganges. Kennst Du die?

    Gruss

    Majaestix

Ähnliche Themen

  1. 2 Ausgänge 2 Sekunden schalten
    Von DasF im Forum Simatic
    Antworten: 17
    Letzter Beitrag: 12.12.2010, 17:58
  2. Ausgänge nacheinander schalten!
    Von Krma1985 im Forum Simatic
    Antworten: 35
    Letzter Beitrag: 11.03.2009, 19:45
  3. einzelne digitale Ausgänge setzen
    Von Tiger30 im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 24.02.2009, 16:13
  4. Ausgänge schalten
    Von Spud im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 30.03.2007, 20:04
  5. Antworten: 3
    Letzter Beitrag: 09.09.2003, 03:35

Stichworte

Lesezeichen

Berechtigungen

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