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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: Einausgaenge in Structur initialisieren

  1. #1
    Registriert seit
    05.03.2009
    Beiträge
    12
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich moechte die IO variablen in folgender Structur initialisieren:
    TYPE T_CYL :
    STRUCT
    ndi_on : BOOL;
    ndi_off :BOOL;
    ndo_on :BOOL;
    ndo_off :BOOL;
    pb_on :BOOL;
    pb_off :BOOL;

    END_STRUCT
    END_TYPE

    Habe folgendes versucht:

    IF NOT bFlag
    THEN
    bFlag := TRUE;
    cyl_sig.ndi_off := %IX0.0 ;
    cyl_sig.ndi_on := %IX0.1;
    cyl_sig.ndo_off := %QX0.0;
    cyl_sig.ndo_on := %QX0.1;
    cyl_sig.pb_off :=%M*;
    cyl_sig.pb_on :=%M*;

    END_IF;

    cyl_sig.ndo_off := cyl_sig.ndi_off OR cyl_sig.pb_off;
    cyl_sig.ndo_on:= cyl_sig.ndi_on OR cyl_sig.pb_on;

    Funtioniert aber leider nicht.
    %IX0.0 kann einschalten, aber cyl_sig.ndi_off wird nicht gesetzt.
    Natuerlich cyl_sig.ndo_off natuerlich auch nicht.

    Vielen Dankf fuer jede Hilfe.
    Zitieren Zitieren Einausgaenge in Structur initialisieren  

  2. #2
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    Zitat Zitat von Ebias Beitrag anzeigen
    IF NOT bFlag
    THEN
    bFlag := TRUE;
    cyl_sig.ndi_off := %IX0.0 ;
    cyl_sig.ndi_on := %IX0.1;
    cyl_sig.ndo_off := %QX0.0;
    cyl_sig.ndo_on := %QX0.1;
    cyl_sig.pb_off :=%M*;
    cyl_sig.pb_on :=%M*;

    END_IF;

    cyl_sig.ndo_off := cyl_sig.ndi_off OR cyl_sig.pb_off;
    cyl_sig.ndo_on:= cyl_sig.ndi_on OR cyl_sig.pb_on;

    Funtioniert aber leider nicht.
    %IX0.0 kann einschalten, aber cyl_sig.ndi_off wird nicht gesetzt.
    Natuerlich cyl_sig.ndo_off natuerlich auch nicht.

    Vielen Dankf fuer jede Hilfe.
    cyl_sig.ndi_off := %IX0.0 gilt nur für einen Zyklus, nämlich solange bFlag = FALSE ist. Nur in diesem Zyklus findet eine Zuweisung des Zustands von %IX0.0 auf cyl_sig.ndi_off usw. statt. War %IX0.0 im Zyklus der Zuweisung = FALSE, dann bleibt das auch so.

    Das Konzept geht so nicht, wenn du damit bezwecken willst, dass während des ganzen Programms die EIn-/Ausgänge abgefragt werden.

    Du könntest gleich bei der Deklaration in der Struktur die E/As zuweisen oder das ganze gleich über Variablen machen.
    Oder lass gleich diese bFlag-Abfrage sein.

  3. #3
    Ebias ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.03.2009
    Beiträge
    12
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Die IO variablen sollen eher auf die physicalischen Ein/Ausgaenge zeigen.
    Pointer habe ich auch schon versucht, aber nicht den richtigen Weg gefunden.
    Die Structure direkt zu initialisieren geht nicht, da ich sie ja fuer eine Anzahl von
    Cylindern einsetzen will.

  4. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Vielleicht hilft dir das etwas weiter: http://www.sps-forum.de/showthread.p...light=zuweisen

    In irgendeinem Beitrag hatten wir mal die unterschiedlichen Möglichkeiten diskutiert, einem FB seine In und Out zuzuweisen. Leider kann ich den Beitrag gerade nicht finden.
    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

  5. #5
    Ebias ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.03.2009
    Beiträge
    12
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Stimmt. Den Beitrag habe ich gesehen.
    Aber, ich glaube es endet nicht recht conclusiv.

  6. #6
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    Und wieso mappst du nicht zunächst alle in Frage kommenden I/Os auf Variablen ...
    Code:
    bIn1 := %IX0.0;
    bIn2 := %IX0.1;
    Und später im Programmablauf machst du dann nur noch:
    Code:
    cyl_sig.ndi_off  := bIn1  ;
    cyl_sig.ndi_on  := bIn2 ;
    usw.

    Ich verstehe noch nicht so recht den Anwendungsfall und den Grund für dein "bFlag". Eine einmalige Zuweisung macht für mich keinen Sinn, wenn du später auf die Eingänge reagieren willst.
    Wenn du während des Programms dynamisch die I/Os auf verschiedene Strukturinstanzen mappen willst, bleibt dir gar keine andere Möglichkeit als entweder (statisch) die I/Os durch Variablen (oder auch direkt) zuzuweisen oder (dynamisch) mit Pointern zu arbeiten.
    Kannst du mal bitte näher erläutern?

    btw.:
    Verwendet du TwinCAT oder nen allgemeines CoDeSys?

  7. #7
    Ebias ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.03.2009
    Beiträge
    12
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Der Gedanke hinter dem bFlag ist das am begin des Programs initialisiert wird. Eben Pointer oder dergleichen.
    Und dann laeuft das Program ja eh zyklisch im Task.
    Die cyl_sig structure soll eben alle signale halten, die fuer einen simplen zylinder noetig sind. Die structure soll dann in einem FB_Cyl sein Zuhause finden. Der FB_cyl waere dann der blue print fuer simple zylinder.
    Pointer waeren eh okay. Aber wie ist die frage. Auf ein/ausgaenge kann ich nur mit BITADR dereferenzieren. Sobald ich dann aber versuche mit ^ zu referenzieren stuerzt mit die echtzeit mit einem page fehler ab. D.h. der pointer pointed nicht richtig.
    Was waere das gegenstueck fuer BITADR, oder wie kann ich IO referenzen an einen FB weiter reichen. Oder gibt es ein array mit einem system namen in dem die IOs liegen ?

    Vielen Dank fuer die Hilfe!

    P.S. TwinCat

  8. #8
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    Na wenn du eh TwinCAT nutzt, dann pfeiff doch auf die Adressierung

    Bastel dir den Baustein und mach die Adressierung so:
    Code:
    FUNCTION BLOCK FB_Zylinder
    VAR
      ndi_on AT%I*: BOOL;
      ndi_off AT%I*: BOOL;
    ...
    END_VAR
    Oder du deklarierst die I/Os noch eine Ebene höher schon in den Strukturen:
    Code:
    TYPE T_CYL :
      STRUCT
        ndi_on AT%I*: BOOL;
        ndi_off AT%I*: BOOL;
        ndo_on AT%Q*: BOOL;
        ndo_off AT%Q*: BOOL;
        pb_on :BOOL;
        pb_off :BOOL;
      END_STRUCT
    END_TYPE
    Später instanzierst du dann soviele FBs wie du willst. Im System Manager tauchen die dann alle als I/Os deiner FBs auf:
    Code:
    FB_1.ndi_on
    ... 
    FB_2.ndi_on
    ...
    oder tiefer in den Strukturen
    Code:
    FB_1.stMyStruct.ndi_on
    ... 
    FB_2.stMyStruct.ndi_on
    ...
    und du kannst die schön verlinken.

    Mit Pointer arbeiten würde ich dir nicht empfehlen. Wie du schon bemerkt hast, kann da einiges in die Hose gehen.
    Da die I/Os ja eh beim Systemstart feststehen, benötigst du doch auch gar keine dynamische Adressierung, oder? Oder ändert sich die elektrische Verschaltung während des Ablaufs? Denke mal eher nicht.
    Geändert von trinitaucher (05.03.2009 um 20:41 Uhr)

  9. Folgender Benutzer sagt Danke zu trinitaucher für den nützlichen Beitrag:

    Ralle (05.03.2009)

  10. #9
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    @trinitaucher

    Genau das meinte ich. Den Beitrag hatte ich nicht mehr gefunden, indem das vor einiger Zeit mal behandelt wurde.
    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

  11. #10
    Ebias ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    05.03.2009
    Beiträge
    12
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das hoert sich soweit gut an,
    gibt mir aber den compiler error:

    ERROR 3278: T_CYL(5) invalid address: '%I*'

    Gleiches natuerlich auch fuer die Ausgaenge.

Ähnliche Themen

  1. SCL akzeptiert Structur nicht
    Von Bensen83 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 02.03.2011, 11:52
  2. WinCC flex Structur --> Array
    Von supergrobi im Forum HMI
    Antworten: 13
    Letzter Beitrag: 10.03.2010, 11:05
  3. Schrittkette in AS initialisieren
    Von Dirty Harry im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 14.04.2009, 16:39
  4. 3 Byte in eine Structur laden
    Von INST im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 09.02.2009, 09:41
  5. Antworten: 7
    Letzter Beitrag: 17.10.2005, 10:54

Lesezeichen

Berechtigungen

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