function RC = RSN(IDcentralina,DTcatena) %%% Programma per l'elaborazione dei dati del Rockfall Safety Network %%% Versione 2.0 del febbraio-giugno 2021 tic RC = 1; %#ok text = ['Elaboration of RSN chain ' DTcatena ' of control unit ' IDcentralina ' started correctly']; d = datestr(datetime,'yyyy_mm_dd'); t = datestr(datetime,'HH_MM_SS'); FileName = ['LogFile_RSN-' IDcentralina '-' DTcatena '-' d '-' t '.txt']; outdat = fopen(FileName,'wt+'); fileID = fopen(FileName,'a'); fmt = '%s \r'; fprintf(fileID,fmt,text); fclose(fileID); %% Parte generale % Associo ID company al relativo DB % Definisco i parametri del Database IDcompany = '1'; % DA INTEGRARE IN VERSIONI FUTURE DB = database_definition(IDcompany,FileName); % Apro la connessione al DB dbname = cell2mat(DB{1,1}); username = cell2mat(DB{2,1}); password = cell2mat(DB{3,1}); driver = cell2mat(DB{4,1}); dburl = 'jdbc:mysql://212.237.30.90:3306/ase_lar?useLegacyDatetimeCode=false&serverTimezone=Europe/Rome&'; conn = database(dbname, username, password, driver, dburl); % scarico Contol Unit ID unitID = IDunit(IDcentralina,conn,FileName); % questa funzione considera la prima data e ora da cui caricare i dati a seconda della catena [date,time,unitID] = datainiziale(DTcatena,unitID,conn,FileName); % funzione che elenca tutti i nodi ed il loro numero presenti per ogni tipo di sensore. [idTool,NodoRSNLink,NodoSS,NodoRSNLinkHR,~,NodoLoadLink,... NodoTriggerLink,NodoGflowLink,NodoGshockLink,NodoDebrisLink] = tipologiaNodi(... DTcatena,unitID,conn,FileName); % funzione che ricostruisce i nodi della catena catena = schema(idTool,conn,FileName); % funzione che attiva/disattiva l'elaborazione per una determinata tipologia di nodo [yesRSN,yesRSNHR,yesSS,yesLL,yesTrL,yesGF,yesGS,yesDL,rRSN,rRSNHR,... rLL,rTrL,rSS,rDL] = YesNo(NodoRSNLink,NodoRSNLinkHR,NodoSS,NodoLoadLink,... NodoTriggerLink,NodoGflowLink,NodoGshockLink,NodoDebrisLink,FileName); % funzione che definisce tutti i parametri importanti a elaborare % un'installazione [NdatiMedia,Ndatidespike,MEMS,tolleranzaAcc,pos_inst,Tmax,Tmin,SEL,... MEL] = Parametri_Installazione(yesRSN,yesRSNHR,yesDL,idTool,conn,FileName); % funzione che carica i dati di calibrazione [DCalRSNTot,DCalRSNHRTot,DCalLLTot,~,yesRSN,yesRSNHR,yesLL,yesDL]... = letturaCal(MEMS,IDcentralina,DTcatena,catena,yesRSN,yesRSNHR,yesLL,yesDL,rRSN,... rRSNHR,rLL,rDL,NodoRSNLink,NodoLoadLink,NodoDebrisLink,conn,FileName); % tipologia di centralina Unit = centralina(IDcentralina,conn,FileName); %% Scarico dei dati % Scarico l'ultima data elaborata: in questo modo far� i calcoli a partire % solo da qualche data prima, per incrementare le prestazioni del software [NuovoZeroRSN,datainiRSN,tempoiniRSN,NuovoZeroRSNHR,datainiRSNHR,tempoiniRSNHR,... DatiElabTriggerLink,NuovoZeroTrL,datainiTrL,tempoiniTrL,DatiElabShockSensor,NuovoZeroSS,... datainiSS,tempoiniSS,NuovoZeroLL,datainiLL,tempoiniLL,datainiGF,tempoiniGF,datainiGS,tempoiniGS,... DatiElabDebrisLink,NuovoZeroDL,datainiDL,tempoiniDL]... = LastElab(conn,date,time,IDcentralina,DTcatena,NdatiMedia,NodoRSNLink,yesRSN,NodoRSNLinkHR,yesRSNHR,... NodoTriggerLink,yesTrL,rTrL,NodoSS,yesSS,rSS,NodoLoadLink,yesLL,yesGF,yesGS,NodoDebrisLink,yesDL,... rDL,Ndatidespike,FileName); % Carico i dati dal database a seconda della catena [Batteria,Batteria_LoRa,Type,DatiRSNLink,ErrRSNLink,DatiRSNLinkHR,ErrRSNLinkHR,DatiTriggerLink,ErrTriggerLink,... DatiShockSensor,ErrShockSensor,DatiLoadLink,ErrLoadLink,DatiDebrisLink,ErrDebrisLink,DatiGFLink,ErrGFLink,... DatiGSLink,ErrGSLink,yesRSN,yesRSNHR,yesTrL,yesLL,yesDL] = lettura(IDcentralina,DTcatena,MEMS,datainiRSN,tempoiniRSN,... NodoRSNLink,NuovoZeroRSN,datainiSS,tempoiniSS,NodoSS,NuovoZeroSS,datainiRSNHR,tempoiniRSNHR,NodoRSNLinkHR,... NuovoZeroRSNHR,datainiTrL,tempoiniTrL,NodoTriggerLink,NuovoZeroTrL,datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,... datainiGF,tempoiniGF,datainiGS,tempoiniGS,datainiDL,tempoiniDL,NodoDebrisLink,yesRSN,yesSS,yesRSNHR,yesTrL,yesLL,... yesGF,yesGS,yesDL,rRSN,rSS,rRSNHR,rTrL,rLL,rDL,conn,catena,date,time,FileName); % Controllo incrociato fra la data iniziale definita da Lettura e la data % iniziale definita da LastElab [DatiElabTriggerLink,DatiElabShockSensor,DatiElabDebrisLink] = checkdata(... yesTrL,yesSS,yesDL,DatiElabTriggerLink,DatiElabShockSensor,DatiElabDebrisLink,... datainiTrL,datainiSS,datainiDL,rTrL,rSS,rDL,tempoiniTrL,tempoiniSS,tempoiniDL,... NodoTriggerLink,NodoSS,NodoDebrisLink,NuovoZeroTrL,NuovoZeroSS,NuovoZeroDL,... IDcentralina,DTcatena,conn,FileName); %% ---Parte di definizione dati--- %% RSN Link if yesRSN == 1 % attiva l'elaborazione dei RSN Link [TimeRSN,accRSN,tempRSN,ErrRSNLink] = defDatiRSN(MEMS,DatiRSNLink,... ErrRSNLink,rRSN,Ndatidespike,FileName); % Conversione dei dati grezzi [accRSN,ris_acc,tempRSN] = conv_grezziRSN(rRSN,accRSN,... tempRSN,DCalRSNTot,MEMS,FileName); % medie [angRSN,ARRAYdateRSN,TempDef_RSN] = MediaDati_RSN(accRSN,TimeRSN,tempRSN,... NdatiMedia,FileName); else ARRAYdateRSN = []; end % Pulisco le variabili che non uso clear DatiRSNLink clear TimeRSN clear accRSN clear tempRSN clear DCalRSNTot %% RSN Link HR if yesRSNHR == 1 % attiva l'elaborazione dei RSN Link HR [TimeRSNHR,angRSNHR,tempRSNHR,ErrRSNLinkHR] = defDatiRSNHR(DatiRSNLinkHR,... ErrRSNLinkHR,rRSNHR,IDcentralina,DTcatena,Ndatidespike,NuovoZeroRSNHR,FileName); % Conversione dei dati grezzi [angRSNHR,T_RSNHR] = conv_grezziRSNHR(angRSNHR,tempRSNHR,DCalRSNHRTot,rRSNHR,FileName); % Media [angRSNHR,ARRAYdateRSNHR,TempDef_RSNHR] = MediaDati_RSNHR(angRSNHR,... TimeRSNHR,T_RSNHR,NdatiMedia,FileName); else ARRAYdateRSNHR = []; end % Pulisco le variabili che non uso clear DatiRSNLinkHR clear TimeRSNHR clear tempRSNHR clear DCalRSNHRTot clear T_RSNHR %% Trigger Link if yesTrL == 1 % attiva l' definizione dei dati dei Trigger Link [ARRAYdateTrL,val_TrL,ErrTriggerLink] = defDatiTrL(DatiTriggerLink,... Type,ErrTriggerLink,rTrL,NuovoZeroTrL,FileName); else ARRAYdateTrL = []; end clear Type %% Shock Sensor if yesSS == 1 % attiva l' definizione dei dati dei Trigger Link [ARRAYdateSS,val_SS,ErrShockSensor] = defDatiSS(DatiShockSensor,... ErrShockSensor,rSS,FileName); else ARRAYdateSS = []; end %% Load Link if yesLL == 1 % attiva l'elaborazione dei Load Link [TimeLL,ADCLoad,ErrLoadLink] = defDatiLL(DatiLoadLink,ErrLoadLink,rLL,Ndatidespike,FileName); % Conversione dei dati grezzi DatiLoad = conv_grezziLL(ADCLoad,DCalLLTot,NodoLoadLink,FileName); % Media [LoadDef,ARRAYdateLL] = MediaDati_LL(DatiLoad,TimeLL,NdatiMedia,FileName); else ARRAYdateLL = []; end % Pulisco le variabili che non uso clear DatiLoadLink clear TimeLL clear ADCLoad clear DCalLLTot clear DatiLoad %% ---Parte di Elaborazione--- %% RSN Link if yesRSN == 1 [AlfaX,AlfaY,TempDef_RSN,ARRAYdateRSN,ErrRSNLink] = elaborazione_RSN(conn,... IDcentralina,DTcatena,MEMS,rRSN,ris_acc,tolleranzaAcc,angRSN,Tmax,Tmin,TempDef_RSN,... NodoRSNLink,ARRAYdateRSN,NuovoZeroRSN,NdatiMedia,Ndatidespike,ErrRSNLink,datainiRSN,... pos_inst,FileName); else [AlfaX,AlfaY,TempDef_RSN,ARRAYdateRSN] = matrici_vuote_RSN(FileName); end clear MEMS clear ris_acc clear tolleranza Acc clear angRSN clear NuovoZeroRSN %% RSN Link HR if yesRSNHR == 1 [AlfaX_HR,AlfaY_HR,TempDef_RSNHR,ARRAYdateRSNHR,ErrRSNLinkHR] = ... elaborazione_RSNHR(conn,IDcentralina,DTcatena,rRSNHR,angRSNHR,Tmax,Tmin,... TempDef_RSNHR,NodoRSNLinkHR,ARRAYdateRSNHR,NuovoZeroRSNHR,NdatiMedia,... Ndatidespike,datainiRSNHR,ErrRSNLinkHR,FileName); else [AlfaX_HR,AlfaY_HR,TempDef_RSNHR] = matrici_vuote_RSNHR(FileName); end clear angRSNHR clear NuovoZeroRSNHR %% Load Link if yesLL == 1 [LoadDef,ErrLoadLink,ARRAYdateLL] = loadcell(LoadDef,ErrLoadLink,... ARRAYdateLL,NuovoZeroLL,NdatiMedia,Ndatidespike,yesRSN,IDcentralina,DTcatena,FileName); else LoadDef = []; end clear NuovoZeroLL %% Elaborazione Trigger Link if yesTrL == 1 if NuovoZeroTrL == 1 cont = 3; [ndate,~] = size(val_TrL); StoricoTrigger = zeros(ndate,rTrL); for n = 1:rTrL StoricoTrigger(:,n) = cumsum(val_TrL(:,n))+cell2mat(DatiElabTriggerLink(1,cont)); cont = cont+3; end else StoricoTrigger = cumsum(val_TrL); end text = 'Trigger Link elaborated correctly'; fileID = fopen(FileName,'a'); fmt = '%s \r'; fprintf(fileID,fmt,text); fclose(fileID); else StoricoTrigger = []; val_TrL=[]; ARRAYdateTrL = []; text = 'Trigger Link has not been elaborated'; fileID = fopen(FileName,'a'); fmt = '%s \r'; fprintf(fileID,fmt,text); fclose(fileID); end clear NuovoZeroTrL %% Elaborazione Shock Sensor if yesSS == 1 if NuovoZeroSS == 1 cont = 3; [ndate,~] = size(val_SS); StoricoShock = zeros(ndate,rSS); ss = 1; while ss <= ndate if val_SS(ss) == 1 && val_SS(ss+1) == 1 && val_SS(ss+2) == 1 val_SS(ss+1) = 0; val_SS(ss+2) = 0; ss = ss+3; else ss = ss+1; end end for n = 1:rSS StoricoShock(:,n) = cumsum(val_SS(:,n))+cell2mat(DatiElabShockSensor(1,cont)); cont = cont+3; end else StoricoShock = cumsum(val_SS); end text = 'Shock Sensor elaborated correctly'; fileID = fopen(FileName,'a'); fmt = '%s \r'; fprintf(fileID,fmt,text); fclose(fileID); else StoricoShock = []; val_SS = []; ARRAYdateSS = []; text = 'Shock Sensor has not been elaborated'; fileID = fopen(FileName,'a'); fmt = '%s \r'; fprintf(fileID,fmt,text); fclose(fileID); end clear NuovoZeroSS %% G-Flow if yesGF == 1 ARRAYdateGF = datenum(DatiGFLink(:,1)); DatiGFLink = cell2mat(DatiGFLink(:,2:end)); else ARRAYdateGF = []; DatiGFLink = []; end %% G-Shock if yesGS == 1 ARRAYdateGS = datenum(DatiGSLink(:,1)); DatiGSLink = cell2mat(DatiGSLink(:,2:end)); else ARRAYdateGS = []; DatiGSLink = []; end %% Scrittura Database database_write(catena,IDcentralina,DTcatena,... AlfaX,AlfaY,TempDef_RSN,ARRAYdateRSN,ErrRSNLink,... AlfaX_HR,AlfaY_HR,TempDef_RSNHR,ARRAYdateRSNHR,ErrRSNLinkHR,... LoadDef,ErrLoadLink,ARRAYdateLL,val_TrL,StoricoTrigger,ErrTriggerLink,ARRAYdateTrL,... val_SS,StoricoShock,ErrShockSensor,ARRAYdateSS,conn,FileName); %% Parte di lancio SW complementari yesMusa = SWSearch(idTool,conn,FileName); try if yesMusa == 1 rilancio = ['/usr/local/matlab_func/run_Musa_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' IDcentralina ' ' DTcatena '']; status = system(rilancio); fileID = fopen(FileName,'a'); fmt = '%s \r'; text = 'Musa relaunch operation executed with success'; fprintf(fileID,fmt,text); fprintf(fileID,fmt,status); fclose(fileID); end catch err FileErr = ['ErrorFile-' IDcentralina '-' datestr(today) '-' datestr(now,'hhMMss')]; fid = fopen(FileErr,'a+'); fprintf(fid, '%s', err.getReport('extended','hyperlinks','off')); fclose(fid); fileID = fopen(FileName,'a'); fmt = '%s \r'; text = 'relaunch operation FAILED'; fprintf(fileID,fmt,text); fclose(fileID); end %% Parte di allertamento % Determino gli utenti da utilizzare in tutte le funzioni successive [Mail,~,~,Users_Report,~,activeEN,~,siteID,NomeSito,~] = Users_Def(IDcentralina,conn,FileName); % Determino alcune informazioni del sito che mi servono nei passaggi % successivi [unitID,chainID,Chain_Scheme,num_nodi,alarms] = Site_Info(siteID,conn,FileName); % Soglie e Trigger SirenON = alert_Levels(IDcentralina,DTcatena,ARRAYdateTrL,ARRAYdateSS,... ARRAYdateRSN,datainiRSN,ARRAYdateRSNHR,ARRAYdateLL,ARRAYdateGF,ARRAYdateGS,SEL,MEL,... val_TrL,val_SS,LoadDef,DatiGFLink,DatiGSLink,rTrL,rRSN,rRSNHR,rLL,yesTrL,yesSS,... yesRSN,yesRSNHR,yesLL,yesGF,yesGS,NomeSito,date,conn,FileName); % Attivazione dispositivi come sirene, semafori, etc. Siren(alarms,datainiSS,datainiTrL,datainiRSN,datainiRSNHR,datainiLL,... tempoiniSS,tempoiniTrL,tempoiniRSN,tempoiniRSNHR,tempoiniLL,ARRAYdateSS,ARRAYdateTrL,... ARRAYdateRSN,ARRAYdateRSNHR,ARRAYdateLL,SirenON,conn,date,time,FileName); % Controllo del Livello della Batteria checkBattery(Batteria,IDcentralina,Unit,Mail,conn,FileName); % Controllo della data di chiusura piattaforma per una determinata centralina checkUnit(IDcentralina,conn,FileName); % Controllo della data di scadenza per una determinata SIM checkSIM(IDcentralina,conn,FileName); % Controllo della data di scadenza della visualizzazione GIS per un % determinato sito checkGIS(siteID,NomeSito,conn,FileName); % Redazione del Report Automatico Report_ASE(IDcentralina,unitID,chainID,alarms,Chain_Scheme,num_nodi,... Users_Report,Mail,time,activeEN,siteID,conn,FileName); % Chiudo connessione al database close(conn) T = num2str(toc); text = ['RSN elaboration completed in ' T '!']; fileID = fopen(FileName,'a'); fmt = '%s \r'; fprintf(fileID,fmt,text); fclose(fileID); RC = 0; end