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

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

Thema: TwinCat 2.11 (2228) persisentes Variablen Phänomen

  1. #11
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    750
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Es gibt ja ausser MEMSET/MEMCPY noch andere FB's in den Beckhoff-Lib's, die Variablenadressen als Pointer erhalten. Such doch mal global nach "ADR(", vielleicht kommt da noch etwas zu Tage.

  2. Folgender Benutzer sagt Danke zu StructuredTrash für den nützlichen Beitrag:

    Bl000b3r (31.01.2013)

  3. #12
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Je nachdem wie deine persistenten Daten strukturiert sind, würde ich mal versuchen direkt vor dem Problemkind im Speicher eine weitere persistente Variable anzulegen. Dann komplett übersetzen und prüfen ob das Problem noch da ist, bzw. sich auf die neue Variable verschoben hat.

  4. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Bl000b3r (31.01.2013)

  5. #13
    Registriert seit
    29.09.2006
    Beiträge
    368
    Danke
    0
    Erhielt 41 Danke für 38 Beiträge

    Standard

    Die Idee von Thomas ist ebenfalls gut. Weiterhin kann man das Projekt beim/nach dem Compile auf Speicherüberlappungen prüfen lassen, bei VarConfigs mit IOs oder direkten Adressen auch ein beliebtes Problem.

  6. #14
    Registriert seit
    04.03.2011
    Beiträge
    77
    Danke
    15
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Zwischeninfo:

    Bin auf auf Arbeit noch nicht dazugekommen euere Sachen mal zu testen. Habe aber gerade ein Weltwunder erlebt ... Der Beckhoff-Support hat mich angerufen xD und hat gemeint ich sollte mal ff ausprobieren um sicher zu gehen, dass das sps file die daten überschreibt.

    ALs erstes muss ich sagen, dass ich angefangen hatte die persistenten Daten per Hand auf feste Merkerbereiche zu legen. Hatte dann einen Merkerbereich der immer wieder 0 wurde ... habe darauf eine "dummy" variable gelegt.

    Der Supportmensch meinte ich sollte mal mein Projekt einspielen, Bootproject erzeugen und die Variablen beschreiben. Danach ausloggen, den Hacken bei Bootproject rausnehmen und die Steuerung neustarten. Danach versuchen einzuloggen - "Kein Programm auf Steuerung vorhanden, neue Programm laden?" - hab es dann nochmal eingespielt. Danach ist die SPS ja noch im STOP ... peristenten Variablen ALLE vorhanden ... SPS per F5 in Run versetzt ... BOOOM war die dummy-variable wieder 0

    Wollts nur mal so nebenbei mitteilen ... Hab jetzt noch gut 2h freie Spitzen und werd mal alles bereinigen und nach Befehlen & Fb's Mit ADR etc. suchen ... die nadel im heuhaufen

    update kommt bald

    PS: die option "überlappende speicherbereich" hab ich immer an beim übersetzen ... er bringt nur von paar ausgänge die überlappungen, aber das sind Festo Ventilinseln die nur per Byte angesprochen werden, und da ist ja jedes ventil nochmal bit genau adressiert
    Geändert von Bl000b3r (31.01.2013 um 14:55 Uhr)
    Es kommt nicht darauf an, mit dem Kopf durch die Wand zu rennen, sondern mit den Augen die Tür zu finden.

  7. #15
    Registriert seit
    29.09.2006
    Beiträge
    368
    Danke
    0
    Erhielt 41 Danke für 38 Beiträge

    Standard

    Also wird es wohl mit den Codeteilen überschrieben. Vielleicht das Programm in Blöcke teilen und immer nur nach und nach weitere aufrufen.

  8. #16
    Registriert seit
    04.03.2011
    Beiträge
    77
    Danke
    15
    Erhielt 6 Danke für 6 Beiträge

    Standard

    ich glaub ich hab den schuldigen gefunden
    habe erstmal alle Befehle mit ADR() auskommentiert und bin wieder so wie oben vorgegangen erstmal schauen und das sps in run versetzen.
    Das hat wunderbar funktioniert, alle pers.Vars waren noch genauso da, wie ich sie geschrieben habe.

    Also habe ich angefangen Stück für stück die einzelnen Befehle mit ADR() reinzunehmen und habe die 2 Befehle gefunden:

    MEMSET

    Habe eine Struktur St_Status:

    Code:
    
    
    Code:
    TYPE ST_NestStatus :
       STRUCT
             Var1: BOOL; 
             Var2: BOOL; 
             Var3: BOOL; 
             Var4: BOOL; 
            Var5: BOOL;
            Var6: BOOL;    
            Var7: BOOL;    
            Var8: BOOL;    
            Var9: BOOL;    
            Var10: BOOL;    
            Var11: BOOL;    
            Var12: BOOL;
            Var13: BOOL;
       END_STRUCT
    END_TYPE
    Das bilde ich mir eine pers. Variable als Array von 1 bis 2. Sind quasi 2 Nester wo der Bearbeitungsstatus festgehalten wird.

    Code:
     St1_Nest : ARRAY [1..2] OF ST_NestStatus
    So, wenn nun die Steuerspannung reingeht stehen erstmal alle Schrittketten in einem "Warteschritt" - daraus kannste GSF machen oder eben handbetrieb.

    So in nun eben diesem Schritt frage ich per Ini's den Beladezustand ab

    Code:
    IF NOT Nest1_Beladen THEN
      MEMSET (ADR(St1_Nest[1]), 0, SIZEOF(St1_Nest[1]));
    END_IF
    
    IF NOT Nest2_Beladen THEN
      MEMSET (ADR(St1_Nest[2]), 0, SIZEOF(St1_Nest[2));
    END_IF
    Sehe selber gerade eben, dass es nicht gerade klug, dass sowas in jedem Zyklus durchlaufen ist xD

    Ist aber denk ich sehr wahrscheinlich, dass es daran lag ... jedenfalls verlier ich auch nach dem 10. neustart keine variable
    Es kommt nicht darauf an, mit dem Kopf durch die Wand zu rennen, sondern mit den Augen die Tür zu finden.

  9. #17
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Und du meinst an den Zeilen lag das Problem?

    Ich wäre ja neugierig und würde wenn möglich die Zeilen mal wieder reinnehmen, und wenn das Problem dann wieder da ist mal die Adressen vergleichen.
    Also ob ADR(St1_Nest[1]) oder ADR(St1_Nest[2]) sich irgendwie mit ADR(Problemkind) überschneiden. Dabei bedenken dass die Strukturen 13 Bytes groß sind.

    Ich erinnere mich an ein ähnliches Phänomen dass ich nach einem Änderungsladen hatte. Da hatte ich die Vermutung dass ein Zugriff mit ADR() nicht auf die neue Adresse aktualisiert wurde. Nach einem Komplettübersetzen und -laden war aber wieder alles i.O. Und das hast du ja auch schon mehrmals gemacht.

  10. #18
    Registriert seit
    04.03.2011
    Beiträge
    77
    Danke
    15
    Erhielt 6 Danke für 6 Beiträge

    Standard

    @THomas:

    Ja Bereinigen, Alles Übersetzen, Urlöschen, Reset ... alles was TwinCat ansich an Zurücksetz-Optionen hat wurde bereits versucht ^^

    Habe auch einen herben Rückschlag ...

    Habe ja heute mit Beckhoff paar Mal telefoniert (hab ne direkte Nummer von dem Mitarbeiter - die kannste bei eBay versteigern lol) ... als ich ihm die Sache mit MEMSET erklärt habe und gesagt in welchem Schritt dies aufgerufen wurde, sagte er nur "Hier steht nix von Memset" ... da hatte ich bemerkt, dass der Stand mit dem ich probiert hatte aktueller war als der den ich zu beckhoff geschickt hatte ... das pferd kann trotz zahnweh nicht auf der stelle trampeln ^^ ... ich hatte das noch nachträglich reingenommen ... hmm

    also fix das projekt ausm outlook exportiert (selber stand wie beckhoff) und alles ordnungsgemäß neu eingespielt und sihe da ... das "Problemkind" lies nicht mal schreiben obwohl es nur deklaiert war ... also ich hab ich mal den hier erwähnten versuch gestartet und eine neue Integar Variable "Versuch1" vor und "Versuch2" nach dem Problemkind angelegt ...

    danach ließ auch nach mehrmaligen rücksetzen und überstzungsversuchen die variable "versuch2" nicht mehr schreiben und das problemkind funktionierte astrein.


    FAZIT:


    Wenn eine Variable NUR deklariert ist (als persistent) und diese im gegensatz zu allen anderen nicht gespeichert wird, ich aber danach 2 weitere Variablen (nur deklariert - ohne Zugriff) vor und nach der fehlerhaften Variable anlege und der Fehler quasi eins weiter gereicht wird, heißt das doch, dass es zu 99,9% ein Fehler beim Schreiben des Speichers auf SPS Seite ist.


    Der Beckhoff Mensch wills mal nach meiner Anleitung nachstellen und mich morgen nochmal anrufen ^^ Bin ich ja mal gespannt was er dazu sagt

    also ich steht wieder da, wo ich schon mal vor paar tagen stand
    Es kommt nicht darauf an, mit dem Kopf durch die Wand zu rennen, sondern mit den Augen die Tür zu finden.

  11. Folgender Benutzer sagt Danke zu Bl000b3r für den nützlichen Beitrag:

    IBFS (31.01.2013)

  12. #19
    Registriert seit
    04.03.2011
    Beiträge
    77
    Danke
    15
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Hab mal eine Frage:

    Versuche gerade mit Checkbounds Array Zugriffe außerhalb des zu entdecken ... weiß nur nicht so recht wie den handhaben bzw verstehen soll

    Hab einfache ne FUNCTION erstellt

    Code:
    FUNCTION CHECKBOUNDS : DINT
     VAR_INPUT
     index, lower, upper : DINT;
     END_VAR
     VAR
     END_VAR
    _________________________
    
    
    IF index<lower THEN
     CHECKBOUNDS := lower;
     ELSIF index>upper THEN
     CheckBounds := upper;
     ELSE
     CHECKBOUNDS := index;
    END_IF
    Das ist doch scheinbar alles man braucht ^^ also hab ich nen Breakpoint bei "CHECKBOUNDS := lower;" und tipp Zyklus für Zyklus per Hand durch.
    Nur wars das ?

    Er gibt mir dann Werte wie zum Bsp:

    index = 1
    lower = 1
    upper = 4
    Checkbounds = 0

    Verstehe ich das richtig, das sobald eine Bereichsüberschreitung kommt, der Checkbounds Ausgang den Index-Wert annimmt der inkorrekt war ?
    Es kommt nicht darauf an, mit dem Kopf durch die Wand zu rennen, sondern mit den Augen die Tür zu finden.

  13. #20
    Registriert seit
    29.09.2006
    Beiträge
    368
    Danke
    0
    Erhielt 41 Danke für 38 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Nein, ich würde in den IF Zweigen eine globale Variable hochzählen, jeweils für upper und lower. Da mußt Du nicht durchsteppen, das mußt dann erst wenn Fehler vorhanden sind.

Ähnliche Themen

  1. TwinCat Visu mehrere Variablen
    Von preuss im Forum CODESYS und IEC61131
    Antworten: 8
    Letzter Beitrag: 09.01.2011, 21:10
  2. C#-Variablen in TwinCAT lesen und Schreiben
    Von kcirtap im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 29.11.2010, 10:18
  3. TwinCat HMI Web / Globale Variablen gesucht!
    Von Shlomi im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 03.09.2010, 17:38
  4. TwinCat Variablen Online ändern
    Von Bambam im Forum CODESYS und IEC61131
    Antworten: 11
    Letzter Beitrag: 11.08.2010, 17:12
  5. TwinCat - Variablen E/A Kanälen zuweisen für BC9000
    Von sashluc im Forum Sonstige Steuerungen
    Antworten: 3
    Letzter Beitrag: 06.03.2006, 19:17

Lesezeichen

Berechtigungen

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