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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: Adresse von Formaloperanden ermitteln

  1. #11
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Nein - nein ... ich meinte tratsächlich POINTER und nicht ANY. Der Pointer hätte den Vorteil, dass er nicht ganz so breit ist wie der ANY nur halt keinen Bereich übergeben kann - das war hier ja aber auch gar nicht gefordert ...

    Gruß
    LL
    hast ja recht...

    und dann kann man schön auswerten:

    Code:
    *
          L     P##pIn
          LAR1
    
          L     W [AR1,P#0.0]
          L     0
          <>I   
          SPBN  db2
          TAK   
          T     #wDB1
          SET   
          =     #xDB1
          SPA   db3
    db2:  CLR   
          =     #xDB1
    und entsprechend reagieren...

    ANY hätte den vorteil, den datentyp überprüfen zu können... aber ist ja nicht notwendig
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  2. #12
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von Katzi Beitrag anzeigen
    Kommando zurück, Pointer sind gar nicht erlaubt im Lokalbereich eines FC.
    aber als INOUT
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. #13
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von vierlagig Beitrag anzeigen
    so sieht der aufruf mit Datenbaustein aus, wie du siehst, wird er schon vorher aufgemacht und nicht übergeben
    das kann man sich doch zu nutze machen... funktioniert allerdings nur, solange du nur ein datenbaustein-bit bzw. alles aus dem selben DB an IN und IN/OUT benutzt... nur die bitadresse bekommste so immer noch nicht rüber...

    Code:
    *
          L     DBNO                        // letzten offenen Globaldatenbaustein ...
          T     #wDbnoSave
          AUF   DB [#wDbnoSave]
    eieiei ... das ist ja ganz böse....
    Geändert von vierlagig (18.03.2010 um 15:32 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  4. #14
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    so müßte es gehen, ABER schön ist anders ...

    Code:
    *
          AUF   DB    20
          CALL  FC    21
           Sign             :=E10.0
           Meldung_ist_Alarm:=E10.1
           Meldung          :=DBX0.0
           Antrieb          :=#antrieb
    Code:
    *
          AUF   DB    20
          BLD   1
          =     L     24.0
          L     0
          T     LW    25
          L     P#L 20.0
    
          T     LD    27
          UC    FC    21
                P#E 10.0
                P#E 10.1
                P#DBX 0.0
                P#L 25.0
          BLD   2
    Geändert von vierlagig (18.03.2010 um 15:48 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  5. #15
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    @Katzi

    2 Fragen:

    1. Warum machst du die Auswertung nicht gleich im Antriebs FB/FC?
    Wenn ich richtig verstanden habe, dann wird dort dein UDT versorgt.

    2. Wie ist der UDT aufgebaut?

    Micha
    "arbeite klug, nicht hart" - deutsches Sprichwort

  6. #16
    Katzi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    25.10.2007
    Beiträge
    7
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von SPSKILLER Beitrag anzeigen
    @Katzi
    Warum machst du die Auswertung nicht gleich im Antriebs FB/FC?
    Wenn ich richtig verstanden habe, dann wird dort dein UDT versorgt.
    Weil ich ein Modulares Bausteinsystem aufbaue, bei dem nur das aufgerufen wird, was vom Antrieb auch benötigt wird.
    - Um Resourcen zu sparen
    - Um nicht einen Megagrossen FB beschalten zu müssen (vor grosssen FB's haben viele Leute Angst ...)

  7. #17
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    ok. wenn du das so machen willst ist das deine Sache.
    Übersichtlicher ists sicher nicht.

    Wie sieht der UDT denn aus?
    Die Logik sagt mir, dass darin das Bit "Meldung" steckt.
    (1) Ist das richtig ?

    Willst du den FC21 für jeden Antrieb aufrufen, oder deinen Eingang multiplexen?

    Falls du FC21 für jeden Antrieb einmal aufrufst und (1) richtig ist, dann kannst du dir den IN/OUT "Meldung" sparen.
    Die Adresse hast du dann schon.

    Micha
    "arbeite klug, nicht hart" - deutsches Sprichwort

  8. #18
    Katzi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    25.10.2007
    Beiträge
    7
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von SPSKILLER Beitrag anzeigen
    Wie sieht der UDT denn aus?
    Die Logik sagt mir, dass darin das Bit "Meldung" steckt.
    (1) Ist das richtig ?

    Willst du den FC21 für jeden Antrieb aufrufen, oder deinen Eingang multiplexen?
    Ja, im UDT stecken die Meldungen (bis zu 32).
    Daher kann der FC21 für jeden Antrieb mehrmals für verschieden Meldungen aufgerufen werden.

  9. #19
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    669
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    ok. dann ist es ganz einfach das UDT indirekt anzusprechen.
    Du übergibst ja den UDT.

    Schreib einfach mal als erste 2 Zeilen in deinem FC 21
    Code:
    u antrieb.meldungen
    clr
    und schon ist der richtige DB offen.
    AR1 steht am Anfang des UDT.

    Danach sparst du dir die vielen Lokaldoppelwörter und arbeitest mit AR1 + Offset.

    Micha
    "arbeite klug, nicht hart" - deutsches Sprichwort

  10. #20
    Katzi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    25.10.2007
    Beiträge
    7
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke Jungs für eure Tipps.

    Folgendermassen habe ich das jetzt in den Griff bekommen:

    Code:
    FUNCTION FC 21 : VOID
    TITLE =Antrieb: Meldung
    
    VAR_INPUT
      Sign : BOOL ;    //Feldsignal Fehler (1=Fehler)
      Meldung_ist_Alarm : BOOL ;    //Meldung ist Alarm (1=Antrieb wird abgeschaltet, 0=Nur Warnung)
    END_VAR
    VAR_IN_OUT
      Meldung : POINTER ;    //Meldung
      Antrieb : UDT 11;    
    END_VAR
    VAR_TEMP
      DB_Nummer : INT ;    
      adresse_Meldungen : DINT ;    
      adresse_Alarme : DINT ;    
      adresse_Warnungen : DINT ;    
      adresse_FLM : DINT ;    
      adresse_FL : DINT ;    
      adresse_Meld_gesp : DINT ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Adressen der Bits für die Alarmbehandlung ermitteln
    //Folgende Adressen ergeben sich aus dem Aufbau des UDT11!!
    //
    //Die Beschaltung der Meldung von aussen muss ein Bit aus dem Bereich "Meldungen" 
    //sein --> UDT11, Offset 12!!
          L     P##Meldung; // Adresse des Pointers (Zeigt auf Lokaldaten des aufrufenden FC)
          LAR1  ; // Lokaldaten des Aufrufenden FC ins Adressregister, um an die "echten" Adressen zu kommen
    
          L     W [AR1,P#0.0]; // DB-Nummer von Pointer holen
          T     #DB_Nummer; 
    
          L     D [AR1,P#2.0]; // Bitadresse von Pointer holen
    
          T     #adresse_Meldungen; // Adresse der Meldung
          L     P#4.0; 
          +D    ; 
          T     #adresse_Alarme; // 4 Bytes dahinter: Alarme
          L     P#4.0; 
          +D    ; 
          T     #adresse_Warnungen; // 8 Bytes dahinter: Warnungen
          L     P#4.0; 
          +D    ; 
          T     #adresse_FLM; // 12 Bytes dahinter: Flankenmerker
          L     P#4.0; 
          +D    ; 
          T     #adresse_FL; // 16 Bytes dahinter: Flanken
          L     P#4.0; 
          +D    ; 
          T     #adresse_Meld_gesp; // 20 Bytes dahinter: Meldungen gespeichert
    
    NETWORK
    TITLE =Meldung aufbereiten
    
          AUF   DB [#DB_Nummer]; 
    
          U     #Sign; 
          U     #Antrieb.Schnittstelle.Ctrl_VLT; // Steuerspannung
          =     DBX [#adresse_Meldungen]; // Störmeldung
          FP    DBX [#adresse_FLM]; 
          =     DBX [#adresse_FL]; // Flanke Störmeldung gekommen
    
          U     DBX [#adresse_Meldungen]; 
          U     #Meldung_ist_Alarm; 
          =     DBX [#adresse_Alarme]; // Störmeldung schaltet Antrieb ab
    
          U     DBX [#adresse_Meldungen]; 
          UN    #Meldung_ist_Alarm; 
          =     DBX [#adresse_Warnungen]; // Störmeldung schaltet Antrieb NICHT ab
    
          U     #Antrieb.Schnittstelle.Quitt; // Störungsquittierung
          R     DBX [#adresse_Meld_gesp]; 
          U     DBX [#adresse_FL]; 
          U     DBX [#adresse_Alarme]; 
          S     DBX [#adresse_Meld_gesp]; // gespeicherte Meldung
    
    END_FUNCTION
    @SPSKILLER

    und schon ist der richtige DB offen.
    AR1 steht am Anfang des UDT.
    Das ist richtig, aber man weiss immer noch nicht das genaue Bit, das dem FC von aussen übergeben wurde.

Ähnliche Themen

  1. Adresse von Struct in TEMP ermitteln
    Von cosmomaster im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 23.05.2011, 19:17
  2. in SCL Adresse von String im IDB ermitteln
    Von Ralle im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 03.03.2011, 09:39
  3. DB Adresse ermitteln
    Von Marc_Quark im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 22.10.2009, 08:22
  4. Adresse des geöffneten DBs ermitteln
    Von Woto im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 29.09.2008, 12:09
  5. Adresse im Instanzdatenbaustein ermitteln
    Von hubiwahn im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 25.09.2006, 16:14

Stichworte

Lesezeichen

Berechtigungen

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