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

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

Thema: Indirekte DB-Adresse als FC-Eingang

  1. #11
    Avatar von Kniffo
    Kniffo ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.02.2007
    Ort
    Dresden
    Beiträge
    109
    Danke
    17
    Erhielt 11 Danke für 10 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    soweit so klar. Aber ich zeig nochmal ein Stück von meinem Test-Code. Ziel ist hier einfach nur, den Eingang CBO an die parametrierbare Stelle zu schreiben: Wunsch-DB und Wunsch-Bit.

    Die auskommentierten drei Zeilen stellen jeweils meine funktionierende Möglichkeit mit direkter Angabe von DB-Nr. und Startbyte dar.

    Die Zeilen direkt darunter sind der Versuch, symbolische Namen angeben zu können. Die Angabe des DiagDB (jetzt als Typ BLOCK_DB) funktioniert. Aber die Position ist immernoch mein Problem.

    Code:
    VAR_INPUT
      CBO                 : BOOL    := false;      
    //DiagDB                : INT     := 0;           //number of DiagDB -> BSP: 11
      DiagDB              : BLOCK_DB;               //name of DiagDB
    //DiagPos               : INT     := 0;           //number of startbyte -> BSP: 30
      DiagPos             : UDT1;                   //name of startbyte
     END_VAR
    
    BEGIN
    BO := CBO; 
    // WORD_TO_BLOCK_DB(INT_TO_WORD(DiagDB)).DX[DiagPos,0] := CBO;    //BSP: schreibt CBO in DB11.DX30.0
    DiagDB.DiagPos.BI_Orig := CBO;           //erzeugt Fehler: Unzulässige Bitnummer
    BI_Orig steht im Bit 30.0.

    Ich hoffe du hast mein Ziel verstanden!? Vielen Dank für deine Mühe! Aber entweder ich habe dich noch bei etwas missverstanden oder mein Wunsch ist so nicht erfüllbar.

  2. #12
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.786
    Danke
    398
    Erhielt 2.414 Danke für 2.010 Beiträge

    Standard

    Zitat Zitat von Kniffo Beitrag anzeigen
    Ich hoffe du hast mein Ziel verstanden!?
    ... da bin ich noch nicht so sicher.
    Ich fasse trotzdem mal zusammen :
    Du möchtest einen bestimmten Parameter-Block (-Bereich) aus einem DB in deinen FC laden - und zwar mal Block 1, mal Block 2 und mal Block xx ?
    Falls ich dass so richtig verstanden haben dann folgendes :
    - ich habe auch mal so etwas ähnliches programmiert. Hier übergebe ich den Index an meine FC und erhalten den zugehörigen Datenblock (UDT) zurück, den ich dann in den gewünschten Übergabebereich schreibe (wiew eine Rezept-Anwahl). Da ich ja weiß, wie groß mein Datenblock ist kann ich mir mit Hilfe des Index die jeweils zugehörige Start-Adresse im DB berechnen. Das war mein Lade-FC - vielleicht ist das ja als Anregung für dich brauchbar.

    Falls ich das falsch verstanden habe :
    Du kannst nur (in SCL) symbolisch auf etwas zugreifen, wo die Adresse symbolisch bekannt ist. Die Zeile "DiagDB.DiagPos.BI_Orig := CBO;" kann also nicht funktionieren, weil "DiagPos" und "BI_Orig" für SCL nicht bekannt sind. Du kannst nur machen :
    Code:
    DBDiag.DX[DiagPos , BI_Orig] := CB0 ;
    Ich hoffe, ich konnte dir weiterhelfen ...

  3. #13
    Avatar von Kniffo
    Kniffo ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.02.2007
    Ort
    Dresden
    Beiträge
    109
    Danke
    17
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Mir würde es im Prinzip erstmal schon reichen, wenn dein letzter Vorschlag funktioneren würde.
    Aber leider geht das nicht:
    Code:
    DiagDB  : BLOCK_DB;
    DiagPos : UDT1;
    
    DiagDB.DX[DiagPos,BI_Orig] := CB0
    Als Fehler kommt "Ungülitiger Datentyp eines ARRAY-Ausdrucks". Liegt es an dem Datentyp von DiagPos oder weißt du, was ich da angeben müsste? Ich habe auch ANY probiert.

  4. #14
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.786
    Danke
    398
    Erhielt 2.414 Danke für 2.010 Beiträge

    Standard

    ... Oh,
    ich habe nicht auf die Variablen-Typen aufgepasst, die beiden Vars in den eckigen Klammern müssen vom Typ INT sein ...
    Sonst mag SCL das nicht mit der Adressierung ...

  5. #15
    Avatar von Kniffo
    Kniffo ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.02.2007
    Ort
    Dresden
    Beiträge
    109
    Danke
    17
    Erhielt 11 Danke für 10 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich hab es jetzt nach dem Schema von Larry Laffer gemacht.

    Leider funktionierte das so nicht ganz, weil da ein kleiner Haken ist. Die Deklaration darf nicht in VAR_INPUT stehen sondern muss als VAR_IN_OUT angegeben werden, dann funktioniert es.

    Korrekt heißt es
    Code:
    VAR_IN_OUT
    Daten : Name_UDT;
    END_VAR
    ...
    Daten.BI_act := TRUE;
    ...
    Beim Aufruf dieser SCL-FC wird dann am Eingang anparametriert:
    "DB_Symbol".DB_Stelle_Name.

    Gibt man am Eingang "Diag_1".Valve1Opened an, wird die erste Anweisung somit als
    Code:
    "Diag_1".Valve1Opened.BI_act := TRUE;
    interpretiert.

    Danke nochmal für alle Hinweise.

Ähnliche Themen

  1. Antworten: 15
    Letzter Beitrag: 09.09.2011, 10:56
  2. indirekte Adressierung
    Von Christian84 im Forum CODESYS und IEC61131
    Antworten: 9
    Letzter Beitrag: 21.02.2009, 09:09
  3. Antworten: 3
    Letzter Beitrag: 29.08.2007, 13:33
  4. Indirekte Adressierung
    Von wusel220983 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 18.05.2007, 18:19
  5. Indirekte Adressierung !
    Von max1de im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 27.02.2007, 18:18

Lesezeichen

Berechtigungen

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