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

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

Thema: Adresse von Formaloperanden ermitteln

  1. #1
    Registriert seit
    25.10.2007
    Beiträge
    7
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo, ich habe folgendes Problem:

    Habe mir einen FC geschrieben, der einen binären Zustand auswertet (Meldung, Warnung, ...).
    Damit ich dem FC nur 1 Bit übergeben muss (IN_OUT), greife ich auf diverse Hilfsmerker(Datenbits) indirekt zu, indem ich mir die Adresse des Formaloperanden auslese (Netzwerk 1, 1. Anweisung) und Offsets dazuaddiere.

    Code:
    FUNCTION FC 21 : VOID
    TITLE =Antrieb: Meldung
    FAMILY : Antrieb
    VERSION : 1.0
    
    
    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 : BOOL ;    //Meldung
      Antrieb : UDT 11;    
    END_VAR
    
    VAR_TEMP
      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 der Meldung
          T     #adresse_Meldungen; 
          LAR1  ; // Dient nur zur Kontrolle, welche Adresse "übergeben" wird
          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
    
          U     #Sign; 
          =     #Meldung; // Störmeldung
          FP    DBX [#adresse_FLM]; 
          =     DBX [#adresse_FL]; // Flanke Störmeldung gekommen
    
          U     #Meldung; 
          U     #Meldung_ist_Alarm; 
          =     DBX [#adresse_Alarme]; // Störmeldung schaltet Antrieb ab
    
          U     #Meldung; 
          UN    #Meldung_ist_Alarm; 
          =     DBX [#adresse_Warnungen]; // Störmeldung schaltet Antrieb NICHT ab
    
          U     #Antrieb.Schnittstelle.Quitt; 
          R     DBX [#adresse_Meld_gesp]; 
          U     DBX [#adresse_FL]; 
          U     DBX [#adresse_Alarme]; 
          S     DBX [#adresse_Meld_gesp]; // gespeicherte Meldung
    
    END_FUNCTION
    Wenn ich nun dem FC als Parameter z.B.: M12.1 übergebe, verwendet er die M16.1, M20.1, M24.1, usw. als Hilfsmerker (vorausgesetzt im Netwerk 2 wird DBX durch M ersetzt) --> funktioniert.
    Wenn ich aber ein Datenbit übergebe (z.B: DB201.DBX10.0), dann funktioniert das mit dem Auslesen der Adresse des Formaloperanden nicht mehr.

    Ich weiß nicht warum.

    Wäre dankbar, wenn mir jemand helfen könnte.
    Zitieren Zitieren Adresse von Formaloperanden ermitteln  

  2. #2
    Registriert seit
    15.06.2008
    Beiträge
    119
    Danke
    19
    Erhielt 24 Danke für 19 Beiträge

    Standard

    Wenn ich nun dem FC als Parameter z.B.: M12.1 übergebe, verwendet er die M16.1, M20.1, M24.1, usw. als Hilfsmerker
    Dafür gehörst du öffentlich ausgepeitscht!

  3. #3
    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
    Wenn ich aber ein Datenbit übergebe (z.B: DB201.DBX10.0), dann funktioniert das mit dem Auslesen der Adresse des Formaloperanden nicht mehr.
    es fehlt die information, welcher datenbaustein.
    also entweder über ein word übergeben oder ANY verwenden und auswerten.
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  4. #4
    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 vierlagig Beitrag anzeigen
    es fehlt die information, welcher datenbaustein.
    Wenn du damit das Netzwerk 2 meinst: Richtiger DB ist aufgeschlagen.

    Das Problem fängt schon bei der 1. Zeile im 1. Netzwerk an:
    Beim Merker taucht im Adressregister (LAR1) wirklich M12.1 auf, wobei beim Datenbit (egal welches) nur V21.0 auftaucht. --> Was bedeutet V21.0 im Adressregister?

  5. #5
    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

    V weist auf die vorherigen Lokaldaten hin.
    das wird so nix, weil dir bei deinem pointer 2byte fehlen, nämlich die, in denen die DB-nummer steht.
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.715
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    ... wie wäre es, die fragliche Variable als Pointer zu definieren ? Dann kämen doch die benötigten Info's mit ...

    Gruß
    LL

  7. #7
    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 Larry Laffer Beitrag anzeigen
    ... wie wäre es, die fragliche Variable als Pointer zu definieren ? Dann kämen doch die benötigten Info's mit ...

    Gruß
    LL
    das meinte ich mit ANY


    so sieht der aufruf mit Datenbaustein aus, wie du siehst, wird er schon vorher aufgemacht und nicht übergeben... was du liest, ist das lokalbit, das für die beschaltung des FCs benutzt wird, im aufrufbeispiel die 24.1
    es würde also im baustein ein V24.1 geladen ...
    Code:
    *
          BLD   1
          =     L     24.0
          AUF   DB    20
          U     DBX    0.0
          =     L     24.1
    
          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#L 24.1
                P#L 25.0
          U     L     24.1
          AUF   DB    20
          =     DBX    0.0
          BLD   2
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  8. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.715
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    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

  9. #9
    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 Larry Laffer Beitrag anzeigen
    ... wie wäre es, die fragliche Variable als Pointer zu definieren ? Dann kämen doch die benötigten Info's mit ...

    Gruß
    LL
    Muss ich dann den Pointer in Lokalvariablen umkopieren, um ihn "zerlegen" zu können?

  10. #10
    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
    Zitat Zitat von Katzi Beitrag anzeigen
    Muss ich dann den Pointer in Lokalvariablen umkopieren, um ihn "zerlegen" zu können?
    Kommando zurück, Pointer sind gar nicht erlaubt im Lokalbereich eines FC.

Ä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
  •