# -*- coding: cp1252 -*- ''' Created on 10.10.2011 @author: sth2mt ''' import time import threading import thread from ctypes import pythonapi, py_object, c_char import FertigungsTest.GUI.Display as Display import FertigungsTest.Hardware.StartSchalter as StartSchalter # ToolSwitchTst # exit def kill(thread,iStopTimeout,tid): if thread: thread.printf ("kill iStopTimeout=%d"%iStopTimeout) time.sleep(iStopTimeout) #nach 30s hart beenden if thread.isAlive(): res = pythonapi.PyThreadState_SetAsyncExc(tid,py_object(SystemExit)) if res == 0: raise ValueError("nonexistent thread id (%s)" % thread._Thread_name) elif res > 1: pythonapi.PyThreadState_SetAsyncExc(tid,0) raise SystemError("PyThreadState_SetAsyncExc failed") else : thread.printf ("kill Thread %s" % thread._Thread_name) thread.errorcode=500 thread.isTimeout=True thread.__del__() else: thread.printf ( "kill %s not allive" % thread._Thread_name) else: print "kill: no handle" class Prueffunktionen(threading.Thread): ''' classdocs ''' def __init__(self, O_Parser,O_Serializer,param=None): ''' Constructor ''' self._Thread_name = "ToolSwitchTst" self.stout = False self.GoeppelBremse = True self.printf( "Constructor %s" % self._Thread_name) threading.Thread.__init__(self) super(Prueffunktionen,self).__init__() self._EventStop = threading.Event() self.iStopTimeout = 3 # Stop Timeout bis zum Kill self.iTimeout = 60 # Timeout bis Abbruch self.errorcode=500 # Fehlercode vorbelegen, Wenn Ok wird zurueckgesetzt self.isTimeout=False self.iFiltertiefe = 3 self.PotiStufen = 13 self.O_XmlParser = O_Parser self.O_XML_Cmd = O_Serializer self.O_Display = Display.Treiber() self.O_Startschalter = StartSchalter.Treiber() self.O_Display.setHeadlines("diagnosis tools","tool switch") self.O_Display.setAction("","","") self.O_Display.paintDisplay() pass def __del__(self): ''' Destructor* 1.0 ''' if self.errorcode==0: sAbruchGrund="OK" else: sAbruchGrund="NOK" self.printf( "Destructor %s" % self._Thread_name) # Belegung der Prueffunktion im Parseer objekt loeschen -> Freigabe self.printf( "Timeout %i, self._EventStop.isSet() %i"%(self.isTimeout,self._EventStop.isSet())) # Display bedienen if (self.isTimeout | self._EventStop.isSet()): #Abbruch der Funktion -> Fehler anzeigen if self._EventStop.isSet(): sAbruchGrund="Abort" self.O_Display.setAction(sAbruchGrund,"","") else: #Timeout der Funktion -> Fehler anzeigen sAbruchGrund="Timeout" self.O_Display.setAction(sAbruchGrund,"","") self.O_Display.setOKNOK(0) self.O_Display.clrSelect() print "%s"%self.O_XML_Cmd.BuildRueckgabewert(self._Thread_name,"%s %s"%(self._Thread_name,sAbruchGrund),None,self.errorcode,None) self.O_Display.paintDisplay() del(self.O_Display) del(self.O_Startschalter) self.O_XmlParser.AktivePrueffunktion=None pass def stop(self): # Thread normal beenden self.printf("stop") if self.isAlive(): self._EventStop.set() # Kill-thread falls dieser thread sich nicht nach 30s beendet for tid, tobj in threading._active.items(): if tobj is self: thread.start_new_thread(kill,(self,self.iStopTimeout,tid)) #print "stop Ende" pass def run(self): # Ablauf starten self.printf("Ablauf starten") print "%s"%self.O_XML_Cmd.BuildTimeout(self.iTimeout,self._Thread_name) print "%s"%self.O_XML_Cmd.BuildPrintMainText("Startschalter pruefen") # Watchdogtimer anstarten -> beendet Thread anch timeout for tid, tobj in threading._active.items(): if tobj is self: thread.start_new_thread(kill,(self,self.iTimeout-self.iStopTimeout-1,tid)) if self.GoeppelBremse: time.sleep(3) self.Ablauf() self.printf("Nach Ablauf") self.__del__() pass def stopped(self): return self._EventStop.isSet() def Ablauf(self): self.printf("ToolSwitchTst") self.O_Display.setFortschritt(1) print "%s"%self.O_XML_Cmd.BuildProgressbar(1) self.O_Display.ResetLastError() self.O_Display.setActionLP("Push tool-switch slowly") self.O_Display.setOKNOK(self.CheckStartschalter(self.PotiStufen)) self.O_Display.setFortschritt(98) print "%s"%self.O_XML_Cmd.BuildProgressbar(98) if self.errorcode==0: # Startschalter OK self.O_Display.setSelectLP("Confirm with_to ol_switch") #self.O_Display.setSelectLeft("Weiter ") #self.O_Display.setSelectMiddle("mit Start") #self.O_Display.setSelectRight("schalter") #self.O_Display.paintDisplay() #Ergebnis bestaetigen self.O_Startschalter.Wait(True,self.stopped) # Bildschirm zuruecksetzen auf Default self.O_Display.BuildDefaultScreen() self.O_Display.setFortschritt(100) print "%s"%self.O_XML_Cmd.BuildProgressbar(100) self.printf("Startschalter Prüfung -> Ende") pass def CheckStartschalter(self,Zustaende): Displayfilter = 0 c_Stufe = 0x3f # Poti in (x) Schritte aufteilen c_Stufe = (c_Stufe / Zustaende)+1 c_Max = c_Stufe c_Min = 0 self.printf( "Start %i, %i" %(c_Min,c_Max)) Mittelwert=self.O_Startschalter.GetAnalog() for i in range (0,200000,1): ADWert=self.O_Startschalter.GetAnalog()*1.0 # float wandeln self.printf( "-> Mittelwert = %d ADWert = %d c_Min = %d c_Max = %d prozent = %d"%(Mittelwert,ADWert,c_Min,c_Max,50)) if ADWert >= 0: Mittelwert = ((Mittelwert * self.iFiltertiefe ) + ADWert)/ (self.iFiltertiefe+1) #self.printf( " %i> %i < %i" %(c_Min,Mittelwert,c_Max)) if (c_Max >= 0x3F)&(Mittelwert >= c_Min): self.printf( "OK") self.printf( "-> Mittelwert = %d c_Min = %d c_Max = %d prozent = %d"%(Mittelwert,c_Min,c_Max,50)) print "%s"%self.O_XML_Cmd.BuildProgressbar(50) self.O_Display.setFortschritt(50) self.O_Display.paintDisplay() break if (Mittelwert > c_Min) & (Mittelwert < c_Max): c_Min = c_Max c_Max = c_Max + c_Stufe self.printf( ("-> c_Min = %d c_Max = %d prozent = %d"%(c_Min,c_Max,(c_Min*40)/0x3F))) print "%s"%self.O_XML_Cmd.BuildProgressbar((c_Min*50)/0x3F) self.O_Display.setFortschritt((c_Min*50)/0x3F) self.O_Display.paintDisplay() Displayfilter = Displayfilter +1 if Displayfilter == 10: Displayfilter = 0 self.O_Display.setFortschritt(((int(Mittelwert)&0x3F)*50)/0x3F) self.O_Display.paintDisplay() if self.stopped(): return # Andere Prozesse arbeiten lassen time.sleep(0.05) c_Max = 0x3F-c_Stufe c_Min = 0x3F-(2*c_Stufe) #self.printf( ("merker %d prozent %d"%(c_Min,100-((c_Min*51)/0xFF)))) #print "%s"%self.O_XML_Cmd.BuildProgressbar(100-((c_Min*51)/0xFF)) #self.O_Display.setAction("Startschalter","langsam","loslassen") self.O_Display.setActionLP("Release tool-switch slowly") for i in range (0,200000,1): ADWert=self.O_Startschalter.GetAnalog()*1.0 # float wandeln if ADWert >= 0: Mittelwert = ((Mittelwert * self.iFiltertiefe ) + ADWert)/ (self.iFiltertiefe+1) self.printf( "<- Mittelwert = %d ADWert = %d c_Min = %d c_Max = %d prozent %d"%(Mittelwert,ADWert,c_Min,c_Max,98)) #self.printf( " %i> %i < %i" %(c_Min,Mittelwert,c_Max)) if (c_Min < c_Stufe)&(Mittelwert < c_Max): self.printf( "<- Mittelwert = %d c_Min = %d c_Max = %d prozent %d"%(Mittelwert,c_Min,c_Max,98)) print "%s"%self.O_XML_Cmd.BuildProgressbar(98) self.O_Display.setFortschritt(98) self.O_Display.paintDisplay() self.printf( "OK") self.errorcode=0 return True if (Mittelwert <= (c_Max)) & (Mittelwert >= (c_Min)): c_Max = c_Min c_Min = c_Min - c_Stufe self.printf( ("<- Mittelwert = %d c_Min = %d c_Max = %d prozent = %d"%(Mittelwert,c_Min,c_Max,98-((c_Max*50)/0x3F)))) print "%s"%self.O_XML_Cmd.BuildProgressbar(98-((c_Max*51)/0x3F)) self.O_Display.setFortschritt(98-((c_Max*51)/0x3F)) self.O_Display.paintDisplay() Displayfilter = Displayfilter +1 if Displayfilter == 10: Displayfilter = 0 self.O_Display.setFortschritt(98-(((int(Mittelwert)&0x3f)*51)/0x3F)) self.O_Display.paintDisplay() if self.stopped(): return # Andere Prozesse arbeiten lassen time.sleep(0.05) self.printf( "NOK") return False def printf(self,string): if self.stout: print string pass def TestMenue(self,O_Paint): if O_Paint: O_Paint.SetTestText(["Startschalter betätigen"]) O_Paint.Update() Input = ' ' while Input!= "z": Input=O_Paint.TestfunktionsEingabe() O_Paint.Update() O_Paint.Update() O_Paint.ClearTestText() return Input pass pass