# -*- coding: cp1252 -*- ''' Created on 24.11.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 import FertigungsTest.Hardware.LtInterface as LtInterface import FertigungsTest.Hardware.BedienTasten as Key_Evn import FertigungsTest.Hardware.MesswerteInterface as MWG import FertigungsTest.Hardware.Typschild as Typschild # MotTst # 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=1300 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 ''' threading.Thread.__init__(self) super(Prueffunktionen,self).__init__() self._EventStop = threading.Event() self._Thread_name = "MotTst" self.stout = False self.printf( "Constructor %s" % self._Thread_name) self.iStopTimeout = 3 # Stop Timeout bis zum Kill self.iTimeout = 80 # Timeout bis Abbruch self.errorcode=1300 # Fehlercode vorbelegen, Wenn Ok wird zurueckgesetzt self.isTimeout=False self.Drehdauerin_sec=5.0 # Drehdauer des Motor in s self.SolldrehzahlProzent=0.8# 80 Prozent von Nenndrehzahl self.O_XmlParser = O_Parser self.O_XML_Cmd = O_Serializer self.O_Display = Display.Treiber() self.O_Startschalter = StartSchalter.Treiber() self.O_Key_Evn = Key_Evn.Treiber() self.O_LT = LtInterface.Treiber() self.O_MWG = MWG.Treiber() self.O_Typschild = Typschild.Treiber() # Schrauberdaten aus Typschild lesen s_Brc_Typschild = self.O_Typschild.ReadBrcStatParFromEeprom() self.MomentLeerlaufMax = self.O_MWG.f_getSpindelNennmoment() * self.O_Typschild.getStatValue(s_Brc_Typschild,"MomentLeerlaufMax")/100.0 self.printf("MomentLeerlaufMax=%2.2f"%(self.MomentLeerlaufMax)) #max zulässiges Leerlaufmoment in % von Nennmoment self.DrehzahlAbweichung=self.O_Typschild.getStatValue(s_Brc_Typschild,"DrehzahlAbweichung") # max zulässige Drehzahlabweichung in % von Max Drehzahl self.SpindelNennDrehzahl=self.O_LT.GetSpindelNennDrehzahl()*self.SolldrehzahlProzent self.printf("DrehzahlAbweichung=%2.2f"%(self.DrehzahlAbweichung)) if self.SpindelNennDrehzahl < 0 : self.MomentLeerlaufMax = self.MomentLeerlaufMax * (-1) self.DrehzahlAbweichung = self.SpindelNennDrehzahl * (-1) self.O_Display.setHeadlines("diagnosis tools","speed measurement") self.O_Display.paintDisplay() self.printf( "Constructor %s Ende" % self._Thread_name) pass def __del__(self): ''' Destructor ''' if self.errorcode==0: sAbruchGrund="OK" elif self.errorcode==1301: sAbruchGrund="NOK Lesefehler Messwelle" elif self.errorcode==1304: sAbruchGrund="NOK LerrLaufMoment zu hoch" elif self.errorcode==1303: sAbruchGrund="NOK Drehzahl" elif self.errorcode==1305: sAbruchGrund="NOK Schalter losgelassen" else : sAbruchGrund="NOK" self.printf( "Destructor %s" % self._Thread_name) 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_Typschild) del(self.O_MWG) del(self.O_LT) del(self.O_Key_Evn) del(self.O_Startschalter) del(self.O_Display) # Belegung der Prueffunktion im Parseer objekt loeschen -> Freigabe 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("Motor drehen pruefen") # Watchdogtimer anstarten -> beendet Thread nach timeout for tid, tobj in threading._active.items(): if tobj is self: thread.start_new_thread(kill,(self,self.iTimeout-self.iStopTimeout-1,tid)) self.Ablauf() self.printf("Nach Ablauf") self.__del__() pass def stopped(self): return self._EventStop.isSet() def Ablauf(self): self.printf("Motor drehen rechts") self.O_Display.ResetLastError() self.O_Display.setActionLP("Push toolswitch for_%is",None,None,self.Drehdauerin_sec) self.O_Display.setFortschritt(1) print "%s"%self.O_XML_Cmd.BuildProgressbar(1) moment = 0.1 winkel = 1 SampleTime = 2 status = 0 momentmax=0 statusfehler=0 #Warten mit Anstarten bis Startschalter betätigt self.O_Startschalter.Wait(True,self.stopped) if not self.stopped(): self.O_LT.SetDrehzahl(self.SpindelNennDrehzahl) #Motor drehen self.O_MWG.f_SetSrbMod(True) # Messung starten self.O_LT.start() time.sleep(0.5) # Warten bis Drehzahl erreicht -> Hochlaufzeit startzeit=time.time() # Messzeit Scharfschalten (status,moment, winkel, SampleTime)=self.O_MWG.f_GetMesswerte() startwinkel=winkel restzeit=self.Drehdauerin_sec while ((restzeit>0)&(self.O_Startschalter.GetZustand(1))): for Messwert in range (1,250,1): (status,moment, winkel, SampleTime)=self.O_MWG.f_GetMesswerte() if momentmax Fehler if self.O_Startschalter.GetZustand(1): self.O_Display.setActionLP("Release tool-switch_!") # Warten bis Startschalter losgelassen self.O_Startschalter.Wait(False, self.stopped) self.O_Display.setAction("","","") iSollWinkel=int(self.SpindelNennDrehzahl*Laufzeit*6) self.printf("momentmax = %2.2f MomentLeerlaufMax=%2.2f"%(momentmax,self.MomentLeerlaufMax)) self.printf("winkel = %i iSollWinkel=%i Laufzeit=%2.3fs Drehzahl=%4.1f Solldrehzahl=%4.1f "%(winkel,iSollWinkel,Laufzeit,winkel/Laufzeit/6.0,self.SpindelNennDrehzahl)) if abs(momentmax) <= abs(self.MomentLeerlaufMax): # Leerlaufmoment OK if abs(winkel) < abs((1+self.DrehzahlAbweichung/100.0) * iSollWinkel) and abs(winkel) > abs((1-self.DrehzahlAbweichung/100.0) * iSollWinkel): #448U/min /60s * 5s *360 if statusfehler < 50: #Drehzahl und Winkel OK self.errorcode=0 else : #Zu viele Lesefehler Messwelle self.errorcode=self.errorcode+1 else : self.printf("NOK !!! winkel = %i iSollWinkel=%i Laufzeit=%2.3fs Drehzahl=%4.1f Solldrehzahl=%4.1f "%(winkel,iSollWinkel,Laufzeit,winkel/Laufzeit/6.0,self.SpindelNennDrehzahl)) self.errorcode=self.errorcode+3 else : self.printf(" NOK !!! momentmax = %2.2f MomentLeerlaufMax=%2.2f"%(momentmax,self.MomentLeerlaufMax)) self.errorcode=self.errorcode+4 else : self.printf(" NOK !!! Startschalter losgelassen") self.errorcode=self.errorcode+5 if self.errorcode==0: # Startschalter OK self.O_Display.setOKNOK(1) else: self.O_Display.setOKNOK(0) if self.errorcode==0: # Motor OK self.O_Display.setSelectLP("Confirm with_to ol_switch") 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("Motor drehen Pr\xc3\xbcfung -> Ende") pass def printf(self,string): if self.stout: print string pass def TestMenue(self,O_Paint): if O_Paint: #O_Paint.SetTestText(["Startschalter bet\xc3\xa4tigen"]) O_Paint.SetTestText([u"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