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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

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

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von majaestix Beitrag anzeigen
    Jetzt fehlt mir nur noch die Bitmaskierung eines boolschen Ausganges. Kennst Du die?
    Nein, die kenne ich nicht, und sie fehlt Dir auch nicht. In meinem vorherigen Beitrag steht doch alles, was Du brauchst (es sei denn, ich hätte Dein Problem völlig falsch verstanden).

  2. Folgender Benutzer sagt Danke zu StructuredTrash für den nützlichen Beitrag:

    majaestix (07.07.2012)

  3. #12
    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,

    es sei denn, ich hätte Dein Problem völlig falsch verstanden
    Nein, das hast Du nicht! Ich hatte Dich nicht ganz verstanden

    Sonst vielleicht ein Array[1..60] mit Byteadressen und Bitpositionen der Ausgänge.
    Wenn ich das sauber mitgelesen hätte, wäre mit der Fauxpas nicht passiert.

    Also fasse ich jetzt mal zusammen:
    Alle digitalen Ausgänge in einem zweidimensionalen Array of Byte abbilden, heisst, jeder Ausgang liegt auf einem Bit eines Bytes dieses Arrays. Somit würe bei TRUE des Ausgangs das Bit gesetzt sein und bei FALSE das Bit fallen. Damit könnte ich durch das Array laufen und jeden Ausgang abfrsgen.
    Was mit jetzt noch nicht klar ist, wie setzte ich den Ausgang wieder?

    Gruss

    Majaestix

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

    Standard

    Zitat Zitat von majaestix Beitrag anzeigen
    Also fasse ich jetzt mal zusammen:
    Alle digitalen Ausgänge in einem zweidimensionalen Array of Byte abbilden, heisst, jeder Ausgang liegt auf einem Bit eines Bytes dieses Arrays. Somit würe bei TRUE des Ausgangs das Bit gesetzt sein und bei FALSE das Bit fallen. Damit könnte ich durch das Array laufen und jeden Ausgang abfrsgen.
    So ganz ist es das noch nicht. Ich bin von Folgendem ausgegangen:
    Du willst in einer Schleife 60 mal einen FB aufrufen und ihm dabei, mit Hilfe des Schleifenzählers als Arrayindex, Variablen aus dem PLC-Ausgangsabbild übergeben. Diese Variablen sind bereits als einzelne Bitvariablen im Ausgangsabbild vorhanden.
    Dazu brauchst Du ein ARRAY[1..60] OF POINTER TO BIT, in das Du beim Programmstart die Adressen der einzelnen Ausgangsvariablen einträgst. Da eine indizierte Bitadressierung nicht möglich ist, bleibt nur der Umweg über POINTER TO BYTE und die zusätzliche Angabe der Bitposition innerhalb des Bytes. Logische Operationen wie AND und OR sind dann natürlich auch nur byteweise möglich und müssen maskiert werden, um nur das gewünschte Bit zu manipulieren oder abzufragen.
    Deine Zusammenfassung geht eher in die Richtung meines ersten Vorschlags, nämlich die Ausgangsvariablen von vornherein so anzulegen, dass sowohl ein Einzelzugriff über die Variablennamen als auch ein indizierter Zugriff über ein Array möglich ist.

  5. #14
    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, ganz vielen Dank für Deine Geduld!

    Ich bin von Folgendem ausgegangen:
    Also, alles nochmal zurück auf Anfang:

    Merin Wunsch:
    Verschiedene digitale Ausgänge mit dem gleichen FB schalten zu können.

    Dazu hatte ich die folgende Vorgehensweise geplant:

    Diese globalen Variablen sind definiert (Auszug):

    VAR_GLOBAL
    DG_STUDIO_NORD_TANK_SD_S3_21 AT %Q* : BOOL;
    DG_STUDIO_NORD_TANK_SD_S3_22 AT %Q* : BOOL;
    DG_STUDIO_NORD_TANK_SD_S3_23 AT %Q* : BOOL;
    DG_STUDIO_NORD_TANK_SD_S3_24 AT %Q* : BOOL;
    DG_STUDIO_NORD_TANK_SD_S3_25 AT %Q* : BOOL;

    sd_haus_dg_studio_nord_bt_s21 : sd_rec;
    sd_haus_dg_studio_nord_bt_s22 : sd_rec;
    sd_haus_dg_studio_nord_bt_s23 : sd_rec;
    sd_haus_dg_studio_nord_bt_s24 : sd_rec;
    sd_haus_dg_studio_nord_bt_s25 : sd_rec;

    sd_array : ARRAY[0..5,1..150] OF sd_rec;
    END_VAR
    Die ertsen fünf wurden von den Elektrikern als Ausgäne im Systgemmanager angelegt, deshalb Ort und Kabelnummern. Soweit ich weiss, haben die diese Variablen gleich an die PLC als globale Var's übergeben.

    Hier folgt die von mir angelege Structur, Typ REC:

    TYPE sd_rec :
    STRUCT
    var_name : POINTER TO BOOL;
    status : BOOL;
    stromlos_geschlossen : BOOL := TRUE;
    status_alarm : alarm_rec;
    max_einschaltdauer : max_einschaltdauer_rec;
    END_STRUCT
    END_TYPE
    Sie enthält zwei weitere Struct's vom Typ REC, die aber hier keine weitere Rolle spielen.

    Als erstes führe ich bei der Initialisierung des Programms den folgenden FB aus:

    FUNCTION_BLOCK dg_aus_variablen_setzen

    VAR_INPUT
    END_VAR

    sd_array[DG,24].var_name := BITADR(DG_STUDIO_NORD_TANK_SD_S3_24);
    Damit erfolgt die Zuordnung des Ausgangs auf die Variable in meinem REC.
    Nun wollte ich den Ausgang folgendermassen schalten:

    FUNCTION_BLOCK sd_schalten

    VAR_INPUT
    ein_aus : BOOL;
    etage : INT;
    kabel : INT;
    END_VAR

    sd_array[Etage,Kabel].var_name^ := ein_aus;
    Genau hier komme ich aber nicht weiter, dass funktioniert nämlich nicht

    Irgendwas habe ich im Infosys gelesen, dass es hier Probleme geben kann, aber richtig begriffen habe ich das nicht...

    Vielleicht kannst Du mich da auf die richtige Spur bringen?

    Gruss

    Majaestix

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

    Standard

    Wenn Du eine BOOL-Variable anlegst, ist das ein Byte, von dem nur das unterste Bit genutzt wird. Ein "POINTER TO BOOL" zeigt natürlich auch auf so eine Variable. Nur im I/Q-Abbild können BOOL-Variablen auf ein einzelnes Bit innerhalb eines Bytes zeigen. Die Typbezeichnung "BOOL" ist da etwas irreführend, es wäre besser gewesen, solche Variablen z. B. als Typ "BIT" zu bezeichnen. Eine indizierte Adressierung solcher Bitvariablen ist, wie schon gesagt, nicht möglich.
    Eine Lösung könnte so aussehen (allerdings nicht getestet):
    Den Typ von "var_name" im Struct ändern: Statt POINTER_TO_BOOL den von mir beschriebenen Typ strBitAdrs
    Bei der Initialisierung (ich nehme mal Dein Beispiel):
    Code:
    sd_array[DG,24].var_name.ByteAdr:=ADR(%QB0)+SHR(BITADR(DG_STUDIO_NORD_TANK_SD_S3_24),3);
    sd_array[DG,24].var_name.BitAdr:=BITADR(DG_STUDIO_NORD_TANK_SD_S3_24) AND 7;
    Und im FB "sd_schalten"
    Code:
    IF ein_aus
    THEN
       sd_array[Etage,Kabel].var_name.ByteAdr^:=sd_array[Etage,Kabel].var_name.ByteAdr^ OR SHL(BYTE#1,sd_array[Etage,Kabel].var_name.BitAdr);
    ELSE
       sd_array[Etage,Kabel].var_name.ByteAdr^:=sd_array[Etage,Kabel].var_name.ByteAdr^ AND NOT SHL(BYTE#1,sd_array[Etage,Kabel].var_name.BitAdr);
    END_IF

  7. #16
    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,

    Deine Antworten sind sehr anspruchsvoll, danke dafür. Ich ziehe mir das jetzt mal rein und melde mich, wenn ich es kapiert habe.

    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
  •