function [GI_DispCrL,GI_NumCrL,GI_DateCrL,battANALOG,ATTIVA,FIG,FIG_ENG] = report_CrL(rCrL,... m,NodoCrackLink,toolrif,unitrif,contunit,datarif,Font_caption,... Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,... activeEN,conn,FileName) fileID = fopen(FileName,'a'); fmt = '%s \r'; text = 'report_CrL function started'; fprintf(fileID,fmt,text); import mlreportgen.dom.* import mlreportgen.report.* % Make sure DOM is compilable makeDOMCompilable() GI_DispCrL = []; GI_NumCrL = []; GI_DateCrL = []; if status(m,1) == 1 if ATTIVA == 1 testo = Paragraph('GMUX non ancora installato o canale inattivo.'); add(DT,testo); ATTIVA = 0; if activeEN == 1 testo = Paragraph('GMUX not installed or inactive.'); add(DT_ENG,testo); end end elseif status(m,1) == 3 if ATTIVA == 1 testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... 'piattaforma web per la visione dei dati storici.']); ATTIVA = 0; add(DT,testo); if activeEN == 1 testo = Paragraph(['Monitoring completed. Please log into the web-based platform '... 'to access the complete dataset.']); add(DT_ENG,testo); end end else CrE = Section(); sezCrack = Heading3('Crack Link'); sezCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; CrE.Title = sezCrack; if battANALOG == 0 comando = ['select Date, Time, UnitName, ToolNameID, BatLevel, Temperature from RawDataView where Date >= ''' ... datarif ''' and UnitName = ''' char(unitrif) ''' and ToolNameID = '''... char(toolrif) ''' and NodeNum = 1 ']; curs = exec(conn,comando); curs = fetch(curs); BatTemp = curs.Data; [~,cc] = size(BatTemp); if cc ~= 1 %ci sono dati riferiti all'ultimo mese/periodo di interesse DataPlot = [BatTemp(:,1) BatTemp(:,2)]; % sistemo date, batteria e temperatura [rD,~] = size(DataPlot); T = [cell2mat(DataPlot(:,1)) repmat(' ', [rD,1]) cell2mat(DataPlot(:,2))]; Date = datenum(T); Batteria = cell2mat(BatTemp(:,5)); Temperatura = cell2mat(BatTemp(:,6)); % testo introduttivo testoB1 = Paragraph(['I valori di tensione di alimentazione del GMUX durante il periodo '... 'di monitoraggio sono riportati di seguito. Il corretto funzionamento del sistema '... char(232) ' assicurato per una carica superiore a 12 V. L''ultimo dato disponibile ' char(232) ' pari '... 'a ' num2str(Batteria(end,1)) ' V.']); testoB2 = Paragraph(['Il GMUX integra al proprio interno un termometro '... 'per monitorate la temperatura di esercizio ed identificare eventuali '... 'anomalie. I dati di temperatura registrati sono riportati di seguito.']); testoB1.HAlign = 'justify'; testoB2.HAlign = 'justify'; % grafico batteria figure(19) plot(Date,Batteria); hold on title('Batteria e Temperatura del GMUX'); xlabel('Data [gg/mm/aaaa]'); ylabel('Livello di Batteria [V]'); ylim([floor(min(Batteria(:,1))) ceil(max(Batteria(:,1)))]); yyaxis right GMUX = plot(Date,Temperatura,':','LineWidth',1.1); ylim([floor(min(Temperatura(:,1))) ceil(max(Temperatura(:,1)))]); ylabel(['Temperatura [' char(176) 'C]']); set(gca,'YColor','k'); str(1,1) = cellstr('Batteria'); str(2,1) = cellstr('Temperatura'); legend(str,'Location','northwest'); h = gca; h.XAxis.MinorTick = 'on'; datetick('x','dd/mm/yyyy','keepticks','keeplimits'); xtickangle(20); grid on grid minor xlim([Date(1)-1 Date(end)+1]); TempName = char(strcat('Report',siteID,'-', contunit,'-GMUX.png')); saveas(GMUX,TempName); ChartGMUX = Image(TempName); ChartGMUX.Style = {Height('8cm'),HAlign('center')}; if Batteria(end,1) >= 12.5 TempName = char(strcat('B_13.jpg')); elseif Batteria(end,1) >= 12 TempName = char(strcat('B_12.jpg')); elseif Batteria(end,1) >= 11.3 TempName = char(strcat('B_115.jpg')); elseif Batteria(end,1) >= 10.5 TempName = char(strcat('B_11.jpg')); else TempName = char(strcat('B_10.jpg')); end Batt = Image(TempName); Batt.Style = {Height('4cm'),HAlign('center')}; lot = Table({ChartGMUX, Batt}); lot.TableEntriesStyle = {HAlign('center'),VAlign('middle')}; lot.Style = {ResizeToFitContents(false),Width("100%")}; grps(1) = TableColSpecGroup; grps(1).Span = 2; specs(1) = TableColSpec; specs(1).Span = 1; specs(1).Style = {Width("80%")}; specs(2) = TableColSpec; specs(2).Span = 1; specs(2).Style = {Width("20%")}; grps(1).ColSpecs = specs; lot.ColSpecGroups = grps; lot_cap = Paragraph(['Fig. ' num2str(FIG) ' - Livello di carica della batteria e temperatura del '... 'GMUX durante il periodo di riferimento']); FIG = FIG+1; lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; Batt = Section(); sezBATT = Heading3('GMUX - Batteria e Temperatura'); sezBATT.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; Batt.Title = sezBATT; add(DT,sezBATT); add(DT,testoB1); add(DT,testoB2); add(DT,lot); add(DT,lot_cap); add(DT,br); close(figure(19)); %--ENG--- if activeEN == 1 CrL_ENG = Section(); sezCrL_ENG = Heading3('Crack Link'); sezCrL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; CrL_ENG.Title = sezCrL_ENG; testoB1 = Paragraph(['The following chart reports the GMUX battery level trend recorded '... 'during the reference time period. '... 'The correct functioning of the data acquisition system is guaranteed for a '... 'minimum level of 12 V. The last available data is equal to ' num2str(Batteria(end,1)) ' V.']); testoB2 = Paragraph(['GMUX equips also a thermometer that allows the monitoring '... 'of the working temperature and the identification of eventual malfunctioning. The same '... 'chart displays also temperature data recorded by the multiplexer.']); testoB1.HAlign = 'justify'; testoB2.HAlign = 'justify'; % grafico batteria figure(19) plot(Date,Batteria); hold on title('GMUX battery level and temperature'); xlabel('Date [dd/mm/yyyy]'); ylabel('Battery Level [V]'); ylim([floor(min(Batteria(:,1))) ceil(max(Batteria(:,1)))]); yyaxis right GMUX = plot(Date,Temperatura,':','LineWidth',1.1); ylim([floor(min(Temperatura(:,1))) ceil(max(Temperatura(:,1)))]); ylabel(['Temperature [' char(176) 'C]']); set(gca,'YColor','k'); str(1,1) = cellstr('Battery'); str(2,1) = cellstr('Temperature'); legend(str,'Location','northwest'); h = gca; h.XAxis.MinorTick = 'on'; datetick('x','dd/mm/yyyy','keepticks','keeplimits'); xtickangle(20); grid on grid minor xlim([Date(1)-1 Date(end)+1]); TempName = char(strcat('Report',siteID,'-', contunit,'-GMUX_ENG.png')); saveas(GMUX,TempName); ChartGMUX = Image(TempName); ChartGMUX.Style = {Height('8cm'),HAlign('center')}; Batt = Image(TempNameB); Batt.Style = {Height('4cm'),HAlign('center')}; lot = Table({ChartGMUX, Batt}); lot.TableEntriesStyle = {HAlign('center'),VAlign('middle')}; lot.Style = {ResizeToFitContents(false),Width("100%")}; grps(1) = TableColSpecGroup; grps(1).Span = 2; specs(1) = TableColSpec; specs(1).Span = 1; specs(1).Style = {Width("80%")}; specs(2) = TableColSpec; specs(2).Span = 1; specs(2).Style = {Width("20%")}; grps(1).ColSpecs = specs; lot.ColSpecGroups = grps; lot_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Battery level and temperature recorded '... 'by the GMUX during the reference time period']); FIG_ENG = FIG_ENG+1; lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; Batt_ENG = Section(); sezBATT_ENG = Heading3('GMUX - Battery and temperature'); sezBATT_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; Batt_ENG.Title = sezBATT_ENG; add(DT_ENG,sezBATT_ENG); add(DT_ENG,testoB1); add(DT_ENG,testoB2); add(DT_ENG,lot); add(DT_ENG,lot_cap); add(DT_ENG,br); close(figure(19)); end battANALOG = 1; end end add(DT,sezCrack); for cr = 1:rCrL(m,1) NodeNum = num2str(NodoCrackLink(cr,m)); comando = ['select EventDate, EventTime, XShift from ElabDataView where EventDate >= ''' ... datarif ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... ''' and NodeNum = ''' NodeNum ''' ']; curs = exec(conn,comando); curs = fetch(curs); Dati = curs.Data; % Modifico il formato di data e ora [rD,rC] = size(Dati); if rC ~= 1 T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; Date = datenum(T); % Data open = cell2mat(Dati(:,3)); % Fessura dS = open-open(1); GI_DispCrL(:,cr) = open; GI_NumCrL(:,cr) = NodoCrackLink(cr,m); GI_DateCrL = Date; % grafico deformazioni NELL'ULTIMO MESE figure(5); apertura = plot(Date,dS); title(['Apertura/chiusura del fessurimetro numero ' NodeNum]); xlabel('Data [gg/mm/aaaa]'); ylabel('Deformazione [mm]'); control = abs(max(dS)-min(dS)); if control < 1 varG = (1-control)/2; ylim([min(dS)-varG max(dS)+varG]); end xlim([Date(1)-1 Date(end)+1]); h = gca; h.XAxis.MinorTick = 'on'; datetick('x','dd/mm/yyyy','keepticks','keeplimits'); xtickangle(15); grid on grid minor hold off TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Crack', NodeNum, '.png')); saveas(apertura,TempName); ChartCrL = Image(TempName); ChartCrL.Style = {Height('7.1cm'),HAlign('center')}; ChartCrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento '... 'dell''apertura o chiusura del fessurimetro, nodo numero ' ... NodeNum ', durante il periodo temporale di riferimento']); FIG = FIG+1; ChartCrL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; if cr == 1 testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... 'alle deformazioni registrate durante il periodo temporale di riferimento '... 'dai fessurimetri presenti in sito. Si sottolinea che valori crescenti indicano '... 'un''apertura della fessura, mentre numeri decrescenti una chiusura della stessa.']); testo.HAlign = 'justify'; add(DT,testo); end testo2 = Paragraph(['In particolare, il nodo numero ' NodeNum ' ha registrato un valore massimo e minimo '... 'di apertura assoluta dello strumento rispettivamente pari a ' num2str(round(max(open),2), '%0.2f') ' mm e '... num2str(round(min(open),2), '%0.2f') ' mm, con una '... 'variazione massima di circa ' num2str(round(max(open),2)-round(min(open),2),'%0.2f') ' mm.' ]); testo2.HAlign = 'justify'; add(DT,testo2); add(DT,ChartCrL); add(DT,ChartCrL_cap); if cr == rCrL(m,1) add(DT,br); end close(figure(5)); %---ENG--- if activeEN == 1 % grafico deformazioni NELL'ULTIMO MESE figure(25); apertura = plot(Date,dS); title(['Crack meter opening - node ' NodeNum]); xlabel('Date [dd/mm/yyyy]'); ylabel('Deformation [mm]'); control = abs(max(dS)-min(dS)); if control < 1 varG = (1-control)/2; ylim([min(dS)-varG max(dS)+varG]); end xlim([Date(1)-1 Date(end)+1]); h = gca; h.XAxis.MinorTick = 'on'; datetick('x','dd/mm/yyyy','keepticks','keeplimits'); xtickangle(15); grid on grid minor hold off TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Crack', NodeNum, '_ENG.png')); saveas(apertura,TempName); ChartCrL_ENG = Image(TempName); ChartCrL_ENG.Style = {Height('7.1cm'),HAlign('center')}; ChartCrL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Crack link '... 'opening measured by node ' ... NodeNum ' during the reference time period']); FIG_ENG = FIG_ENG+1; ChartCrL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; if cr == 1 testo = Paragraph(['The following graphs present deformation data recorded during the reference '... 'time period by the crack meters installed on site. In this representation, positive values '... 'corresponds to an opening crack, while negative values represent a closing displacement of '... 'the monitored element.']); testo.HAlign = 'justify'; add(DT_ENG,testo); end testo2 = Paragraph(['In particular, Crack Link ' NodeNum ' recorded a maximum and minimum value of absolute '... 'opening of ' num2str(round(max(open),2), '%0.2f') ' mm and '... num2str(round(min(open),2), '%0.2f') ' mm respectively, for a maximum variation '... 'that amounts to ' num2str(round(max(open),2)-round(min(open),2),'%0.2f') ' mm.' ]); testo2.HAlign = 'justify'; add(DT_ENG,testo2); add(DT_ENG,ChartCrL_ENG); add(DT_ENG,ChartCrL_ENG_cap); if cr == rCrL(m,1) add(DT_ENG,br); end close(figure(25)); end %pulisco variabili da riutilizzare per catena successiva clear open; else if ATTIVA == 1 CrE = Section(); sezCrack = Heading3('Crack Link'); sezCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; CrE.Title = sezCrack; add(DT,sezCrack); testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); add(DT,testo); br = PageBreak(); add(DT,br); if activeEN == 1 CrE_ENG = Section(); sezCrack_ENG = Heading3('Crack Link'); sezCrack_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; CrE_ENG.Title = sezCrack; add(DT_ENG,sezCrack_ENG); testo = Paragraph('No data available for the reference time period.'); add(DT_ENG,testo); br = PageBreak(); add(DT_ENG,br); end ATTIVA = 0; end end end if isempty(GI_DispCrL) == 0 ind = 1; if rCrL(m) > 1 % pił di un fessurimetro, prendo quello con max variazione for k = 1:rCrL(m) maxX(1,k) = max(GI_DispCrL(:,k)-GI_DispCrL(1,k)); if k == 1 rif = maxX(1,1); end if maxX(1,k) > rif rif = maxX(1,k); ind = k; end end GI_DispCrL = GI_DispCrL(:,ind); GI_NumCrL = GI_NumCrL(1,ind); end end end text = 'report_CrL function executed correctly'; fprintf(fileID,fmt,text); fclose(fileID); end