Commit 9c84c898 authored by panos's avatar panos

Test added for this example

parent d38da9ba
...@@ -22,24 +22,30 @@ Created on 3 Dec 2014 ...@@ -22,24 +22,30 @@ Created on 3 Dec 2014
# along with DREAM. If not, see <http://www.gnu.org/licenses/>. # along with DREAM. If not, see <http://www.gnu.org/licenses/>.
# =========================================================================== # ===========================================================================
from Transformations import BasicTransformations from dream.KnowledgeExtraction.Transformations import BasicTransformations
from DistributionFitting import Distributions from dream.KnowledgeExtraction.DistributionFitting import Distributions
import ImportDatabase
from xml.etree import ElementTree as et from xml.etree import ElementTree as et
from Simul8XML import Simul8Output from dream.KnowledgeExtraction.Simul8XML import Simul8Output
from dream.KnowledgeExtraction.ImportDatabase import ConnectionData
import os
#================================= Extract data from the database ==========================================# #================================= Extract data from the database ==========================================#
#The Import Database object is used to import the data, the user has to specify the path to the file containing the connection data #The Import Database object is used to import the data, the user has to specify the path to the file containing the connection data
cnxn=ImportDatabase.ConnectionData(seekName='ServerData', implicitExt='txt', number_of_cursors=3)
cursors=cnxn.getCursors() def main(test=0, simul8XMLFileName='ParallelStations.xml',
DBFilePath = 'C:\Users\Panos\Documents\KE tool_documentation',
file_path=None, simul8XMLFile=None):
if not file_path:
cnxn=ConnectionData(seekName='ServerData', file_path=DBFilePath, implicitExt='txt', number_of_cursors=3)
cursors=cnxn.getCursors()
#Database queries used to extract the required data, in this example the processing times are given subtracting the TIME IN data point from the TIME OUT data point #Database queries used to extract the required data, in this example the processing times are given subtracting the TIME IN data point from the TIME OUT data point
a = cursors[0].execute(""" a = cursors[0].execute("""
select prod_code, stat_code,emp_no, TIMEIN, TIMEOUT select prod_code, stat_code,emp_no, TIMEIN, TIMEOUT
from production_status from production_status
""") """)
MILL1=[] #Initialization of MILL1 list MILL1=[] #Initialization of MILL1 list
MILL2=[] #Initialization of MILL2 list MILL2=[] #Initialization of MILL2 list
for j in range(a.rowcount): for j in range(a.rowcount):
#get the next line #get the next line
ind1=a.fetchone() ind1=a.fetchone()
if ind1.stat_code == 'MILL1': if ind1.stat_code == 'MILL1':
...@@ -54,10 +60,10 @@ for j in range(a.rowcount): ...@@ -54,10 +60,10 @@ for j in range(a.rowcount):
MILL2.append(procTime) MILL2.append(procTime)
else: else:
continue continue
#The BasicTransformations object is called to conduct some data transformations #The BasicTransformations object is called to conduct some data transformations
transform = BasicTransformations() transform = BasicTransformations()
procTime_MILL1=[] procTime_MILL1=[]
for elem in MILL1: for elem in MILL1:
t1=[] t1=[]
t2=[] t2=[]
t1.append(((elem[0].hour)*60)*60 + (elem[0].minute)*60 + elem[0].second) t1.append(((elem[0].hour)*60)*60 + (elem[0].minute)*60 + elem[0].second)
...@@ -65,27 +71,27 @@ for elem in MILL1: ...@@ -65,27 +71,27 @@ for elem in MILL1:
dt=transform.subtraction(t2, t1) dt=transform.subtraction(t2, t1)
procTime_MILL1.append(dt[0]) procTime_MILL1.append(dt[0])
procTime_MILL2=[] procTime_MILL2=[]
for elem in MILL2: for elem in MILL2:
t1=[] t1=[]
t2=[] t2=[]
t1.append(((elem[0].hour)*60)*60 + (elem[0].minute)*60 + elem[0].second) t1.append(((elem[0].hour)*60)*60 + (elem[0].minute)*60 + elem[0].second)
t2.append(((elem[1].hour)*60)*60 + (elem[1].minute)*60 + elem[1].second) t2.append(((elem[1].hour)*60)*60 + (elem[1].minute)*60 + elem[1].second)
dt=transform.subtraction(t2, t1) dt=transform.subtraction(t2, t1)
procTime_MILL2.append(dt[0]) procTime_MILL2.append(dt[0])
#Database queries used again to extract the MTTF and MTTR data points #Database queries used again to extract the MTTF and MTTR data points
b = cursors[1].execute(""" b = cursors[1].execute("""
select stat_code, MTTF_hour select stat_code, MTTF_hour
from failures from failures
""") """)
c = cursors[2].execute(""" c = cursors[2].execute("""
select stat_code, MTTR_hour select stat_code, MTTR_hour
from repairs from repairs
""") """)
MTTF_MILL1=[] #Initialization of the list that will contain the MTTF data points for MILL1 MTTF_MILL1=[] #Initialization of the list that will contain the MTTF data points for MILL1
MTTF_MILL2=[] #Initialization of the list that will contain the MTTF data points for MILL2 MTTF_MILL2=[] #Initialization of the list that will contain the MTTF data points for MILL2
for j in range(b.rowcount): for j in range(b.rowcount):
#get the next line #get the next line
ind2=b.fetchone() ind2=b.fetchone()
if ind2.stat_code == 'MILL1': if ind2.stat_code == 'MILL1':
...@@ -95,9 +101,9 @@ for j in range(b.rowcount): ...@@ -95,9 +101,9 @@ for j in range(b.rowcount):
else: else:
continue continue
MTTR_MILL1=[] #Initialization of the list that will contain the MTTR data points for MILL1 MTTR_MILL1=[] #Initialization of the list that will contain the MTTR data points for MILL1
MTTR_MILL2=[] #Initialization of the list that will contain the MTTR data points for MILL1 MTTR_MILL2=[] #Initialization of the list that will contain the MTTR data points for MILL1
for j in range(c.rowcount): for j in range(c.rowcount):
#get the next line #get the next line
ind3=c.fetchone() ind3=c.fetchone()
if ind3.stat_code == 'MILL1': if ind3.stat_code == 'MILL1':
...@@ -107,35 +113,48 @@ for j in range(c.rowcount): ...@@ -107,35 +113,48 @@ for j in range(c.rowcount):
else: else:
continue continue
#======================= Fit data to statistical distributions ================================# #======================= Fit data to statistical distributions ================================#
#The Distributions object is called to fit statistical distributions to the in scope data #The Distributions object is called to fit statistical distributions to the in scope data
dist_proctime = Distributions() dist_proctime = Distributions()
distProcTime_MILL1 = dist_proctime.Lognormal_distrfit(procTime_MILL1) distProcTime_MILL1 = dist_proctime.Lognormal_distrfit(procTime_MILL1)
distProcTime_MILL2 = dist_proctime.Weibull_distrfit(procTime_MILL2) distProcTime_MILL2 = dist_proctime.Weibull_distrfit(procTime_MILL2)
dist_MTTF = Distributions() dist_MTTF = Distributions()
dist_MTTR = Distributions() dist_MTTR = Distributions()
distMTTF_MILL1 = dist_MTTF.Exponential_distrfit(MTTF_MILL1) distMTTF_MILL1 = dist_MTTF.Exponential_distrfit(MTTF_MILL1)
distMTTF_MILL2 = dist_MTTF.Exponential_distrfit(MTTF_MILL2) distMTTF_MILL2 = dist_MTTF.Exponential_distrfit(MTTF_MILL2)
distMTTR_MILL1 = dist_MTTR.Normal_distrfit(MTTR_MILL1) distMTTR_MILL1 = dist_MTTR.Normal_distrfit(MTTR_MILL1)
distMTTR_MILL2 = dist_MTTR.Normal_distrfit(MTTR_MILL2) distMTTR_MILL2 = dist_MTTR.Normal_distrfit(MTTR_MILL2)
#======================= Output preparation: output the updated values in the XML file of this example ================================# #======================= Output preparation: output the updated values in the XML file of this example ================================#
datafile = ('ParallelStations.xml') #define the input xml file if not simul8XMLFile:
tree = et.parse(datafile) datafile=(os.path.join(os.path.dirname(os.path.realpath(__file__)), simul8XMLFileName)) #It defines the name or the directory of the XML file
simul8 = Simul8Output() #Call the Simul8Output object tree = et.parse(datafile)
#Assign the statistical distribution found above in the XML file using methods of the Simul8Output object else:
procTimes1 = simul8.ProcTimes(tree,'MILL1',distProcTime_MILL1) datafile=simul8XMLFile
procTimes2 = simul8.ProcTimes(procTimes1,'MILL2',distProcTime_MILL2) tree = et.parse(datafile)
#Again assign the MTTF and MTTR probability distributions calling the relevant methods from the Simul8Output object
MTTF1 = simul8.MTBF(procTimes2,'MILL1',distMTTF_MILL1) simul8 = Simul8Output() #Call the Simul8Output object
MTTR1 = simul8.MTTR(MTTF1,'MILL1',distMTTR_MILL1) #Assign the statistical distribution found above in the XML file using methods of the Simul8Output object
procTimes1 = simul8.ProcTimes(tree,'MILL1',distProcTime_MILL1)
MTTF2 = simul8.MTBF(MTTR1,'MILL2',distMTTF_MILL2) procTimes2 = simul8.ProcTimes(procTimes1,'MILL2',distProcTime_MILL2)
MTTR2 = simul8.MTTR(MTTF2,'MILL2',distMTTR_MILL2) #Again assign the MTTF and MTTR probability distributions calling the relevant methods from the Simul8Output object
#Output the XML file with the processed data MTTF1 = simul8.MTBF(procTimes2,'MILL1',distMTTF_MILL1)
output= MTTR2.write('KEtool_ParallelStations.xml') MTTR1 = simul8.MTTR(MTTF1,'MILL1',distMTTR_MILL1)
MTTF2 = simul8.MTBF(MTTR1,'MILL2',distMTTF_MILL2)
MTTR2 = simul8.MTTR(MTTF2,'MILL2',distMTTR_MILL2)
#Output the XML file with the processed data
output= MTTR2.write('KEtool_ParallelStations.xml')
if test:
output=et.parse('KEtool_ParallelStations.xml')
return output
if __name__ == '__main__':
main()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment