Jump to content

Memory Error nach Dialog-Manager


hag

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 comment
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 comment
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 comment
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 comment
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 comment
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...