Jump to content

Memory Error nach Dialog-Manager


Recommended Posts

Hallo!

1) In einem meiner Script-Module habe ich im Dialog-Manager die Modul und Kanal Eigenschaften ein wenig erweitert. Wenn ich jetzt bei laufender Messung den Dialog öffne und den Dialog mit OK verlassen, kommt es sporadisch zu Memory Error 🙁 Der Effekt lĂ€sst sich durch Änderung     eines oder mehrere Parameter verstĂ€rken. Es macht auch kein Unterschied ob das Script-Modul in DASYLab 2016 oder 2020 ausgefĂŒhrt wird.

Ist es möglich das es darin liege das Python 32bit auf einem 64bit System ausgefĂŒhrt wird oder ist der Speicher pro Script-Modul begrenzt?

2) Habe mal aufgeschnappt das es möglich ist das Script-Modul untereinander Daten austauschen können, das wÀre ein guter Weg Aufgaben auf mehrere Script-Modul zu verteilen.

 

Freue mich ĂŒber anregende Ideen 🙂

Link to post
Share on other sites

Hallo!

Ich konnte leider keine Fehlermeldung auslösen, wenn ich bei laufendem Schaltbild die Ànderbaren Einstellungen manipuliert habe.
Alles, was sich Àndern lÀsst, habe ich in den drei KanÀlen umgeschaltet (Checkboxen) oder um 1 inkrementiert bzw. dekrementiert. Dann mit Ok bestÀtigt.
Aber auch nach dem 11. Änderungsmarathon war kein MemoryError ausgelöst worden.

Im Skript ist in der ProcessData aber alles in eine Ausnahmebehandlung eingeschlossen (try-catch), sodass man nicht feststellen kann, wo genau diese Exception ausgelöst wird.
Lassen Sie diese entweder weg, um dann, wenn es zur Ausnahme kommt, ablesen zu können, in welcher Zeile der Fehler aufgetreten ist oder verwenden Sie Pythons 'traceback' Modul/Bibliothek.

import traceback

try:
    x = 1/0
except ZeroDivisionError:
    print(traceback.format_exc())
    
    
---------------------------------------------------------------    
Traceback (most recent call last):
  File "C:\Users\holgerwo\Desktop\test.py", line 4, in <module>
    x=1/0
ZeroDivisionError: integer division or modulo by zero

 

Außerdem ist die "eingebettete Funktion" bitfield ungĂŒnstig platziert, da bei jedem Aufruf der ProcessData, noch vor der PrĂŒfung, ob ĂŒberhaupt Blöcke an den EingĂ€ngen sind, ein Funktionsobjekt erstellt werden muss.
Da die ProcessData hunderte/tausende Male pro Sekunde aufgerufen wird, kommt möglicherweise die GarbageCollection von Python nicht nach und irgendwann ist nicht mehr genug Speicher da.
Die "nested functions" in DlgOk hingegen (varInRange, etc.), werden nur bei Bedarf/einmalig genutzt, sodass es hier problemlos ist.
Probieren Sie daher bitte, 'bitfield' außerhalb der pscript-Klasse zu implementieren und ĂŒbergeben Sie notwendige Werte als Parameter, z.B. bitfield(self.pvar).

 

Link to post
Share on other sites

Hallo!

Erst mal ganz herzlichen Dank fĂŒr das schnelle Feedback, hoffe sie sind bei diesen Temperaturen und dem Marathon nicht ins Schwitzen gekommen. 😉

Bei mir lief das Skript heute auch ohne zu murren, vielleicht habe ich ja den Fehler vor dem Versenden ausgeputzt. 😂

Hab noch ein paar unnötige if-Abfragen entfernt, die bitfield-Funktion ausgelagert und das try-catch entfernt, sieht schon viel hĂŒbscher aus. 😁

Da ich aber den Status der bis zu 16 Schalter im laufenden Prozess benötige, frage ich diese nun alle 60 Sekunden in der ProcessValue ab.

In das Beispiel-Schaltbild/Skript habe ich mal reingeschaut, sieht echt interessant aus, da lÀsst sich bestimmt was damit anstellen.

Noch mal herzlichen Dank

Link to post
Share on other sites

Hallöchen,

das mit der Storage klappt echt super. Durch die Aufteilung der Aufgaben spare mir viele globale Variablen und Strings.

Jetzt bin ich auf ein anderes Hindernis im Dialogmanager gestoßen.

Gibt es eine Möglichkeit die "EnableProperty" fĂŒr jeden einzelnen Kanal zu setzen? Es Ă€ndern sich immer alle KanĂ€le wenn ich im Kanal meine Bedingungseinstellung Ă€ndere.:huh:

Sommerliche GrĂŒĂŸe

Link to post
Share on other sites

Hallo,

hab das jetzt so geregelt das die Propery Modulweise eingestellt wird. Damit komme ich gut zurecht :)

Hab da noch eine Frage zu:

Methode: DialogManager.GetPage()

Liefert in den Modulfunktionen DlgInit und DlgEvent den Index der ausgewĂ€hlten Dialogseite zurĂŒck.

 

GetPage()

 

RĂŒckgabewert

Liefert den Index der geöffneten Dialogseite zurĂŒck.
0: Modulseite, 1: Kanalseite

 

In Dlglnit liefert GetPage() nach SelectModulePage() eine 0 und nach SelectChannelPage() eine 1, jedoch im DlgEvent immer eine 1, egal welche Dialogseite ausgewÀhlt ist.

WĂŒrde die Methode gern in DlgEvent  einsetzen um zu verhindern das nach einer Änderung in der Kanalseite immer auf die Modulseite gesprungen wird, dort lasse ich Eventgesteuert Propertys aktivieren oder deaktivieren.

Hab schon versucht SelectPage() wegzulassen, dann bekomme ich aber Fehler

 

Nachtrag:

Hab noch ein weinig experimentiert und siehe da :)

Mein Fehler war das ich den Aufruf dlg.opt.EnableProperty() anstatt dlg.EnableProperty() verwendet habe, jetzt brauche ich auch SelectPage() nicht mehr.

Hab den Aufruf in irgendeinem Beispiel-Skript aufgeschappt...

Bis zum nÀchten mal :D

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...