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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Pointer für einen Datenlogger

  1. #1
    Registriert seit
    03.01.2013
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo SPS-Forums User
    zuerst mal allen ein Gutes neues Jahr.

    Ich habe ein Problem mit Variablen Pointern:

    Die Anleitung, wie ein Pointer aufgebaut ist, habe ich gelesen und auch glaube ich verstanden.
    Jedoch scheitert es an der Umsetzung.

    Meine Hardware:
    CPU 319 3PN/DP (318er)
    Zu meinem Problem:

    Ich mochte mir einen Datenlogger basteln.
    Daten alle 5 Minuten aufzeichnen und diese in eine Array mit 288 Realwerten schreiben.
    Ich habe einen Integer erzeugt, der alle 5 Minuten um den Wert 1 weiterspringt.
    Nun soll ein Realwert geladen werden und abhängig vom INT-Wert (Zähler für Pointer) in den Passenden ARRAYEINTAG geschrieben werden.

    Kann mir dafür jemand ein Beispiel schreiben?
    Die Daten werden wie gesagt in einem DB abgelegt der wie Folgt aussieht:

    STAT:
    DB562.DBW0 Kurven-Anforderung [WORD]
    DB562.DBW2 Kurven-Übertrag [WORD]
    DB562.DBD4 LOGGER [0, 1] Loggerwert 1 [REAL]
    DB562.DBD8 LOGGER [0, 2] Loggerwert 2 [REAL]
    DB562.DBD12 LOGGER [0, 3] Loggerwert 3 [REAL]
    DB562.DBD16 LOGGER [0, 4] Loggerwert 4 [REAL]
    usw (288 Werte)

    Vielen Dank im Voraus
    Gruß Stefan
    Zitieren Zitieren Pointer für einen Datenlogger  

  2. #2
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Hallo!

    Hier mal ein kleiner Denkanstoß:

    Code:
    FUNCTION "LOGGER": VOID
    VAR_INPUT
        SAVE:           BOOL;
        SAVE_COUNT:     INT;
        SAVE_VALUE:     REAL;
    END_VAR
    VAR_IN_OUT
        LOGG_ARRAY:     ARRAY[1..288] OF REAL; 
    END_VAR
    BEGIN
    IF SAVE THEN
        LOGG_ARRAY[SAVE_COUNT]:= SAVE_VALUE;   
    END_IF;
    END_FUNCTION
    Gruß
    Wer aufhört, besser zu werden, hat aufgehört, gut zu sein!

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

    Standard

    Mal auf die Schnelle: Dein erster Wert beginnt bei DBD4

    Angenommen, du fängst mit den Zähler für den Pointer mit 1 an, dann paßt das glücklicherweise so schon.
    (Beginnt deine Wertetabelle später im DB, dann rechnest du noch den Offset dorthin vor dem SLD 3 dazu.)

    Dann rechnest du :

    Code:
    L #Pointerzaehler
    L 4                       //ein DWord hat 4 Byte, also immer 4 Byte von Wert zu Wert
    *I
    SLD 3                   //Pointerformat erstellen
    T #MyPointer
    zusammengefaßt ergibt das

    Code:
    L #Pointerzaehler
    SLD 5
    T #MyPointer
    Damit kannst du dann den Wert wie folgt schreiben

    Code:
    L #Pointerzaehler
    SLD 5
    T #MyPointer
    LAR 1
     
    AUF DB 562
    L #MyRealWert 
    T DBD[AR1, P#0.0]
    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

  4. #4
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Kann mir irgendwer verraten was ich beim FB-Aufruf hinschreiben muss, wenn der IN_OUT Parameter ein Array ist?
    (also so wie da oben von SCM beschrieben).

  5. #5
    hantschel1981 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    03.01.2013
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Ralle, ef funzt.

    Musste nur ne kleine änderung durchführen:


    L #Pointerzaehler
    SLD 5
    T #MyPointer
    LAR 1
    L #MyRealWert
    AUF DB 562
    T DBD[AR1, P#0.0]

  6. #6
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Also beim FC Aufruf an den Eingang "LOGG_ARRAY" kommt ein Array.
    Wenn das Array im DB "TEST" steht und "SAVE" heißen würde kommt dort "TEST".SAVE ran!

    Gruß
    Wer aufhört, besser zu werden, hat aufgehört, gut zu sein!

  7. Folgender Benutzer sagt Danke zu SCM für den nützlichen Beitrag:

    borromeus (03.01.2013)

  8. #7
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Najo, ich habe einen FB, ist das ein Unterschied?
    Ich habe einen DB angelegt mit einer Arraylänge von 1..288, diesen MESSWERTE getauft und im DBX0.0 steht nun der Bezeichner Feld.

    Schreibe ich "MESSWERTE".Feld kommt die Fehlermeldung:
    Aktualdatentyp ARRAY paßt nicht zu formalem Typ ARRAY des Formalparameters LOGG_ARRAY

  9. #8
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard

    Müsste egal sein ob FC oder FB!
    Ist es auch ein REAL array?
    Also bei mir funktioniert das!
    Gruß
    Wer aufhört, besser zu werden, hat aufgehört, gut zu sein!

  10. #9
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Ja, ist REAL...

    :-/
    jetzt probier ich einmal was in SCL zu programmieren und schon geht es schief

  11. #10
    Registriert seit
    31.03.2010
    Beiträge
    335
    Danke
    3
    Erhielt 33 Danke für 32 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Also das ist dann komisch!
    Leg dir mal einen UDT an und ändere es im Baustein so das dort staht dem Array ein UDT steht!

    Code:
    TYPE UDT_SAVE
    STRUCT
        VALUE:      ARRAY[1..288] OF REAL; 
    END_STRUCT
    END_TYPE
    FUNCTION_BLOCK SYS_LOGGER
    TITLE = 'LOGGER'
    VAR_INPUT
        SAVE:           BOOL;
        SAVE_COUNT:     INT;
        SAVE_VALUE:     REAL;
    END_VAR
    VAR_IN_OUT
        LOGG_ARRAY:     UDT_SAVE;
    END_VAR
    BEGIN
    IF SAVE THEN
        LOGG_ARRAY.VALUE[SAVE_COUNT]:= SAVE_VALUE;   
    END_IF;
    END_FUNCTION_BLOCK

    So sollte es auf jedenfall auch bei dir funktionieren
    Später im DB Messwerte bei Feld statt dem Array den udt eingeben!

    GRUß
    Geändert von SCM (03.01.2013 um 14:02 Uhr)
    Wer aufhört, besser zu werden, hat aufgehört, gut zu sein!

  12. Folgender Benutzer sagt Danke zu SCM für den nützlichen Beitrag:

    borromeus (03.01.2013)

Ähnliche Themen

  1. Suche Datenlogger für Spannung
    Von Baal im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 18.06.2010, 21:09
  2. Indirekte Adressierung über einen ANY Pointer
    Von sventek im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 11.12.2009, 06:33
  3. Datenlogger für Stückzählung
    Von L.B. im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 09.06.2009, 10:49
  4. Antworten: 3
    Letzter Beitrag: 28.05.2007, 09:31
  5. Flexibler Datenlogger für S7-Prozessdaten: ACCON-S7-EasyLog
    Von Gerhard Bäurle im Forum Werbung und Produktneuheiten
    Antworten: 0
    Letzter Beitrag: 16.01.2007, 13:31

Lesezeichen

Berechtigungen

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