Sync from remote server: 2025-10-12 18:56:41
This commit is contained in:
429
Tilt/AlertReport.m
Executable file
429
Tilt/AlertReport.m
Executable file
@@ -0,0 +1,429 @@
|
||||
function [checkALRPT,nomeALRPT_PDF] = AlertReport(IDcentralina,DTcatena,Sito,...
|
||||
NodeNum,Depth,data,DataNum,LVL,TipoDisp,conn,FileName)
|
||||
|
||||
% Funzione per la creazione di report automatici di allertamento
|
||||
|
||||
% *** INPUT ***
|
||||
%%% data -> data corrispondente all'OOA dell'evento
|
||||
%%% DataNum -> numero di valori nel dataset dell'evento
|
||||
%%% LVL -> livello dell'evento
|
||||
%%% NodeNum, Depth -> numero e profondità del nodo
|
||||
%%% TipoDisp -> spostamenti locali o cumulati (LOCALI DA IMPLEMENTARE)
|
||||
|
||||
|
||||
fileID = fopen(FileName,'a');
|
||||
fmt = '%s \r';
|
||||
text = 'AlertReport function started';
|
||||
fprintf(fileID,fmt,text);
|
||||
fclose(fileID);
|
||||
|
||||
try
|
||||
%% Importo librerie Matlab Report Generator e abilito compilazione DOM
|
||||
import mlreportgen.dom.*
|
||||
import mlreportgen.report.*
|
||||
makeDOMCompilable()
|
||||
|
||||
%% Creo report e info
|
||||
tempoALRPT = datestr(now,'dd-mm-yyyy HH:MM:SS');
|
||||
tempoinvio = datestr(datenum(tempoALRPT),'ddmmyy_HHMMSS');
|
||||
nomeALRPT = ['AlertReport-' IDcentralina '-' DTcatena '-' NodeNum '-' tempoinvio];
|
||||
docALRPT = Report(nomeALRPT,'pdf');
|
||||
nomeALRPT_PDF = [nomeALRPT '.pdf'];
|
||||
open(docALRPT)
|
||||
PG = Chapter;
|
||||
Font_text = '12pt';
|
||||
Font_text2 = '14pt';
|
||||
Font_report = 'Times';
|
||||
|
||||
wm = Watermark('sfondoALRPT.png');
|
||||
docALRPT.Layout.Watermark = wm;
|
||||
|
||||
titolo = Paragraph('Report automatico di allertamento');
|
||||
titolo.Style = {HAlign('center'),FontSize('28pt'),Bold(1),...
|
||||
OuterMargin('0in','0in','0.2in','0in'),FontFamily(Font_report)};
|
||||
sottotitolo = Paragraph(tempoALRPT);
|
||||
sottotitolo.Style = {HAlign('center'),FontSize('12pt'),Bold(1),FontFamily(Font_report)};
|
||||
|
||||
InfoNodo = [NodeNum ' (' Depth ' m)'];
|
||||
dd = data(1:2);
|
||||
mm = data(4:5);
|
||||
yyyy = data(7:10);
|
||||
dataOOA =([yyyy '-' mm '-' dd]);
|
||||
oraOOA = datestr(data,'HH:MM:SS');
|
||||
dataMESE = datestr(datenum(dataOOA)-30, 'yyyy-mm-dd');
|
||||
|
||||
%% costruisco il dataset mensile degli spostamenti
|
||||
% predendo come riferimento data e ora di OOA, scarico tutti i dati
|
||||
% disponibili a partire dal giorno (e ora) localizzato 30gg prima di
|
||||
% OOA per il calcolo della soglia di spostamento equivalente
|
||||
comando = ['select EventDate, EventTime, HShift, EventTimestamp from ElabDataView where EventDate = ''' ...
|
||||
dataMESE ''' and EventTime >= ''' oraOOA ''' and ToolNameID = ''' DTcatena ...
|
||||
''' and UnitName = ''' IDcentralina ...
|
||||
''' and NodeNum = ''' NodeNum ''' order by EventTimestamp'];
|
||||
Dati1 = fetch(conn,comando); % dati del singolo giorno 30gg prima di OOA
|
||||
comando = ['select EventDate, EventTime, HShift, EventTimestamp from ElabDataView where EventDate > ''' ...
|
||||
dataMESE ''' and EventDate < ''' dataOOA ''' and ToolNameID = ''' DTcatena ...
|
||||
''' and UnitName = ''' IDcentralina ...
|
||||
''' and NodeNum = ''' NodeNum ''' order by EventTimestamp'];
|
||||
Dati2 = fetch(conn,comando); % dati da 30gg prima di OOA fino a OOA
|
||||
comando = ['select EventDate, EventTime, HShift, EventTimestamp from ElabDataView where EventDate = ''' ...
|
||||
dataOOA ''' and EventTime < ''' oraOOA ''' and ToolNameID = ''' DTcatena ...
|
||||
''' and UnitName = ''' IDcentralina ...
|
||||
''' and NodeNum = ''' NodeNum ''' order by EventTimestamp'];
|
||||
Dati3 = fetch(conn,comando); % dati da OOA in avanti
|
||||
|
||||
% il dataset di spostamento inizia dal dato subito PRECEDENTE all'OOA -->
|
||||
% lo inserisco all'inizio e lo tolgo dal dataset mensile
|
||||
dataEV(1,1) = Dati3(end,1);
|
||||
oraEV(1,1) = Dati3(end,2);
|
||||
datasetEV(1,1) = Dati3(end,3);
|
||||
Dati3(end,:) = [];
|
||||
|
||||
% riorganizzo i dati
|
||||
datiMESE = [Dati1; Dati2; Dati3];
|
||||
[rDM,~] = size(datiMESE);
|
||||
for m = 1:rDM
|
||||
tempoMESE{m,1} = strjoin(datiMESE(m,1:2));
|
||||
datasetMESE(m,1) = datiMESE(m,3);
|
||||
end
|
||||
|
||||
%% costruisco il dataset dell'evento critico
|
||||
% A partire da data OOA, scarico tutti i dati disponibili e sfrutto DataNum
|
||||
% per prendere il numero giusto di valori (relativi al dataset
|
||||
% dell'evento)
|
||||
|
||||
comando = ['select EventDate, EventTime, EventTimestamp from ElabDataView where EventDate = ''' ...
|
||||
dataOOA ''' and EventTime >= ''' oraOOA ''' and ToolNameID = ''' DTcatena ...
|
||||
''' and UnitName = ''' IDcentralina ...
|
||||
''' and NodeNum = ''' NodeNum ''' order by EventTimestamp'];
|
||||
DateEV1 = fetch(conn,comando);
|
||||
|
||||
comando = ['select EventDate, EventTime, EventTimestamp from ElabDataView where EventDate > ''' ...
|
||||
dataOOA ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ...
|
||||
''' and NodeNum = ''' NodeNum ''' order by EventTimestamp'];
|
||||
DateEV2 = fetch(conn,comando);
|
||||
|
||||
DateEV_temp = [DateEV1; DateEV2];
|
||||
DateEV = DateEV_temp(1:DataNum,:);
|
||||
|
||||
[rT,~] = size(DateEV);
|
||||
for tmp = 1:rT
|
||||
conta = tmp+1; % aggiungo dopo il primo dato precedente all'OOA
|
||||
dataEV{conta,1} = datestr(DateEV(tmp,1),'yyyy-mm-dd');
|
||||
oraEV{conta,1} = datestr(DateEV(tmp,2),'HH:MM:SS');
|
||||
comando = ['select HShift from ElabDataView where EventDate = ''' ...
|
||||
dataEV{conta,1} ''' and EventTime = ''' oraEV{conta,1} ''' and ToolNameID = ''' DTcatena ...
|
||||
''' and UnitName = ''' IDcentralina ...
|
||||
''' and NodeNum = ''' NodeNum ''' '];
|
||||
datasetEV(conta,1) = fetch(conn,comando);
|
||||
end
|
||||
|
||||
tempmat = [dataEV oraEV];
|
||||
[rDO,~] = size(tempmat);
|
||||
for d = 1:rDO
|
||||
tempoEV{d,1} = strjoin(tempmat(d,:));
|
||||
end
|
||||
durataevento = datenum(tempoEV(end))-datenum(tempoEV(1));
|
||||
|
||||
% array per grafico -> punto OOA
|
||||
timerefEV = [tempoEV{1,:};tempoEV{1,:}];
|
||||
datarefEV = [0; datasetEV(1,1)];
|
||||
|
||||
%% ricavo soglia di spostamento equivalente
|
||||
% soglia basata sugli spostamenti equivalenti calcolati su un periodo
|
||||
% pari a quello in cui si è verificato l'evento critico
|
||||
|
||||
[rDT,~] = size(datasetMESE);
|
||||
[rDS,~] = size(datasetEV);
|
||||
ind = 1;
|
||||
for c = rDS:rDT
|
||||
if ind == 1 % primo dato
|
||||
eqdispMESE(ind,1) = abs(cell2mat(datasetMESE(c,1)) - cell2mat(datasetMESE(ind,1)));
|
||||
tempoeqdispMESE(ind,1) = tempoMESE(c,:);
|
||||
ind = ind +1;
|
||||
else % dati seguenti
|
||||
% controllo che l'intervallo scelto corrisponda alla durata
|
||||
% dell'evento critico
|
||||
dT1 = abs((datenum(tempoMESE(c,1))-datenum(tempoMESE(ind,1)))-durataevento);
|
||||
dT2 = abs((datenum(tempoMESE(c,1))-datenum(tempoMESE(ind-1,1)))-durataevento);
|
||||
dT3 = abs((datenum(tempoMESE(c,1))-datenum(tempoMESE(ind+1,1)))-durataevento);
|
||||
if abs(dT1)<abs(dT2) && abs(dT1)<abs(dT3)
|
||||
% se la durata dell'intervallo scelto è la più
|
||||
% vicina alla durata effettiva dell'evento, gli spostamenti
|
||||
% sono correttamente riferiti a un intervallo di pari durata
|
||||
eqdispMESE(ind,1) = abs(cell2mat(datasetMESE(c,1)) - cell2mat(datasetMESE(ind,1)));
|
||||
tempoeqdispMESE(ind,1) = tempoMESE(c,:);
|
||||
ind = ind + 1;
|
||||
else
|
||||
% se i controlli non sono verificati è possibile che sia
|
||||
% presente un salto temporale nei dati -> non ha senso
|
||||
% calcolare gli spostamenti equivalenti perchè l'intervallo
|
||||
% temporale è differente, i valori vengono quindi segnati e
|
||||
% successivamente rimossi dal calcolo della soglia
|
||||
eqdispMESE(ind,1) = -99;
|
||||
tempoeqdispMESE(ind,1) = tempoMESE(c,:);
|
||||
ind = ind + 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
% calcolo soglia senza valori anomali
|
||||
eqdispMESEth = eqdispMESE(eqdispMESE ~= -99);
|
||||
mediaMESE = mean(eqdispMESEth);
|
||||
varMESE = std(eqdispMESEth);
|
||||
sogliaMESE = (mediaMESE + 3*varMESE)*1000; % soglia spostamento equivalente (mm)
|
||||
|
||||
%%% dati vari per grafici e tabelle
|
||||
|
||||
% valori anomali pari a 0 nei grafici
|
||||
[red,~] = size(eqdispMESE);
|
||||
for s = 1:red
|
||||
if eqdispMESE(s,1) == -99
|
||||
eqdispMESE(s,1) = 0;
|
||||
end
|
||||
end
|
||||
|
||||
datasetTOT = [datasetMESE; datasetEV];
|
||||
tempoTOT = [tempoMESE; tempoEV];
|
||||
[rTOT,~] = size(datasetTOT);
|
||||
ind = rTOT-rDS*2+1;
|
||||
p = 1;
|
||||
for t = rTOT-rDS+1:rTOT % dataset per grafico spostamenti equivalenti
|
||||
eqdispEV(p,1) = abs(cell2mat(datasetTOT(t,1)) - cell2mat(datasetTOT(ind,1)));
|
||||
tempoeqdispEV(p,1) = tempoTOT(t,:);
|
||||
ind = ind+1;
|
||||
p = p+1;
|
||||
end
|
||||
dispEV = eqdispEV(end,1)*1000; %spostamento dell'evento critico
|
||||
tempodispEV = tempoeqdispEV(end,:);
|
||||
|
||||
eqdispTOT = [eqdispMESE*1000; eqdispEV*1000];
|
||||
tempoeqdispTOT = [tempoeqdispMESE; tempoeqdispEV];
|
||||
|
||||
sogliaPLOT = [sogliaMESE; sogliaMESE];
|
||||
temposogliaPLOT = [datenum(tempoTOT(1,:))-20; datenum(tempoTOT(end,:))+20];
|
||||
|
||||
%immagine del livello di attività del sito
|
||||
if LVL == 5 && dispEV < sogliaMESE
|
||||
imglevel = Image('activity1.jpg');
|
||||
elseif LVL == 4 && incrDIPS >= sogliaMESE
|
||||
imglevel = Image('activity2.jpg');
|
||||
elseif LVL == 5 && dispEV >= sogliaMESE
|
||||
imglevel = Image('activity3.jpg');
|
||||
elseif LVL == 1.5 % falso allarme
|
||||
imglevel = Image('activity4.jpg');
|
||||
else
|
||||
imglevel = Image('activity1.jpg');
|
||||
end
|
||||
imglevel.Style = {Height('2.4cm')};
|
||||
|
||||
%% grafici spostamenti e spostamenti equivalenti
|
||||
|
||||
% SPOSTAMENTI
|
||||
figure(1)
|
||||
subplot(2,1,1); % (righe colonne posizione)
|
||||
pbaspect([3 1 1]);
|
||||
disp = plot(datenum(tempoEV),cell2mat(datasetEV),'Color','b','LineWidth',1);
|
||||
hold on
|
||||
month = plot(datenum(tempoMESE),cell2mat(datasetMESE),'Color','b','LineWidth',1);
|
||||
ref = plot(datenum(timerefEV),cell2mat(datarefEV),':','Color','k','LineWidth',0.75);
|
||||
OOA = plot(datenum(timerefEV(2,:)),cell2mat(datarefEV(2,:)),'.','Color','r','MarkerSize',12);
|
||||
dLIM(1,1) = min(cell2mat(datasetMESE));
|
||||
dLIM(2,1) = min(cell2mat(datasetEV));
|
||||
dLIM(1,2) = max(cell2mat(datasetMESE));
|
||||
dLIM(2,2) = max(cell2mat(datasetEV));
|
||||
MIN = min(dLIM(:,1));
|
||||
MAX = max(dLIM(:,2));
|
||||
ylim([MIN-0.01*MIN MAX+0.01*MAX]);
|
||||
xlim([datenum(tempoTOT(1,:))-5; datenum(tempoTOT(end,:))+5]);
|
||||
if TipoDisp == 1
|
||||
sp = 'locali';
|
||||
else
|
||||
sp = 'cumulati';
|
||||
end
|
||||
title(['Spostamenti ' sp ' - nodo ' NodeNum]);
|
||||
xlabel('Data [gg/mm/aaaa]');
|
||||
ylabel('Spostamento [m]');
|
||||
h = gca;
|
||||
h.XAxis.MinorTick = 'on';
|
||||
datetick('x','dd/mm/yy','keepticks','keeplimits');
|
||||
ax = gca;
|
||||
ax.FontSize = 7;
|
||||
grid on
|
||||
grid minor
|
||||
|
||||
% SPOSTAMENTI EQUIVALENTI
|
||||
hold off
|
||||
subplot(2,1,2); % (righe colonne posizione)
|
||||
pbaspect([3 1 1]);
|
||||
eqplot = plot(datenum(tempoeqdispTOT),eqdispTOT);
|
||||
hold on
|
||||
crit = plot(datenum(tempodispEV),dispEV,'.','Color','k','MarkerSize',15);
|
||||
thr = plot(temposogliaPLOT, sogliaPLOT,'--','Color','r','Linewidth',1);
|
||||
xlim([datenum(tempoeqdispTOT(1,:))-5; datenum(tempoeqdispTOT(end,:))+5]);
|
||||
maxincr = max(eqdispTOT);
|
||||
if maxincr >= sogliaMESE
|
||||
ylim([0 maxincr+0.2*maxincr]);
|
||||
else
|
||||
ylim([0 sogliaMESE+0.2*sogliaMESE]);
|
||||
end
|
||||
title(['Spostamenti equivalenti - nodo ' NodeNum]);
|
||||
xlabel('Data [gg/mm/aaaa]');
|
||||
ylabel('Spostamento [mm]');
|
||||
h = gca;
|
||||
h.XAxis.MinorTick = 'on';
|
||||
ax = gca;
|
||||
ax.FontSize = 7;
|
||||
datetick('x','dd/mm/yy','keepticks','keeplimits');
|
||||
grid on
|
||||
grid minor
|
||||
|
||||
TempName = ['AlertReport-' IDcentralina '-' DTcatena '-' tempoinvio '-EqDisp.png'];
|
||||
saveas(eqplot,TempName);
|
||||
ChartDispEq = Image(TempName);
|
||||
ChartDispEq.Style = {ScaleToFit};
|
||||
close(figure(1))
|
||||
|
||||
% immagine legenda per grafici
|
||||
legIMG = Image('legendaSpEq.png');
|
||||
legIMG.Style = {ScaleToFit,OuterMargin('0in','0in','-0.2in','0in')};
|
||||
|
||||
%% Creo tabelle e campi corrispondenti
|
||||
|
||||
% tabella info sito
|
||||
tabsito(1,1) = Paragraph();
|
||||
tabsito(1,1).Style = {FontSize(Font_text),FontFamily(Font_report)};
|
||||
t1a = Text('Sito: ');
|
||||
t1a.Bold = 1;
|
||||
t1b = Text(Sito);
|
||||
append(tabsito(1,1),t1a);
|
||||
append(tabsito(1,1),t1b);
|
||||
|
||||
tabsito(2,1) = Paragraph();
|
||||
tabsito(2,1).Style = {FontSize(Font_text),FontFamily(Font_report)};
|
||||
t2a = Text('Centralina: ');
|
||||
t2a.Bold = 1;
|
||||
t2b = Text(IDcentralina);
|
||||
append(tabsito(2,1),t2a);
|
||||
append(tabsito(2,1),t2b);
|
||||
|
||||
tabsito(3,1) = Paragraph();
|
||||
tabsito(3,1).Style = {FontSize(Font_text),FontFamily(Font_report)};
|
||||
t3a = Text('Array: ');
|
||||
t3a.Bold = 1;
|
||||
t3b = Text(DTcatena);
|
||||
append(tabsito(3,1),t3a);
|
||||
append(tabsito(3,1),t3b);
|
||||
|
||||
tabsito(4,1) = Paragraph();
|
||||
tabsito(4,1).Style = {FontSize(Font_text),FontFamily(Font_report)};
|
||||
t4a = Text(['Nodo (profondit' char(224) '): ']);
|
||||
t4a.Bold = 1;
|
||||
t4b = Text(InfoNodo);
|
||||
append(tabsito(4,1),t4a);
|
||||
append(tabsito(4,1),t4b);
|
||||
|
||||
tabsito(5,1) = Paragraph();
|
||||
tabsito(5,1).Style = {FontSize(Font_text),FontFamily(Font_report)};
|
||||
t5a = Text('Inizio evento: ');
|
||||
t5a.Bold = 1;
|
||||
t5b = Text(data);
|
||||
append(tabsito(5,1),t5a);
|
||||
append(tabsito(5,1),t5b);
|
||||
|
||||
lot1 = Table({tabsito, imglevel});
|
||||
lot1.TableEntriesStyle = {VAlign('middle')};
|
||||
lot1.Style = {ResizeToFitContents(false),Width("100%"),...
|
||||
OuterMargin('0in','0in','0.3in','0in')};
|
||||
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;
|
||||
lot1.ColSpecGroups = grps;
|
||||
|
||||
% tabella info spostamenti evento
|
||||
tabE1(1,1) = Paragraph('Spostamento generato dall''evento [mm]');
|
||||
tabE1(2,1) = Paragraph(num2str((dispEV),'%0.2f'));
|
||||
tabE2(1,1) = Paragraph('Spostamento totale mensile [mm]');
|
||||
tabE2(2,1) = Paragraph(num2str(((cell2mat(datasetEV(end))-cell2mat(datasetMESE(1)))*1000),'%0.2f'));
|
||||
tabE3(1,1) = Paragraph('Soglia di spostamento [mm]');
|
||||
tabE3(2,1) = Paragraph(num2str((sogliaMESE),'%0.2f'));
|
||||
tabE1(1,1).Style ={FontSize(Font_text),Bold(1),HAlign('center'),...
|
||||
Hyphenation(false),FontFamily(Font_report)};
|
||||
tabE1(2,1).Style ={FontSize(Font_text2),HAlign('center'),...
|
||||
InnerMargin('0in','0in','0.2in','0in'),FontFamily(Font_report)};
|
||||
tabE2(1,1).Style ={FontSize(Font_text),Bold(1),HAlign('center'),...
|
||||
Hyphenation(false),FontFamily(Font_report)};
|
||||
tabE2(2,1).Style ={FontSize(Font_text2),HAlign('center'),...
|
||||
InnerMargin('0in','0in','0.2in','0in'),FontFamily(Font_report)};
|
||||
tabE3(1,1).Style ={FontSize(Font_text),Bold(1),HAlign('center'),...
|
||||
Hyphenation(false),FontFamily(Font_report)};
|
||||
tabE3(2,1).Style ={FontSize(Font_text2),HAlign('center'),...
|
||||
InnerMargin('0in','0in','0.2in','0in'),FontFamily(Font_report)};
|
||||
|
||||
lot2 = Table({tabE1, tabE2, tabE3});
|
||||
lot2.TableEntriesStyle = {VAlign('middle')};
|
||||
lot2.Style = {ResizeToFitContents(false),Width("100%"),...
|
||||
OuterMargin('0in','0in','0.3in','0in')};
|
||||
|
||||
%% Inserisco nel report e chiudo
|
||||
add(PG,titolo);
|
||||
add(PG,sottotitolo);
|
||||
add(PG,lot1);
|
||||
add(PG,ChartDispEq);
|
||||
add(PG,legIMG);
|
||||
add(PG,lot2);
|
||||
add(docALRPT,PG);
|
||||
|
||||
close(docALRPT);
|
||||
|
||||
checkALRPT = 1;
|
||||
|
||||
%% Scrivo nel log
|
||||
fileID = fopen(FileName,'a');
|
||||
text = 'AlertReport function worked correctly - Document created!';
|
||||
fmt = '%s \r';
|
||||
fprintf(fileID,fmt,text);
|
||||
fclose(fileID);
|
||||
|
||||
catch err
|
||||
FileErrALRPT = ['ErrorFile-AlertReport-' IDcentralina '-' DTcatena '-' datestr(today) '-' datestr(now,'hhMMss') '.txt'];
|
||||
fid = fopen(FileErrALRPT,'a+');
|
||||
fprintf(fid, '%s', err.getReport('extended','hyperlinks','off'));
|
||||
fclose(fid);
|
||||
|
||||
checkALRPT = 0; % non allego il report nella mail (documento non generato)
|
||||
|
||||
% Email
|
||||
setpref('Internet','E_mail','alert@aseltd.eu');
|
||||
setpref('Internet','SMTP_Server','smtps.aruba.it');
|
||||
setpref('Internet','SMTP_Username','alert@aseltd.eu');
|
||||
setpref('Internet','SMTP_Password','Ase#2013!20@bat');
|
||||
props=java.lang.System.getProperties;
|
||||
pp=props.setProperty('mail.smtp.auth','true'); %#ok
|
||||
pp=props.setProperty('mail.smtp.socketFactory.class','javax.net.ssl.SSLSocketFactory'); %#ok
|
||||
pp=props.setProperty('mail.smtp.socketFactory.port','465'); %#ok
|
||||
|
||||
subject_ITA_ALRPT = ('CRASH Alert Report');
|
||||
message_ITA_ALRPT = cellstr(['La funzione Alert Report ha al proprio interno qualche minchiata '...
|
||||
'per cui crasha nel creare il report di allertamento di ' Sito...
|
||||
', centralin ' IDcentralina ' catena ' DTcatena '. Fate qualcosa vi prego!']);
|
||||
messagealrpt = cellstr('Tanti Blip e Blop a voi, ');
|
||||
message2alrpt = cellstr('Tilt - Alert Report');
|
||||
message_ITA_ALRPT = [message_ITA_ALRPT; messagealrpt; message2alrpt];
|
||||
|
||||
recipients_ASEALRPT{1,1} = 'alessandro.valletta@aseltd.eu';
|
||||
recipients_ASEALRPT{2,1} = 'andrea.carri@aseltd.eu';
|
||||
|
||||
allegatoERR_ALR = FileErrALRPT;
|
||||
|
||||
sendmail(recipients_ASEALRPT, subject_ITA_ALRPT, message_ITA_ALRPT, allegatoERR_ALR)
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user